前言
其实仔细想想, 现在的情况,IDE已经很好用了, 为什么还要使用Vim呢 ? 在我看来,其实是一方面是Geek风范, 另一方面是喜欢简单, 便捷的应用工具, 正应了UNIX的哲学: KISS
关于Vim如何使用的等等, 我们在这里不再详述, 前人之述备矣,
我主要是来介绍一下, Crow-Vim, 相当好用的Vim配置. (好吧, 这其实就是我写的, 自吹自擂). 默认读者已经掌握了Vim的基本使用, 以及各种常用的快捷键. (C-w起码得知道是什么吧,同时揶揄一下对面的脚踏板)
此Vim配置, 在编写时, 主要借鉴了:
Vimplus {补全基于ycm} vim-deprecated {补全基于Omicompation}
上面也都是十分不错的配置, 前者足够丰富, 后者足够实用. (这么一说, 我的配置特色在哪里啊 2333)
不过, 虽然是个VegeCoder, 心里还是想用起来自己的配置. 于是在之前学习过VimScript之后, 进行了Crow-Vim的编写 (叫开发都是夸大了说的…)
安装
$ git clone https://github.com/Evil-crow/Crow-Vim
$ cd Crow-Vim
$ ./install.sh
其实只需要上面三步就足够了.
注:
-
因为涉及插件也不少,其中比较关键的是: Vim version >= 7.4 (是的, 因此,我给xm配置的时候, 重新编译安装了Vim, 即是说: CentOS, 都得重新编译Vim 有的时候, 选一个活跃的发行版本还是不错的, “稳定的”也不一定好)
-
Emmm,其实上面这三步, 只要你是比较新的发行版, (Ubuntu > 14, Fedora > 22为例),基本安装应该是没问题的. 目前Fedora, Ubuntu, Arch, CentOS(在重新编译安装Vim后)已经成功通过安装脚本的测试. 如果仍然有问题出现, 请提出issue, 或者gmail发邮件给我,皆可.
配置介绍
在写配置之前, 我也见过混乱如斯的配置, 所以进行了分块配置. 主要有下面几个模块的配置:
- General Setting 涉及: 文件类型检测, 语法高亮, 历史行数等内容
- Display Setting 涉及: 缩进字符数(后面有其他办法), 高亮当前行/列, 以及相当重要的
smarttab
- Mapping Setting 涉及: Esc, 0, $, >, < 等等几个快捷键的非递归映射
- Indent Setting 涉及: 缩进格式 (不过被后面的插件替代掉了)
- Autocmd Setting 涉及: Vim的自动命令内容, 自行根据文件类型来进行设置缩进格式
- NewFile Setting 涉及: 这个是模仿别人的函数, 根据文件类型, 生成新文件模板(好多文件后面没用过)
- Vundle Setting 涉及: 神级插件: Vundle的配置 (这是用来管理其他插件的插件)
- 7的扩展部分, 各个插件的配置内容
我们涉及到的插件,主要有下面这些:
Plugin 'VundleVim/Vundle.vim' " 插件管理器
Plugin 'scrooloose/nerdtree' " 文件目录树
Plugin 'majutsushi/tagbar' " Taglist的后继者
Plugin 'vim-airline/vim-airline' " 美化的状态栏
Plugin 'vim-airline/vim-airline-themes' " airline基础上的主题
Plugin 'scrooloose/nerdcommenter' "
Plugin 'jiangmiao/auto-pairs' " 自动补全括号
Plugin 'Valloric/YouCompleteMe' " 神级补全插件
Plugin 'SirVer/ultisnips' " 代码片段, 不过被ycm摁死了
Plugin 'Yggdroot/indentLine' " 缩进会显示标记
Plugin 'vim-scripts/Conque-GDB' " 超好用的cgdb (官方插件)
Plugin 'vim-scripts/Conque-Shell' " 超好用的集成终端 (官方插件)
下面的配置方法, 主要涉及插件配置, 对于其他Vim配置, 有比较详细的注释.(可以根据需求修改)
Vundle
插件github仓库 Vundle 我们只要将插件的地址, 穿插在
call vundle#begin()
...
call vundle#end()
之间即可. 我们可以在Vim的Command-Line模式中, 使用 :BundleInstall
, :BundleList
, :BundleUpdate
, :BundleClean
等命令 即可完成插件的安装, 列出, 更新, 删除各种操作
NerdTree
这是个描述文件结构的插件, 描述起来也比较麻烦, 一张图描述吧 左边的结构即为, NerdTree, 可能不用我说, 你都明白什么意思了吧 在.vimrc中, 我将此功能映射到了< F2 >上
Tagbar
可能很多人挺说到过Taglist, 也是个神级插件.不过它存在一些问题, 比如查找速度慢什么的 Tagbar进行了性能优化, Tagbar可以进行本文件内中的标识, 符号索引, 还是来看一张图吧 在.vimrc中, 我将此功能映射到了< F4 >上
Conque-GDB
还在为GDB和代码分开而烦恼吗 ? 还在自己使用Vim的时候, 羡慕别人IDE, 一般看代码, 一边调试吗 ? Conque-GDB就是你的福音
这个算是GDB的前端, 此插件,将此与Vim集成, 我们可以在Vim中一边写代码, 一边调试了, 是不是想想就美滋滋
具体配置涉及:
"Conque GDB
let g:ConqueGdb_SrcSplit = 'above'
let g:ConqueGdb_SaveHistory = 1
let g:ConqueGdb_Leader = ',' " Leader是Vim支持繁多快捷键的重要原因
let g:ConqueTerm_Color = 1
let g:ConqueTerm_CloseOnEnd = 1 " 在Vim退出时, 关闭CGDB
let g:ConqueTerm_StartMessages = 1 " 打开初始调试信息
nnoremap <Leader>cgdb :ConqueGdb a.out<cr><esc><C-w><C-w>
nnoremap <silent> <Leader>Y :ConqueGdbCommand y<CR>
nnoremap <silent> <Leader>N :ConqueGdbCommand n<CR>
其中记得两件事:
- cgdb使用前, 一定要编译degub版本
- 安装 debuginfo glibc-xxxxx.x86_64
之后, 们可以这样使用它:
<leader>cgdb
打开cgdb
之后, 使用 < leader > + b(breakpointer) / r(run) / s(step) / n(next)… 进行调试, 当前行会高亮显示, (不过, 我自己的配色是透明, 所以不明显)
解释一下: nnoremap <silent> <Leader>Y :ConqueGdbCommand y<CR>
这个映射指: 当你在代码中调试的时候, 遇到确认事件的时候, 如何不切回CGDB进行确认 ,使用快捷映射
另外注意:当你的程序一直运行的时候, 需要切入GDB查看结果, 他不会自动刷新的, 单步例外
Conque-shell
这个是我个人最喜欢的插件 ! ! ! 之二
此前一直羡慕IDE中, 可以在代码页面集成终端,知道有一天遇到了Conque-shell. 是的, 说的简单点就是: Vim中的集成终端
同Conque-GDB: 这个东西不会自动刷新,比如你make
, dnf
的时候 不多说, 上图吧!
使用<leader>shell
来启动Conqueshell
YouCompleteMe
其实最开始促使我想自己使用Vim配置的原因便是: 没有性能足够的补全插件 是的, 没错 (虽然是为了偷懒, 不过换句话说, 就是为了更高的生产力)
项目主页 YouCompleteMe
对于ycm, 它的主页已经有足够详细的描述了. 我来说说本地化配置吧.
"YouCompleteMe
let g:ycm_server_python_interpreter='/usr/bin/python'
let g:ycm_python_binary_path = '/usr/bin/python3'
if expand("%:e") == 'c'
let g:ycm_global_ycm_extra_conf='/usr/src/kernels/4.18.18-100.fc27.x86_64/.ycm_extra_conf.py'
endif
if expand("%:e") == 'cpp'
let g:ycm_global_ycm_extra_conf='/usr/src/kernels/4.14.16-300.fc27.x86_64/.ycm_extra_cpp_conf.py'
endif
if expand("%:e") == 'cc'
let g:ycm_global_ycm_extra_conf='/usr/src/kernels/4.14.16-300.fc27.x86_64/.ycm_extra_cpp_conf.py'
endif
if expand("%:e") == 'hpp'
let g:ycm_global_ycm_extra_conf='/usr/src/kernels/4.14.16-300.fc27.x86_64/.ycm_extra_cpp_conf.py'
endif
" 设置补全索引, (! ! !)
let g:ycm_semantic_triggers = {
\ 'c' : ['->', '.','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],
\ 'cpp,objcpp' : ['->', '.', '::','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],
\ 'perl' : ['->'],
\ 'php' : ['->', '::',' '],
\ 'cs,java,javascript,typescript,d,python,perl6,scala,vb,elixir,go' : ['.',' '],
\ 'ruby' : ['.', '::',' '],
\ 'lua' : ['.', ':'],
\ 'erlang' : [':'],
\ }
let g:ycm_confirm_extra_conf=0
let g:ycm_collect_identifiers_from_tags_files=1
let g:ycm_min_num_of_chars_for_completion=2
let g:ycm_cache_omnifunc=0
let g:ycm_seed_identifiers_with_syntax=1
let g:ycm_complete_in_comments = 0
let g:ycm_complete_in_strings = 1
let g:ycm_collect_identifiers_from_comments_and_strings = 0
let g:syntastic_cpp_compiler_options = ' -std=c++11 -stdlib=libc++'
其实大概看看就能看懂. 安装的话, install.sh
有细致过程, 可以看看
关于.ycm_global_ycm_extra_conf
的配置, 其实人云亦云 我简单地说一下: 就是在flags = [...]
中添加自己的目录 比如:
然后,在.vimrc中指定配置文件即可
这样你就会获得下面这种程度的补全. 而且, ycm是真正意义上的智能补全.
存在问题及其他建议
存在问题
虽然是自己写出来的, 不过存在的问题还是要指出来:
- 配色并不是很好看 (虽然是个工具罢了, 不过好看才能激发人的干劲)
<leader>
的设置, 是个人喜好, 使用者可以根据自己的需求进行修改- ycm/Conque-gdb等等一系列的内容, 其实更主要的还是, 给C/C++配置使用的, 对其他语言并没有补充, 只能依靠Vim自身提供的功能进行使用
- 其实VimScript写的并不够好看, 仅仅也只是能用, 如果有大牛能够review代码就相当好了 (想想罢了)
- 待补充
其他建议
因为Vim配置这种东西, 个性化想当强, 所以我个人的建议是:
- 可以多多去给自己映射一些常用的快捷键. 虽然Vim本身提供了丰富的快捷键, 但是, 是真的需要时间适应(
即: 反人类) - 收拾收拾配色吧, 好看了也可以给我用用, 虽然Molokai我觉得还不错
- 关于ycm, 对于自定义项目, 需要在项目project根目录下 防止索引文件, 以此来进行索引. 如果到了这一步, 其实有时候, 还是推荐
上IDE吧
个人一点想法
做技术, 肯定是效率第一. 挺讨厌什么XX党, YY派, ZZ营什么的. 只要能完成任务,实现需求都是好工具 (虽然, 本人diss 脚踏板 以及 窗口32编程) Vim是历史潮流中不能不提及的东西.是一个相当棒的工具.但是, 在繁重插件的堆积下, Vim失去自身简单快捷的特点的时候, 这还能叫Vim吗? 这种时候, 和IDE有什么区别, 活生生配成IDE, 但是耦合度很复杂的VIm, 还不如直接使用IDE 很多时候, 折腾半天的工具, 还不如其他一步到位的做法 (个人想法, 就这么些吧)
福利时间
什么, 你竟然看到这里了 ?
那就给你一点点福利吧. 如果你要从事Kernel开发, 却苦于补全, 就让这部分内容来帮你吧 !
Kernel-Headers
先来说说内核头文件.安装一般有两种方式:
- 在源码根目录下
sudo make headers_install
即可 (但是, 个人机器还是有问题) - 使用
/usr/src/kernerl/xxxxxxxxxxx
中的内容, 这是安装到目前系统内核
个人推荐, 使用第二条路径. 但是, 如何完成补全? 同时相互依赖怎么解决 ?
注意: 我们下面介绍的方法, 必须是与具体系统相契合的 !, 一旦内核升级, 建议重新来一遍(图个保险)
YCM-Generator
这是一个开源工具. Project index »>
我们这样来使用它
$ git clone https://github.com/rdnetto/YCM-Generator
$ cd YCM-Generator
$ ./config_gen.py [project path]
对于Linux内核文件, 基本上15s左右时间即可. 会在project dir生成一个隐藏文件 .ycm_extra_conf.py
之后我们将ycm的索引文件进行配置即可. let g:ycm_global_ycm_extra_conf='/usr/src/kernels/4.18.18-100.fc27.x86_64/.ycm_extra_conf.py'
这样, 你的Vim进行内核开发, 就闲的游刃有余了.
来张图感受一下,所以, 懂我意思了吧 ? 什么, 你说标准C库头文件呢 ? 想想之前的 '-isystem', '/usr/include'
, OK吧 ?
基本上关于Vim的事, 就暂时了解一个段落了, 虽然以后可能会用IDE, 不过都是工具嘛, 各有各的长处~