19

When I'm working with lets say 4 files, all are open in tabs(VIM). I want to save the changes and compile it without having to close the tabs, i.e I want to open a terminal in new tab along with the existing 4?

How should I do this in VIM?

theblackpearl
  • 1,164
  • 3
  • 15
  • 34

6 Answers6

29
:tab ter

opens a terminal in a new tab instead of opening it in a new window as :ter does. You can also use the equivalent, longer :tab terminal form.

Credits to user wolloda in this Reddit post.

Extra information

  • Terminating the shell with Ctrl-d or exit closes the terminal buffer.

  • Ctrl-w N or Ctrl-\ Ctrl-n put the buffer in the terminal-normal mode: Keystrokes are not forwarded to the shell, but are used by Vim as in a normal buffer (although the shell job is still running). Then you can use gt to change tabs, type Ex commands such as :ls, etc. To bring the terminal buffer back to life, i, a, ...

  • If you are going to map this, I recommend using :tab ter++kill=hup, so that when you :qa the terminal job does not prevent Vim from quitting. And this is the signal normal terminal emulators send to its jobs when closed anyway.

  • For terminal mode mappings, use tnoremap, for example

    tnoremap <S-Tab> <C-W>:tabprevious<CR>
    tnoremap <C-N>   <C-W>N
    

More information on :help :terminal and :help :tab.

Quasímodo
  • 3,812
  • 14
  • 25
  • `nmap :tab terA` <- I added this mapping in my vimrc. When I open terminal using `:tab ter` in neovim, the terminal opens in new tab, but is not ready to take input. For this, I added the `A` at the end of the command (inssert end of line). Now I just need to press twice (my leader is set to space) to open terminal in new tab. – Ayush Mandowara Feb 06 '21 at 12:20
7

In 2019, vim now has a Terminal mode.

:help terminal

For example, you can use it like this.

# go to terminal-job mode
:terminal

# go to terminal-normal mode
ctrl-w N

# go back to terminal-job mode
i

# open terminal in new tab
:tab terminal
425nesp
  • 6,936
  • 9
  • 50
  • 61
3

A more vim like way of doing this would be to use :make

:make

  • :make will execute the 'makeprg'. It defaults to make which is great of C projects
  • After running :make the quickfix list will be contain any errors.
  • Set your compiler via the :compiler command.
  • Extra parameter can be passed like so :make foo-command
  • Current filename can be represented by %. e.g. :make %

quickfix list

  • Use :cnext and :cprev to move between your errors.
  • :copen to open up the quickfix list in a window (:cclose to close)
  • :cwindow to open quickfix list window only if there are errors
  • May want to use better mappings for :cnext and friends. I suggest Tim Pope's unimpaired plugin

Alternatives and Plugins

  • Just use <c-z> to suspend vim and run your build system. (Cons: loose out on the quickfix list)
  • Use :! to compile. (Same cons as suspending) e.g. :!make
  • Syntastic is a syntax checking system that checks files on save
  • Dispatch can be used to run things in the background. Great for test suites
  • As @brettanomyces mentioned you may want to consider terminal multiplexers like tmux or screen.
  • SingleComplile tries and takes some of the work out of using :make

Conclusion

If you are just starting out I would suggest you learn how to use :make and the quickfix list. There is a nice Vimcast episode that intros the quickfix list: Search multiple files with :vimgrep. Additionally Syntastic is a great way to get up and running with linters quickly.

Aside about tabs

Vim's tabs are not like most text editors tab. They are more like viewports into a group of windows/splits. Additionally, Vim is buffer centric, not tab centric like most editors. Therefore using features like the quickfix list is often easier without tabs (See :h 'switchbuf if you must use tabs). Vim's tabs often get in the way of using a splits as there are better window and buffer navigation commands available. I personally have many files open (sometimes 100+) use no tabs and use on average 1-2 splits without any issue. Bottom line: Learn to use buffers effectively.

For more help see the following:

:h :make
:h 'makeprg
:h quickfix
:h :cnext
:h :cope
Community
  • 1
  • 1
Peter Rincker
  • 43,539
  • 9
  • 74
  • 101
2

Vim 8.1 now has a built in terminal that can be opened with the :term command. This provides much more complete integration with the rest of the Vim features.


Original Answer:

I would suggest looking at tmux or screen. I use tmux myself and along with vim-tmux-navigator moving between the terminal and vim is very easy.

Brett Y
  • 7,171
  • 1
  • 28
  • 42
1

For anyone using NeoVim:

The highest voted answer uses :tab ter. This doesn't work on NeoVim (at least for me). However, it's still fairly simple:

:tabe term://bash

tabe is open a new tab and edit file.

term:// is a NeoVim way of opening a terminal

bash is the kind of shell you want to use (e.g. I use zsh, so my command is actually :tabe term://zsh)

Some helpful commands that I created:

" open terminal
if has('nvim')
    command Terminal vsplit term://zsh
    command TerminalTab tabe term://zsh
else
    command Terminal vert term
    command TerminalTab tab ter
endif
jeffrey.d.m
  • 616
  • 8
  • 23
0

Another way

Ctrl-w :

That gets me to the command line, then one can enter tablast tabnext or tabprevious

or the short versions tabl, tabn, tabp

Or this way:

Ctrl-w gt and Ctrl-w gT (Next tab and Previous Tab)

Or Ctrl-w Number gt (for a specific tab)

That works too.

bobbee
  • 1
  • 1