Split windows are one of my favorite features. Many modern editors allow you to see multiple documents on the same screen in a “split window” but very few of them allow you to see different parts of the same document in split windows.
I find this to be incredibly useful when working on large class files. Imagine you’ve got an unfamiliar method defined near the bottom of a file, but it is called from the top of the file. In that case I’ll split the window and put the method in my bottom window for reference while I edit where it’s being called from in the other split, or vice-versa.
In this post I’ll be covering the basics of working with split windows. If you’re interested in learning how to style them visually check out the post on Split Window Aesthetics.
You can split any window horizontally or vertically. This refers to the direction of the dividing line between windows. So, a horizontal split would divide your window into a top and bottom half. A vertical split would divide it left and right. By default the new window will have the same document in it, scrolled to the same place.
Closing one of these split windows is easy. You’ve probably already done it.
:q
or :quit
will quit that window just like any other.
Horizontal Splits
:split
or :sp
splits your window horizontally. The “new” split is the one on the top. If you’d like the new split to be below then add this to your ~/.vimrc
set splitbelow " new horizontal splits are on the bottom
For quicker invocation you can type <CTRL>ws
If you’d like to open a new horizontal split with an empty buffer you can type <CTRL>wn
Vertical Splits
:vsplit
or :vs
splits your window vertically. The “new” split is the one on the left. If you’d like the new split to be the one on the right then add this to your ~/.vimrc
set splitright " new vertical splits are on the right
For quicker invocation you can type <CTRL>wv
If you’d like to open a new verticaal split with an empty buffer you’ll want to use :vnew
. There doesn’t appear to be a key combo to invoke this.
Opening another file in your split
You can open a new split that starts with a different file in it if you pass in
the path to that file as an argument to :split
(or :vsplit
) For example:
:split path/to/awesome.rb
If you don’t know the full path you can open the split without an argument and then use any of the other methods discussed in opening files) to replace the contents with something from another file.
Working with splits
“w” is for window. there are a bunch of commands for working with split windows
that begin with <CTRL>w
Switching between splits
<CTRL>ww
will jump your cursor to the next split.
Resizing splits
The easiest way to resize a split is to move your mouse onto the divider and drag it to where you want it. sadly, that only works in GUI clients. So, how do you do it without a mouse?
<CTRL>w+
(that’s literally hitting control w and then plus) and <CTRL>w-
will increase or decrease the height of a horizontal split.
<CTRL>w<
and <CTRL>w>
will move a vertical split left or right respectively.
If you know how many lines tall you want a horizontal split to be (easy with
relative line numbers) you can tell Vim to resize to exactly that many lines with :resize 12
(or any other number). You can’t screw this up by entering a number that’s
too high or too low. No window will ever have less than 1 line.
Speaking of less than one, and relative line numbers. Care to guess what
:resize -1
does? It makes your window one line shorter. :resize +1
makes
it one taller. I like this better than the <CTRL>w
commands because “I just need
a couple more lines” doesn’t require me to count how many lines there already
are.
To do the same thing for vertical splits you use :vertical resize +12
to
add twelve more columns, or :vertical resize 12
to make it exactly twelve
columns wide. That’s just not fair to vertical split users. I’m sorry. I’ll
leave it as an exercise to the reader to create a vresize
function.
Note that by default horizontal splits are half the height of the current window, and vertical splits are half the width.
equalalways
for more about setting default split sizes.
Moving Between Splits
<CTRL>ww
(control w twice) will move your cursor to the next window. Keep
doing it and it will cycle between all your splits. If you only have two
it’ll just go back and forth.
<CTRL>w
plus a movement command (h
,j
,k
,l
or the arrow keys) will switch
your cursor to that window.
Make it stop!
Want get rid of all the splits but the current one? Move your cursor to the split you want to save and run :only
. For quicker invocation you’ll want the <CTRL>wo
key combo.
More
There are a number of subtle variations you can do with regards to creating
splits. You don’t really need any of it, but you may want it. I would note
that the docs are hidden under :help :split
not :help split
because
split()
is a function for splitting strings and looking up the help without
the colon finds that instead, unlike most everything else in help.