在 VIM 下写 C++ 能有多爽?
我是坚定的 Vim 党,因为和命令行的集成如此之好,Vim 可以解决任何问题。然而在这个世界上,即便是最好用的工具也是需要配置的。 由于最近在写 C++,经过一番配置后,小编写 C++ 已经感到非常爽了,于是决定用一篇文章来记录如何打造一个适合写 C++ 的 Vim 编辑器! 包括 C++ 的自动补全、括号引号匹配、格式化、注释、编译运行快捷键等。
如果你还不了解 Vim 基本操作和配置方法,请参考 Vim 初级:配置和使用。 如果你和 Harttle 一样也做前端开发,可以参考 打造前端开发的 Vim 环境
基础设置
稍微熟悉 Vim 的小伙伴都会知道这个文件 ~/.vimrc
,如同绝大多数的 Unix 软件,Vim 也是用基于文本的配置文件。
当前用户的 Vim 配置便存储在这个文件当中,该文件的每一行便是一个配置项(function
除外)。
配置文件中的所有语句都会在打开 Vim 时,在 Ex 模式下执行。例如,我们在 Vim 中打开行号:
:set number
我们便可以在配置文件中加入:
" ~/.vim
set number
同样重要的配置还有:
- 打开语法高亮:
syntax on
- Tab 大小:
set tabstop=4
- 缩进大小:
set shiftwidth=4
Vim 是一个典型的 Unix 程序,上述命令都有缩写啦:number(nu), tabstop(ts), shiftwidth(sw), etc.
更多关于基础配置项的信息,请参考我的另一篇博客:Vim 初级:配置和使用
自动补全
自动补全恐怕是代码编辑器最重要的特性了,我们暂且不提它毁了多少人的面试之路。
由于 Vim 插件的风格、使用方式太过多样化,多语言的自动补全一直存在各种冲突,需要大量精力才能调通。 然而 Github 的出现给 Vim 插件带来了新的活力,现在我们通过基于 Github 的 Vundle 来安装插件,而不需要手动去 vim.org 上找插件了。
废话少说,我推荐的插件叫做 YouCompleteMe,看图!
YouCompleteMe 功能很全:
- 自动补全,在你写一个名称的过程中,会出现提示列表,同时给出每一项的函数签名(函数形参列表)。
- 语法错误、警告的提示。比如变量未使用、函数未定义等等,很多编译 warning 都会直接提示出来,特别神奇。
配置很容易,但需要先安装 Vundle(如果你没有的话)。注意 vim +PluginInstall
后还需要去 ~/.vim/bundle/YouCompleteMe
中 ./install.sh
一下。
如果你是 MacOS 用户,确保你的 Vim 升级到了 7.4。如何使用 HomeBrew 本文就不唠叨了。
括号/引号匹配
括号和引号的自动补全和智能匹配。例如:
- 输入前大括号补全后大括号
- 在一对括号之间回车,自动分为 3 行并调整缩进
- 输入前引号自动补全后引号
凡此种种。。。我觉的第二条是最实用的功能,尤其是写函数和类的时候。
上述的各种括号、引号匹配都可以用 delimitMate 来解决,官网:
https://github.com/Raimondi/delimitMate
delimitMate 可以通过 Vundle 的形式安装。在 ~/.vimrc
添加 Plugin 'Raimondi/delimitMate'
并 PluginInstall
,重新打开 Vim 后括号就可以自动补全啦!
Formatter
格式化程序对于我们懒人和强迫症用户来讲是非常需要的。Vim 的默认配置中提供了格式化功能, 但显然我们要的更多!比如我希望:
- 前大括号不换行,而后大括号换行
- 所有运算符两边都有空格
- 一键格式化当前文件
- 保存时自动格式化
- …
这里推荐的插件叫做 vim-autoformat,上述的需求都能完美地解决。参照文档安装就好了。
需要注意的是,vim-autoformat 只是格式化程序框架,它依赖于代码风格检查工具来进行格式化。 我们需要单独安装这些工具:astyle、js-beautify 等。这里有完整的列表:https://github.com/Chiel92/vim-autoformat#default-formatprograms。
如果你希望自定义代码风格,可以在 .vimrc
中添加个性化的 formatter:
let g:formatdef_harttle = '"astyle --style=attach --pad-oper"'
let g:formatters_cpp = ['harttle']
let g:formatters_java = ['harttle']
比如我安装了 astyle,这里定义一个 formatter 叫做 harttle。然后,把它设置成 cpp 和 java 的 formatter。
至于 astyle --style=attach --pad-oper
为什么这样写,这是一个 Bash 命令,这些参数你可以去查看 Astyle 的文档。
来一个快捷键 F3 格式化当前文件:
" file: ~/.vimrc
noremap <F3> :Autoformat<CR>
看图!
注释
注释、反注释是代码编辑器的常用操作,我们也可以方便地在 Vim 中设置快捷键。
然而因为不同语言的注释风格不同,我们可能需要在 ftplugin
下写多个配置文件,总之很烦人。
可以引入一个称为 NERD Commenter 的插件:
https://github.com/scrooloose/nerdcommenter
这是一个在社区很火的插件,O(∩_∩)O~。下载后直接复制到 ~/.vim
下面即可。
如果你希望看到它的文档,只需要更新 VIM DOC:
:helptags ~/.vim/doc
此后,按下 \cc
即可注释,\cu
反注释。前面可以加一个行数~
编译/运行
如果你已经能熟练地定义 Vim 快捷键,就不必往下看了。
下面三行分别设置了运行、编译、调试的快捷键,n
表示该快捷键在 normal 模式下起作用;
nore
表示该定义不会递归地传递;<CR>
是回车(carriage return),!
表示执行 Shell 命令。
nnoremap <F5> <Esc>:w<CR>:!g++ -std=c++11 % -o /tmp/a.out && /tmp/a.out<CR>
nnoremap <F7> <Esc>:w<CR>:!g++ -std=c++11 %<CR>
nnoremap <C-F5> <Esc>:w<CR>:!g++ -std=c++11 -g % -o /tmp/a.out && gdb /tmp/a.out<CR>
当然,如果你把上述代码直接添加到 ~/.vimrc
中,所有类型的文件都会拥有上述三个快捷键。
这可能是我们不希望的结果,我们希望每种文件类型的 <F5>
执行自己的运行命令。
这需要进行文件类型识别和定义文件类型插件,请参考我的另一篇文章:感受 Vim 的强大:进阶技巧
继续阅读
Harttle 整理了 完全用 Vim 工作 系列文章, 希望能对新来 Vim 的朋友有所帮助。
本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2015/07/18/vim-cpp.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。