更多分享内容可访问我的个人博客
https://www.niuiic.top/
本文简要介绍一种可能适用于多数人的 vim 代码折叠方案。
需求
简单地说,当不关心的代码量比较大时,寻找想要的代码或者在文件内跳转都会非常吃力,这时把这些不关心的代码折叠起来就成了必要。
方案
首先了解一下 vim 内置的 6 种折叠方案,分别是manual (手动定义折叠)、indent (按缩进折叠)、expr (用表达式定义折叠)、syntax (按语法折叠)、diff (将未修改的折叠)、marker (用标志折叠)。
有一个插件叫 vim-anyfold,可以看作indent 方式的增强版,但是文件较大时速度上让人不太能接受,因此弃用。
本方案使用manual 作为折叠方式,因为这种方式最为灵活。另外为了获得更好的体验,每次进入文件时应当重现上次的折叠。为此,写入如下配置。
有一个插件叫 FastFold,是给折叠过程减负加速的。原理是限制像 syntax 这种自动生成折叠区域的方法更新折叠区域的时机(比如只在保存文件时更新)。对 manual 方式显然没用。
set nofoldenable
set foldmethod=manual
augroup remember_folds
autocmd!
au BufWinLeave ?* mkview 1
au BufWinEnter ?* silent! loadview 1
augroup END
配置就这么多,快捷键也很简单。在可视模式下用zf 创建折叠,然后就可以用za (不对嵌套折叠作用)或者zA (对嵌套折叠作用)切换状态,用zM 关闭所有折叠,用zR 开启所有折叠,用zd 或者zD (同上)删除折叠。
其他需要注意的就一点,就是该模式下创建的折叠区域的标准是首尾两行。也就是说,如果一开始折叠了 2-8 行,现在在中间加了 100 行,那么折叠区域就是 2-108 行。
另外如果要给不同的文件设置不同的折叠方式,可以参考以下配置。
autocmd FileType markdown setlocal foldmethod=manual
总的来说该方案简洁明了易上手,相比其他折叠方式在速度上可能不占优势但胜在灵活。另外形成一定习惯之后,manual 方式的速度相比其他可能只快不慢。比如定义一个类时在填充内部之前先建立一个折叠,对内部的每一个方法同样如此操作。这样比之后再创建折叠需要进行的跳转要简单且快得多。
|