Folds
Folding methods, fold commands, and workflows for managing code visibility.
Fold Commands
Toggle, open, and close folds
za " toggle fold under cursor (open if closed, close if open)
zo " open fold under cursor
zc " close fold under cursor
zA " toggle fold recursively (all nested folds)
zO " open all folds under cursor recursively
zC " close all folds under cursor recursively
Open and close all folds in file
zR " open all folds in the file (Reduce folding)
zM " close all folds in the file (More folding)
zr " reduce fold level by one (open one level)
zm " increase fold level by one (close one level)
Peek at folded content
zv " open enough folds to reveal cursor line
zx " reapply foldlevel, then zv
Creating Manual Folds
Create and delete manual folds
zf{motion} " create fold over motion (e.g., zf3j = fold 4 lines)
zf " create fold over visual selection (select first, then zf)
zd " delete fold under cursor (not the text — just the fold)
zD " delete folds recursively under cursor
zE " eliminate all folds in the file
Create fold with a range
:5,20fold " fold lines 5 through 20
Fold Methods
Set the fold method
:set foldmethod=manual " create folds by hand with zf
:set foldmethod=indent " fold by indentation level
:set foldmethod=syntax " fold using syntax highlighting rules
:set foldmethod=marker " fold using {{{ and }}} markers
:set foldmethod=expr " fold using custom expression
:set foldmethod=diff " fold unchanged text in diff mode
Check current fold method
:set foldmethod? " display current foldmethod
Fold Level
Control how many levels are open by default
:set foldlevel=0 " close all folds
:set foldlevel=1 " show only top-level folds open
:set foldlevel=99 " open all folds
:set foldlevelstart=1 " foldlevel when opening a file
Fold Markers
When foldmethod=marker, Vim uses {{{ and }}} as fold boundaries.
Marker fold example in a config file
" Settings {{{
set number
set relativenumber
" }}}
" Keymaps {{{
nnoremap <leader>w :w<CR>
" }}}
Custom marker text appears in fold line
" Settings {{{1
The number after {{{ sets the fold level.
Fold Options
Customize fold appearance
:set foldcolumn=2 " show fold indicators in the sign column
:set foldminlines=3 " minimum lines for a fold to be closeable
:set foldnestmax=5 " maximum nesting depth for indent/syntax folds
Fold Expression (Treesitter)
Neovim can use Treesitter for expression-based folding.
Configure Treesitter folding in Lua
vim.opt.foldmethod = "expr"
vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()"
vim.opt.foldlevelstart = 99 -- start with all folds open
Navigating Folds
Move between folds
zj " move to start of next fold
zk " move to end of previous fold
[z " go to start of current open fold
]z " go to end of current open fold