4.2 代码缩进

C/C++ 中的代码执行流由复合语句控制,如 if(){} 判断复合语句、for(){} 循环符号语句等等,这势必出现大量缩进。缩进虽然不影响语法正确性,但对提升代码清晰度有不可替代的功效。

在 vim 中有两类缩进表示法,一类是用 1 个制表符('\t'),一类是用多个空格(' ')。两者并无本质区别,只是源码文件存储的字符不同而已,但,缩进可视化插件对两类缩进显示方式不同,前者只能显示为粗块,后者可显示为细条,就我的审美观而言,选后者。增加如下配置信息:

  1. " 自适应不同语言的智能缩进
  2. filetype indent on
  3. " 将制表符扩展为空格
  4. set expandtab
  5. " 设置编辑时制表符占用空格数
  6. set tabstop=4
  7. " 设置格式化时制表符占用空格数
  8. set shiftwidth=4
  9. " 让 vim 把连续数量的空格视为一个制表符
  10. set softtabstop=4

其中,注意下 expandtab、tabstop 与 shiftwidth、softtabstop、retab:

  • expandtab,把制表符转换为多个空格,具体空格数量参考 tabstop 和 shiftwidth 变量;
  • tabstop 与 shiftwidth 是有区别的。tabstop 指定我们在插入模式下输入一个制表符占据的空格数量,linux 内核编码规范建议是 8,看个人需要;shiftwidth 指定在进行缩进格式化源码时制表符占据的空格数。所谓缩进格式化,指的是通过 vim 命令由 vim 自动对源码进行缩进处理,比如其他人的代码不满足你的缩进要求,你就可以对其进行缩进格式化。缩进格式化,需要先选中指定行,要么键入 = 让 vim 对该行进行智能缩进格式化,要么按需键入多次 < 或 > 手工缩进格式化;
  • softtabstop,如何处理连续多个空格。因为 expandtab 已经把制表符转换为空格,当你要删除制表符时你得连续删除多个空格,该设置就是告诉 vim 把连续数量的空格视为一个制表符,即,只删一个字符即可。通常应将这tabstop、shiftwidth、softtabstop 三个变量设置为相同值;
    另外,你总会阅读其他人的代码吧,他们对制表符定义规则与你不同,这时你可以手工执行 vim 的 retab 命令,让 vim 按上述规则重新处理制表符与空格关系。

很多编码规范建议缩进(代码嵌套类似)最多不能超过 4 层,但难免有更多层的情况,缩进一多,我那个晕啊:

4.2 代码缩进  - 图1(多层缩进)

我希望有种可视化的方式能将相同缩进的代码关联起来,Indent Guides(https://github.com/nathanaelkane/vim-indent-guides )来了。安装好该插件后,增加如下配置信息:

  1. " 随 vim 自启动
  2. let g:indent_guides_enable_on_vim_startup=1
  3. " 从第二层开始可视化显示缩进
  4. let g:indent_guides_start_level=2
  5. " 色块宽度
  6. let g:indent_guides_guide_size=1
  7. " 快捷键 i 开/关缩进可视化
  8. :nmap <silent> <Leader>i <Plug>IndentGuidesToggle

重启 vim 效果如下:

4.2 代码缩进  - 图2(不连续的缩进可视化)
断节?Indent Guides 通过识别制表符来绘制缩进连接线,断节处是空行,没有制表符,自然绘制不出来,算是个小 bug,但瑕不掩瑜,有个小技巧可以解决,换行-空格-退格:
4.2 代码缩进  - 图3(完美可视化缩进)