Vim Code Fold


Vim 代码折叠

本文简要介绍一种可能适用于多数人的 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 方式的速度相比其他可能只快不慢。比如定义一个类时在填充内部之前先建立一个折叠,对内部的每一个方法同样如此操作。这样比之后再创建折叠需要进行的跳转要简单且快得多。


文章作者: niuiic
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 niuiic !
评论
  目录