vim的折叠、智慧缩排

折叠:   

    vim里的折叠命令都以z开头,有6种折叠方式:manual,indent,expr,syntax,diff,marker。其中,manual所最基本的,它的命令是通用的,掌握了manual的基本命令,折叠也就差不多了。要确认折叠功能开启:set foldenable。

    对折叠基本操作(当前光标所在之折叠):za(切换折叠状态),zc(关闭折叠,就是折叠起来),zd(删除折叠),当a、c、d大写时,则动作是递归的。创建折叠是zf结合光标移动命令(将光标放在函数的开括号上,用zf%,可方便的将函数折起来)。z0递归打开折叠。

    折叠里面有个基本概念,即折叠层次,就是设置foldlevel选项的值,zM将foldlevel置0,zm、zr分别使foldlevel递减与递增。foldlevel与indent类型的折叠连用,就算所谓的大纲折叠(set foldmethod=indent),它根据自动缩排shiftsidth的值进行折叠,最外一层的缩排为第0层次,由此往里数,大纲折叠会将foldlevel层次里的缩排折叠起来。这种折叠与zr、zm连用,看代码比较方便。

    :set foldcolumn=n命令定义了左折叠栏的宽度,默认是0。该栏用“|”显示折叠层次。

    :set foldmethod=syntax,即用语法定义折叠,它会将C代码里相应的大括号折叠起来。

缩排

    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

    当粘贴文本时,自动缩排可能会使得文本很乱,只要:set paste,就可粘贴纯文本,不会被缩排,用:set nopasete恢复自动缩排。

### 配置代码折叠Vim 编辑器中配置代码折叠可以通过设置特定选项来实现。为了使代码折叠功能生效,通常需要启用 `foldmethod` 并选择合适的折叠方式。 对于自动识别文件类型的折叠方法,可以将以下配置加入到 `.vimrc` 文件中: ```vim set foldmethod=syntax " 使用语法高亮来进行折叠 ``` 如果希望手动定义折叠区域,则可采用标记符方式进行配置: ```vim set foldmethod=marker " 使用标记符进行折叠 set foldmarker={{{,}}} " 定义起始和结束标志 ``` 另外一种常见的做法是在初始化脚本里指定基于表达式的折叠逻辑: ```vim set foldmethod=expr " 启用表达式计算折叠 set foldexpr=nvim_treesitter#foldexpr() " 利用树形结构解析库nvim-treesitter作为折叠依据 ``` 除了上述全局设定之外,在某些特殊场景下还可以针对具体编程语言调整其默认行为。例如 Markdown 文档支持如下自定义项[^1]: ```vim let g:vim_markdown_folding_disabled = 0 " 开启Markdown文档内部的折叠特性 ``` 通过以上几种途径之一即可完成基本的代码折叠环境搭建工作。值得注意的是,不同的折旧策略适用于不同类型的任务需求;因此建议根据实际应用场景灵活选用最恰当的一种方案。 ### 命令操作 一旦完成了必要的前期准备工作之后,就可以利用一系列快捷指令轻松管理已有的折叠区块了。下面列举了一些常用的交互命令及其作用说明[^5]: - **zf**:创建一个新的折叠区段; - **zF**:从当前位置向前方生成一个新折叠; - **zd/zD**:分别用于移除单层或多级嵌套的现有折叠对象; - **zE**:清除整个视窗范围内的全部折叠状态(仅限于manual/marker模式); - **zo/zc**:展开或者收拢选定位置处的一个折叠单元; - **zM/zR**:一次性关闭或打开所有可见级别的子节点。 掌握这些基础的操作可以帮助用户更高效地浏览复杂项目中的源码片段而不至于迷失方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值