Vim 折叠

作为编辑器之神,Vim 怎么可能没有代码折叠功能呢?但是 Vim 的上手难度极高,想要有顺手的折叠功能可不是一件易事。

目前版本参考官方文档,后面会逐渐加上自己的探索。

Vim 折叠方式

Vim 有 6 种折叠方式:

  1. manual //手工定义折叠
  2. indent //用缩进表示折叠
  3. expr  //用表达式来定义折叠
  4. syntax //用语法高亮来定义折叠
  5. diff //对没有更改的文本进行折叠
  6. marker //用标志折叠

手动折叠

通过手动告诉 Vim 哪些代码块需要折叠来实现功能。
vimrc 中添加如下配置:

set foldmethod = manual

试一试: 把光标置于某一段落内,并键入:

zfap

你将会看到该段落被一行高亮的文本所代替。你已经创建一个折叠了。 zf 是个操作
符,而 ap 是一个文本对象。你可以将 zf 操作符跟任何一个移动命令联用,为所经之处的文本创建一个折叠。 zf 也能在可视模式下使用。

若要再阅读那些文本,可以键入以下命令以打开该折叠:

zo

你还可以用以下命令再关闭该折叠:

zc

所有的折叠命令都以 z 开头。展开你的想像力,这个字母看起来就像一张折叠起来的
纸的侧面。而 "z" 后面可用的字母,由于采用了帮助记忆方法选择,很容易记得住:

    zf      F-old creation (创建折叠)
    zo      O-pen a fold (打开折叠)
    zc      C-lose a fold (关闭折叠)

折叠可以嵌套: 一个含有折叠的文本区可以被再次折叠。例如,你可以折叠本节内每一段
落,然后折叠本章内所有的节。试试看。你将注意到,打开全章的折叠,会将节的折叠还
原得跟以前一样,有些打开,而有些关闭。

假定你已经创建了若干折叠,而现在需要阅览全部文本。你可以移到每个折叠处,并键入
"zo"。若要做得更快,可以用这个命令:

    zr

这将减少 (R-educe) 折叠。相反的操作是:

    zm

这将折叠更多 (M-ore)。你可以重复 "zr" 和 "zm" 来打开和关闭若干层嵌套的折叠。

如果你有一个嵌套了好几层深的折叠,你可以用这个命令把它们全部打开:

    zR

这将减少折叠直至一个也不剩。而用下面这个命令你可以关闭所有的折叠:

    zM

这将增加折叠,直至所有的折叠都关闭了。

缩进折叠

Vim 通过文本的缩进来自动添加折叠,适用于 Python 和大纲。
vimrc 中添加如下配置:

set foldmethod = indent

然后你可以用 zm 和 zr 命令增加和减少折叠。在下面这个例文上很容易看明白:

本行没有缩进
        本行被缩进一次
                本行被缩进两次
                本行被缩进两次
        本行被缩进一次
本行没有缩进
        本行被缩进一次
        本行被缩进一次

注意 缩进多少和折叠深度之间的关系倚赖于 shiftwidth 选项。每个 shiftwidth
选项规定的缩进宽度,在折叠深度上加一。这被称为一个折叠级别。

当你使用 zrzm 命令时,你实际上是在增加或减少 foldlevel 选项。你也可以直接设置它:

:set foldlevel=3

这意味着,所有缩进等于或大于 shiftwidth 三倍的折叠将被关闭。折叠级别设定得越
低,越多的折叠将被关闭。当 foldlevel 为零时,所有的折叠都将被关闭。 zM
foldlevel 设为零。相反的命令 zRfoldlevel 设为文件中最深的折叠级别。

因此,有两种方法开启和关闭折叠:

  • 设定折叠级别。
    这提供了一种极快的 "缩小" 方法来查看文本结构,移动光标,以及重新 "放大" 到具体的文本。

  • 利用 zozc 命令打开和关闭指定的折叠。
    这个方法允许你仅仅打开那些你要打开的折叠,而不影响其它的折叠。

这两种方法可以结合起来用: 你可以先用几次 zm 以关闭大多数折叠,然后用 zo
打开一个指定的折叠。或者,用 zR 打开所有的折叠,然后用 zc 关闭指定的折叠。

但是,当折叠方法 foldmethod 的值为 indent 时,你不能手动定义折叠。因为那样
会引起缩进宽度和折叠级别之间的冲突。

标志折叠

Vim 通过事先添加的标志折叠代码块。
vimrc 中添加如下配置:

set foldmethod = marker

以下列 C 程序片段为例:

    /* foobar () {{{ */
    int foobar()
    {
            /* return a value {{{ */
            return 42;
            /* }}} */
    }
    /* }}} */

请注意,折叠行将显示位于标志之前的文字。这正好用来说明该折叠包含了什么。

令人十分困扰的是,当某些文本行移动后,标志不再正确地配对。这种局面可以利用编号
标志来避免。例如:

    /* global variables {{{1 */
    int varA,varB;

    /* functions {{{1 */
    /* funcA() {{{2 */
    void funcA() {}

    /* funcB() {{{2 */
    void funcB() {}
    /* }}}1 */

每一个编号标志表示一个编号指定级别的折叠的开始。这将使任何较高层次的折叠在此结
束。你可以只用编号标志的开始符定义所有的折叠。只有当你要明确地在另一个开始前结
束一个折叠时,你才需要加一个标志停止符。

语法折叠

Vim 为每一种不同的语言使用一个不同的语法文件。语法文件为文件中各种不同语法项定义颜色。在语法文件中,你可以加入一些带有 "fold" 参数的语法项。这些语法项将定义折叠。
vimrc 中添加如下配置:

set foldmethod = syntax

zc 关闭折叠
zo 打开折叠
za 打开/关闭折叠互相切换

关闭 Vim 默认折叠

当我们选好自动折叠后,打开代码是就会发现 vim 默认把所有代码都折叠了,如果不想要这个选项,可以在 vimrc 添加如下配置关闭默认折叠:

set foldlevelstart=99

折叠插件

vim 默认的折叠配置并不容易上手,对于 C++ 项目来说,vim 自带的语法折叠太过简单,很多地方都不能折叠,而我目前又不想去修改 cpp.vim 语法文件,经过大量搜索,终于找了一个增强版的折叠插件。

插件地址:GitHub 主页

安装

在 .vimrc 合适位置添加如下代码(Vundle 安装):

Plugin 'LucHermitte/VimFold4C'

输入

:PluginInstall

等待安装完成。

使用

跟默认的一致,如果想要进阶,可以去项目主页看看。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容

  • macvim配置 最终效果如下: 系统环境 macos10.12.4 homebrew1.2.1 python3....
    Like_eb56阅读 68,559评论 5 65
  • 目录(?)[-] 关于Vim 1 Vim的几种模式 启动Vim 文档操作 光标的移动 1 基本移动 2 翻屏 3 ...
    SunnyLeong阅读 8,426评论 0 32
  • 曾经在思科的工厂测试系统`KlemTest` (`SUSE`命令行模式)中使用`VI`/`VIM`超过2年半,现在...
    戈多在地狱阅读 1,737评论 1 13
  • 奶奶爱念叨,又比爷爷大四岁,为此,爷爷嫌弃了奶奶一辈子。 爷爷只对奶奶脾气不好,动不动就不理她了,为此,奶奶抱怨了...
    写意人阅读 1,320评论 25 31
  • 不懂事的时候,总想着事情要早点有回应才好,不管付出了多少都希望能够得到相对应的回报。后来,才明白很多事不是你付出了...
    Elainejiamei阅读 527评论 0 0