Methods of folding
Vim has several different methods for folding a document. You can read more about them by looking up :help fold-methods
. I don’t want to go into much detail about these different methods, except to say that I’ve found using a custom expression to be the most useful method by far.
For the purposes of the demonstration in this video, I used a markdown file, with the markdown-folding
providing the fold expression. Episode 38 will look at how the markdown folding expression is implemented, here we focus on how to use folding.
Essential folding commands
Top of any Vim folding cheat sheet should be the zi
command, which turns the folding functionality on and off. Here are the folding commands which I use most frequently:
command | effect |
---|---|
zi |
switch folding on or off |
za |
toggle current fold open/closed |
zc |
close current fold |
zR |
open all folds |
zM |
close all folds |
zv |
expand folds to reveal cursor |
I recommend learning these commands first. The za
command is so useful that you may want to consider mapping it to a single keystroke. Steve Losh suggests using this mapping:
nnoremap <Space> za
While za
is great for opening folds, the zc
command is often more suitable when you want to close a fold. If the current fold is already closed, then zc
will close the parent fold.
Navigating the unfolded document
Even when the document is fully unfolded, the fact that Vim knows where the folds start and finish gives us an additional method for moving around.
command | effect |
---|---|
zj |
move down to top of next fold |
zk |
move up to bottom of previous fold |
The custom fold expression adds a whole new layer of semantics, which allows us to rapidly navigate the sections of the document.
More folding commands
Here are some more folding commands:
command | effect |
---|---|
zo |
open current fold |
zO |
recursively open current fold |
zc |
close current fold |
zC |
recursively close current fold |
za |
toggle current fold |
zA |
recursively open/close current fold |
zm |
reduce `foldlevel` by one |
zM |
close all folds |
zr |
increase `foldlevel` by one |
zR |
open all folds |
Chaining folding commands
Vim’s folding commands operate at a low level. Sometimes, we have to chain a couple of these low level commands together to produce the desired result. For example, pressing zMzv
has the effect of closing all open folds apart from the one that the cursor is on (see the video for a demonstration).