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