nadavgam
nadavgam

Reputation: 2412

Is it possible to split a window in Vim/Vi with a terminal?

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.

Upvotes: 53

Views: 55094

Answers (8)

Golam Moula
Golam Moula

Reputation: 858

No one answered this command so I thought I should

:belowright terminal

it says what it does open terminal below

:rightbelow vertical terminal

same way you can open a terminal on the right side vertically

also if you don't use the belowright command or the rightbelow command the opposite will happen as in terminal will be created top and for the second command on the left side.

why i provided these 2 solutions with the rightbelow and belowright command is because they don't shift the code

and then if you want to switch between these 2 or more window panes do ctrl + w + w

note these commands only work in vim and none of the commands in this post work in vi editor

my answer is similer to uch's answer but i also added the below split command

happy coding

Upvotes: 1

John Allsup
John Allsup

Reputation: 1242

This is what I have in my .vimrc:

if has('nvim') 
  nnoremap <C-w><C-t><C-v> :vsplit +term<cr>
  nnoremap <C-w><C-t><C-t> :split +term<cr>
  nnoremap <C-w><C-t><C-y> :term<cr>
else
  nnoremap <C-w><C-t><C-v> :vert term<cr>
  nnoremap <C-w><C-t><C-t> :term<cr>
  nnoremap <C-w><C-t><C-y> :tabnew +term<cr><C-\><C-n><C-w>j:q<cr>i
endif

Upvotes: 1

johnnybegood
johnnybegood

Reputation: 501

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.

Upvotes: 6

jeffrey.d.m
jeffrey.d.m

Reputation: 865

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

Upvotes: 11

uch
uch

Reputation: 169

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.

Upvotes: 15

Jake Dube
Jake Dube

Reputation: 2990

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.

Upvotes: 120

lwassink
lwassink

Reputation: 1691

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.

Upvotes: 8

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

Upvotes: 2

Related Questions