首页 > 代码库 > vim技巧

vim技巧

(一)缩进

vim提供4种缩排,:set indenttype。indenttyep可为autoindent、smartindent、cindent、indentexpr。其中,autoindent与vi的autoindent类似,smartindent则是对其做了点加强,可识别基础C语法,如下:

     a、在{后的下一行

     b、以cinwords选项中包含的关键字开始的行

     c、以}结尾的新行

     d、光标在含}的行上,用大写字母O命令,可向上创建新的一行,自动缩排

    cindent和indentexpr比较适合C程序员。cindent定义了一般C代码里需要的缩排,而indentexpr则威力更强,更灵活,可随意定义自己的缩排风格。cindent的动作由三个选项定义:

    1、cinkeys,定义了一些键盘按键组合,vim遇到它们时会重新估算当前行的缩排,选项里面的值用逗号分隔:如0{,0},0),:,0#,!^F,o,O,e,其中0x表示一行的开头是字符x是,重新估算当前缩排,对于0#,它的缩排距离与前一个#开头的行相同,#define就很方便了;对于冒号,若:是段标签或case语句,则重新估算缩排。!x表示,当按下x键时,重新估算当前行缩排,注意是插入模式下的按键,默认是CTRL+F;o表示当创建任意行时,估算新建行的缩排,无论是插入模式的回车还是命令模式的o命令;O表示在当前行之上创建的新行;e就是else,直到else的最后一个e之前,vim不会识别这种情况。

    此外,cinkeys还有个专用关键字,如=word和=~word,一旦新行中出现匹配字串word,重新估算缩排,=~word与=word相反,即不出现它的话,估算缩排,且忽略大小写。

    2、cinwords,定义了一些关键字,输入这些关键字时,下一行将触发额外的缩排,其默认值是:if,else,while,do,for,switch。这些关键字要分大小写的。

    3、cinoptions,这个选项控制vim在C的上下文中重新缩排文本行的行为。:set cinoptions=选项值,它的选项值比较多,下面列举一些常用的。

          fn,{n,设置方式为:set cinoptions=fn,{n,fn是定义了非嵌套的花括号"{"的缩排距离,默认是0,{与f的行为同,只是它套用到嵌套的开始花括号"{",默认也是0。

          }n,定义结尾的花括号"}"的偏移量,默认为0。

          :n,=n,bn,这三个控制case语句的缩排,:n使得vim将case的标签缩排n个字符(从对应的switch语句开始计算),默认是一个shiftwidth,=n是的case下的行相对于case的缩排,默认是shiftwidth,bn定义了break语句的位置,默认是0,即与相应的case对齐。

          )n,*n,这2个设置扫描行数,)n设定vim寻找非结尾括号的行数,默认是20,*n是设置寻找为结束的注释扫描行,默认是30。

          cinoptions已经有比较全的默认值了,基本不用我们修改。

总结:cinkeys和cinwords定义了触发vim重新估算缩排的键和动作,vim则是根据cinoption里的设定来进行或重新进行缩排

    indentexpr的设置回覆盖cindent。目录$VIMRUNTIME/indent下,有很多编程语言对应的缩排格式文件,在.vimrc文件中载入它们便可用了。关闭缩排的命令式:filetype indent off

(二)折叠

1. 折叠方式

可用选项来设定折叠方式:

可在Vim 配置文件中设置 set fdm=XXX
可直接在文件中使用注释调用vim命令 /* vim: set fdm=XXX: */

有6种方法来选定折叠:

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

注意,每一种折叠方式不兼容,如不能既用expr又用marker方式,我主要轮流使用indent和marker方式进行折叠。

使用时,用 set fdm=marker 命令来设置成marker折叠方式(fdm是foldmethod的缩写)。
要使每次打开vim时折叠都生效,则在.vimrc文件中添加设置,如添加:set fdm=syntax,就像添加其它的初始化设置一样。

2. 折叠命令

选取了折叠方式后,我们就可以对某些代码实施我们需要的折叠了,由于我使用indent和marker稍微多一些,故以它们的使用为例:如果使用了indent方式,vim会自动的对大括号的中间部分进行折叠,我们可以直接使用这些现成的折叠成果。

在可折叠处(大括号中间):

1
2
3
4
5
6
7
8
zc     折叠
za       切换折叠和非折叠
zC     对所在范围内所有嵌套的折叠点进行折叠
zo     展开折叠
zO     对所在范围内所有嵌套的折叠点展开
[z     到当前打开的折叠的开始处。
]z     到当前打开的折叠的末尾处。
zj     向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
zk     向上移动到前一折叠的结束处。关闭的折叠也被计入。

当使用marker方式时,需要用标计来标识代码的折叠,系统默认是{{{和}}},最好不要改动

我们可以使用下面的命令来创建和删除折叠:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
zf       创建折叠,比如在marker方式下:                  
         zf56G,创建从当前行起到56行的代码折叠;                  
         10zf或10zf+或zf10↓,创建从当前行起到后10行的代码折叠。                  
         10zf-或zf10↑,创建从当前行起到之前10行的代码折叠。                  
         在括号处zf%,创建从当前行起到对应的匹配的括号上去((),{},[],<>等)。
 
zd      删除 (delete) 在光标下的折叠。
        仅当 ‘foldmethod‘ 设为 "manual" 或 "marker" 时有效。
 
zD      循环删除 (Delete) 光标下的折叠,即嵌套删除折叠。
        仅当 ‘foldmethod‘ 设为 "manual" 或 "marker" 时有效。
 
zE      除去 (Eliminate) 窗口里“所有”的折叠。
        仅当 ‘foldmethod‘ 设为 "manual" 或 "marker" 时有效。
zr/R     打开
zm/M   关闭

vim技巧