237

I am working on split (using ^w+v, ^w+s) buffers, but sometimes I would like to widen a current split or change its height. How can I achieve that?

Nebril
  • 3,427
  • 4
  • 16
  • 13

6 Answers6

350

There are several window commands that allow you to do this:

  • Ctrl+W +/-: increase/decrease height (ex. 20<C-w>+)
  • Ctrl+W >/<: increase/decrease width (ex. 30<C-w><)
  • Ctrl+W _: set height (ex. 50<C-w>_)
  • Ctrl+W |: set width (ex. 50<C-w>|)
  • Ctrl+W =: equalize width and height of all windows

See also: :help CTRL-W

Shadoath
  • 258
  • 3
  • 10
Doorknob
  • 15,237
  • 3
  • 48
  • 70
  • 12
    Might also be worth noting that the 3rd and 4th options can take no count to resize to the maximum height/width. – Michael come lately Dec 02 '16 at 15:27
  • on windows, Cygwin, vim : when you vimdiff -o bigfile1.bash bigfile2.bash : ctrl-w = : opens a MiniBufExplorer 3rd window on top (and the 3 windows are now equal in size), and closing that one makes the first .bash file's window 2 timse bigger than the 2nd .bash file window. Same operation with 2 .vim files gives same results. :( Same with vim -o – Olivier Dulac Oct 25 '17 at 17:03
  • Asking for shortcut for the first two options https://vi.stackexchange.com/questions/16786/vim-split-horizontal-resize-shortcut – KcFnMi Jul 18 '18 at 11:43
  • @Michael: It doesn't work, I have to put a large constant like 200 before them to maximize the window. – NeoZoom.lua Apr 03 '21 at 04:30
  • @job_start I don't know what to tell you. I wrote a script using it in 2016, and it's still in use today with no complaints. execute "norm! \<c-W>_" – Michael come lately Apr 03 '21 at 19:42
  • The documentation says "Set current window height to N (default: highest possible)." – Michael come lately Apr 05 '21 at 13:03
83

You can also use the resize commands:

  • :resize [+-]N - resize a horizontal split, increasing or decreasing height by N characters.
  • :vertical resize [+-]N - resize a vertical split, increasing or decreasing height by N characters.
  • :resize N - resize a horizontal split, setting height to N characters.
  • :vertical resize N - resize a vertical split, setting width to N characters.

These are equivalent to the Ctrlw commands. See :help window-resize.

muru
  • 24,838
  • 8
  • 82
  • 143
  • Similar to: http://vim.wikia.com/wiki/Resize_splits_more_quickly – FilBot3 Nov 27 '18 at 15:43
  • 1
    I am so happy I finally found the easiest way to do this is resize command. Control commands are a menace, I keep playing ping pong without resizing any frame with it.. thank you @muru – nitinr708 Mar 10 '20 at 14:55
57

This is one of the few reasons I like to use vim's mouse mode.

If you use the GUI version, or your terminal supports sending drag events (such as xterm or rxvt-unicode) you can click on the split line and drag to resize the window exactly where you want, without a lot of guess work using the ctrl-w plus,minus,less,greater combinations.

In terminal versions, you have to set mouse mode properly for this to work

:set mouse=n

(I use 'n', but 'a' also works)

and you have to set the tty mouse type

:set ttymouse=xterm2

A lot of people say that a lot of time is wasted using the mouse (mostly due to the time it takes to move your hand from the keyboard to the mouse and back), but I find that, in this case, the time saved by having immediate feedback while adjusting the window sizes and the quickness of re-resizing (keep moving the mouse instead of typing another key sequence) outweighs the delay of moving my hand.

chocolateboy
  • 103
  • 3
John O'M.
  • 8,552
  • 2
  • 42
  • 58
  • 12
    I couldn't agree more, I found in Gnome-terminal :set mouse=n is enough, but to enable when inside tmux :set ttymouse=xterm2 is needed. – the_velour_fog Nov 26 '15 at 03:17
  • 1
    Absolutely true, I love keyboard, but this kind of things are better with mouse. – calbertts Jun 26 '17 at 15:28
  • 2
    Totally agree with "but I find that, in this case, the time saved by having immediate feedback while adjusting window sized and the quickness of re-resizing (keep movving the mouse instead of typing another key sequence) outweighs the delay of moingmy hand.". – Sarfaraz Nawaz Apr 09 '19 at 02:46
9

Seems no one mentioned z{nr}<CR>.

If you :h ^w_, then will see z{nr}<CR> just below it, which have same effect as CTRL-W_.

If you do not need z= for spell check, and added below to .vimrc,

" vertical resize, z0<CR> minimize, z= equalize, z99<CR> maximize.
nnoremap z= <C-w>=

Then for change window height:

  • z0<CR> to minimize height of current window
  • z99<CR> to maxmize height of current window
  • z= to make them all equal
qeatzy
  • 960
  • 9
  • 18
  • 5
    this use of z is a little unintuitive. I think we should stick to C-W mappings. It's nice to know what's out there though. – 3N4N May 21 '18 at 03:32
9

Resize splits more quickly

You can use the :resize command or its shortcut :res to change the height of the window. To change the height to 60 rows, use:

:resize 60

You can also change the height in increments. To change the height by increments of 5, use:

:res +5
:res -5

You can use :vertical resize to change the width of the current window. To change the width to 80 columns, use:

:vertical resize 80

You can also change the width in increments. To change the width by increments of 5, use:

:vertical resize +5
:vertical resize -5
galian
  • 191
  • 1
  • 2
  • 1
    This is very unlikely to be Resize splits more quickly, unless these commands are bound to keybindings, which has been done out of the box – 3N4N May 21 '18 at 03:34
  • Don't entirely agree Enan's statement. I like this answer imho – craft Dec 23 '18 at 14:53
3

For some reason (likely a plugin) the standard C-w > (etc.) did not work in my ~/.vimrc.

These .vimrc additions worked (Ctrl-Shift-Left ... where Left | Right = left and right arrow keys, respectively.

" noremap <silent> <C-S-Left> :vertical resize +5<CR>
" noremap <silent> <C-S-Right> :vertical resize -5<CR>
noremap <silent> <C-S-Left> :vertical resize +1<CR>
noremap <silent> <C-S-Right> :vertical resize -1<CR>
  • I just tried this and got an error message when trying C-S-Left: "E16: Invalid range". – Magnus Jun 15 '20 at 14:11
  • @Magnus : just looked at my ~/.vimrc : as above. Tested on :vs in Vim 8.2 (Linux system): works. Perhaps you have an error in your lines (or some other issue)? https://imgur.com/gallery/h7lGYhK – Victoria Stuart Jun 15 '20 at 15:14