42

Is there a way to split a window inside Vi/Vim so that one window will be a terminal?

P.S. Solutions like installing new text editors and such will not help me.

JakeD
  • 2,788
  • 2
  • 20
  • 29
nadavgam
  • 2,014
  • 5
  • 20
  • 48
  • 5
    I'd recommend using something like tmux, split the console window, use one split for vim – sudo bangbang Jul 12 '16 at 13:11
  • As far as I know, splitting vim and giving half screen to terminal won't work. Vim is just a editor , dont expect it to be a terminal. – SibiCoder Jul 12 '16 at 13:44
  • 1
    neovim has a terminal in a split. `:help :terminal` – FDinoff Jul 12 '16 at 14:07
  • 3
    @nadavgam It would help us if you explained why you can't use solutions like tmux or screen. These are the natural solutions to problems like this, and will usually produce better results than other solutions (like conque_term). Understanding why you can't use them will help us to suggest something that you can use. – Jonathan Hartley Jul 12 '16 at 15:58
  • Possible duplicate of [How do I run a terminal inside of Vim?](https://stackoverflow.com/questions/1236563/how-do-i-run-a-terminal-inside-of-vim) – D. Ben Knoble Dec 22 '18 at 23:25

6 Answers6

106

In Vim 8, if it is compiled with the +terminal option, you can split the current window horizontally and add a terminal with the command :terminal or :term for short-hand.

enter image description here

If you want to split the window vertically, the best way I know is to do a regular vertical split with :vsp or <c-w>v. Then, split one of the windows to have a terminal window (:term), then finally move to the smaller, non-terminal window and close it.

enter image description here

Edit: ...and literally right after I wrote this I found how to easily vertically split the terminal window...

:vertical terminal

" OR

:vert term

The terminal will open in something similar to insert mode, and pressing <c-w>N will put you in the "normal" mode where you can have regular Vim motions and can run Vim commands. Note that in many shells (I know for sure in Bash and Zsh), you can run set -o vi to be able to hit <c-[> or <esc> and use Vim motions anyways. The best part about that is hitting v when in "normal" mode where the current command is opened in a new Vim instance and is run upon exiting Vim.

JakeD
  • 2,788
  • 2
  • 20
  • 29
12

Maybe adding the string

rightb vert term

or

bel vert term

to your .vimrc (hidden file with editor settings; it is in the user home directory by default: ~/.vimrc) will solve your problem. Thus, if you type vim file_name.txt in terminal emulator, you will get two split windows: on the left side - txt-file, on the right - terminal emulator window.

ps: you can move between split windows with ctrl + double "w" (press "w" two times).

also, from my experience, the "term"-command is not supported in 8.0 vim version, unlike 8.2 version.

uch
  • 139
  • 2
  • 8
10

There's no way to do this without a plugin. Here are a couple of ways to get similar functionality.

  • Use tmux, or another terminal window manager. In response to your P.s., tmux is not another text editor. It just allows you to split your terminal screen, so you would still be using vim for your text editing.
  • You can also run terminal commands and view the output from inside vim. Just run a command, but preface it with an exclamation point. For example, if you run :!ls from within vim, you will see a list of the files in your current directory. Any other commands such as :!pwd or :!git add * will also work. If you want to read the output of a command into your current vim buffer you can use the read command. For example, if you run :read !ls vim will enter a list of the files in your current directory into your current buffer at the cursor position.
lwassink
  • 1,595
  • 13
  • 16
  • 12
    This should no longer be the accepted answer. See the `:vertical terminal` answer from @JakeD at https://stackoverflow.com/a/51403437/406224. – oalders Apr 09 '20 at 16:10
5

For anyone using NeoVim:

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

:vsplit term://bash

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
  • 1
    Note the split window will be in NORMAL MODE, press `i` to enter TERMINAL MODE, and `CTRL+\ CTRL+N` to leave and back to NORMAL MODE – zenoh Jan 23 '22 at 13:21
  • @zenoh true :) , I find that annoying, I use an autocommand to enter terminal mode automatically: https://vi.stackexchange.com/a/36586/40187 – jeffrey.d.m Feb 01 '22 at 08:40
2

The plugin conque_term gives you the possibility to run a shell inside the vim buffer.

BUT I recommend screen linux command which has almost the same behavior as vim (especially the moving commands) when entering the copy mode by executing Ctrl+a Esc

1

No need for extra plugins, just vanilla Vim.

Vim

:term will open a horizontal split with a terminal.

:vert term will open a vertical split with a terminal.

By default, you will be in insert mode and the terminal will behave normally.

Ctrl+(\,n) to go to normal mode in the terminal window, in case you want to yank some output, or change some setting. Read as: Press and hold Control Key, then press back-slash, then press n.

To go back into normal terminal behavior just go back to insert mode, for instance by pressing i in normal mode. To close the terminal just exit the terminal by executing exit command.

Note: there are problems with vim's understanding of a buffer and how the terminal works. For instance, if you close the terminal the split will close. For this reason, for an intense use of the terminal this might not be the best option.

NeoVim

Previous answer still applies but, by default, the terminal will start in normal mode. So you will have to go to insert mode like explained previously.

In case line numbering is visible :set nonu nornu while in normal mode.

johnnybegood
  • 321
  • 3
  • 7