在Windows平台上阅读/写代码常用的工具估计是VS Code或者Source Insight,在Linux平台上个人则认为是vim+cscope/ vim+ ctags了,对于从事底层开发的人员来说就更是了。
参加工作也有一段时间了,虽然参加工作后一直在共vim写代码,但是一直时间梳理一下vim的配置,这次就打算梳理下自己vim的配置,方便大家借鉴,也方便自己今后参考,不断完善。
本文主要是针对平时实践中用到的一些基本配置和插件进行总结,本帖也比较面向刚开始使用vim的小伙伴,如果有问题欢迎大家指正,交流学习~
vim的配置文件在home的user路径下,即/home/
,如果你第一次使用vim的话可以新建一个配置文件,执行vim ~/.vimrc
即可。
我的vim基础配置如下:
"====== Basic Configuration ======
set number " 显示行号
set cursorline " 突出显示当前行
hi Cursorline cterm=bold ctermbg=black ctermfg=green guibg=green "粗体显示选中行,用黑色框,字体标绿
set cursorcolumn " 设置列高亮
hi Cursorcolumn cterm=bold ctermbg=black ctermfg=green guibg=green "粗体显示选中列,用黑色框,字体标绿
set autoindent " 自动缩进
set cindent
set tabstop=4 " Tab键的宽度
set softtabstop=4 " 统一缩进为4
set shiftwidth=4
set noexpandtab " 不要用空格代替制表符 或者使用expandtab将tab保存为space
set smarttab " 在行和段开始处使用制表符
set ignorecase "搜索忽略大小写
set hlsearch "搜索逐字符高亮
set incsearch "增强搜索
set smartindent " 提供自动缩进
syntax on " 语法高亮
" 突出显示81列
set textwidth=80
set colorcolumn=+1
nnoremap :tabnext "切换下一个使用:tabe打开的tag页 映射为 ctrl+n
nnoremap :tabprev "切换上一个使用:tabe打开的tag页 映射为 ctrl+p
Vundle 是 Vim bundle 的简称,是一个 Vim 插件管理器。
有了它就可以更为方便地管理所要安装的插件,包括安装,更新,清理等功能
首先需要通过git来下载 vundle:
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
执行完如下Vundle就被安装在了~/.vim/bundle/Vundle.vim
目录下,今后通过Vundle安装的插件都会被管理在~/.vim/bundle/
目录下。
为了使用Vundle你还需要在vim的配置文件中添加如下配置,并且将你想通过Vundle管理的插件都添加在call vundle#begin()
和call vundle#end()
块中:
PS: 对于初学者来说可能不确定需要添加哪些插件,那就可以先只添加
Plugin 'VundleVim/Vundle.vim'
这一项
现在只是打一个地基,继续往下看,大家可以再结合本帖的介绍,并结合自己实际使用来往里慢慢添加自己想用的插件~
"====== vundle configuration ======
set nocompatible " be iMproved
filetype off " required!
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" let Vundle manage Vundle
Plugin 'VundleVim/Vundle.vim'
" My Plugin
Plugin 'preservim/nerdtree'
Plugin 'preservim/nerdcommenter'
Plugin 'majutsushi/tagbar'
Plugin 'itchyny/lightline.vim'
Plugin 'luochen1990/rainbow'
call vundle#end()
filetype plugin indent on " requeired
vim
:PluginInstall
vim +PluginInstall +qall
:BundleList # 列举.vimrc中配置的所有插件
:BundleInstall # 安装列表中的全部插件
:BundleInstall! # 更新列表中的全部插件
:BundleSearch foo # 查找foo插件
:BundleSearch! foo # 刷新foo插件缓存
:BundleClean # 清除列表中没有的插件
:BundleClean! # 清除列表中没有的插件
NRDTree是vim编辑器的文件系统资源管理器。使用这个插件,用户可以直观地浏览复杂的目录层次结构,快速打开文件进行阅读或编辑,并执行基本的文件系统操作。简单来说就是有一个可视化的目录层级结构,如下图所示:
本文的插件都基于Vundle管理,因此在Vundle的call vundle#begin()
和call vundle#end()
块中加入如下部分,然后执行Vundle的插件安装(2.1.3)即可:
Plugin 'preservim/nerdtree'
以下配置大家可以根据个人喜好添加到
vimrc
中,完全不配置的话也可以直接在vim中输入:NERDTree
即可使用了。
" 通过F2键来开启和关闭NERDTree
map :NERDTreeMirror
map :NERDTreeToggle
" 启动vim时自动打开NERDTree,并将光标放在Tree的Tag
autocmd VimEnter * NERDTree
" 启动vim时自动打开NERDTree,并将光标放在vim打开的文件
autocmd VimEnter * NERDTree | wincmd p
" 如果退出vim后只剩Tree的Tag的话,则自动退出Tree的Tag
autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
用vim撸代码的时候是不是会经常苦于vim不能像一般的IDE一样可以方便的批量注释,那么接下来介绍的这个插件你值得拥有~
本帖介绍的NERD Commenter 是跟NERDTree同一Maintainer的,用于批量注释的插件。
同NERDTree一样,在Vundle的call vundle#begin()
和call vundle#end()
块中加入如下部分,然后执行Vundle的插件安装即可
Plugin 'preservim/nerdcommenter'
我在使用这个插件的时候用的都是默认的映射,感觉也挺方便的,但在那之前,需要设置一下leader
键,大家可以理解为我们平时键盘上的Ctrl键,不需要太在意,根据自己的习惯,设置一个键即可,我设置的是减号-
,在vimrc
里添加这一行
let mapleader="-"
关于默认映射,大家可以根据自身的习惯来决定是否修改,常用的默认映射如下:
cc " 注释掉在Visual模式中选择的当前行或文本
ci " 反转在Visual模式中选中行的注释,即已注释的行则取消注释,未注释的行则添加注释
cA " 在本行尾部添加注释
cu " 取消选在Visual模式中中行的注释
以上映射的使用方法就是先按下
键,然后紧接着按下你想用的映射即可,即如果你想在某行尾部添加注释,则将光标停在该行,如果像我一样设置的
键为减号,则键入
-cA
即可实现
Tagbar可以使得我们快速浏览当前文件的标签,并获得其结构的概述。就像文章的目录一样,把各个变量,函数名等归类显示。
vim --version | head -n 1
sudo apt-get install ctags
同以上两个插件一样,在Vundle的call vundle#begin()
和call vundle#end()
块中加入如下部分,然后执行Vundle的插件安装即可
Plugin 'majutsushi/tagbar'
Tagbar的配置比较简单,基本上配置一个快捷键的映射即可满足使用,这里将开启/关闭的快捷键映射为F3
" 通过F3键来开启和关闭Tagbar
nnoremap :TagbarToggle
不知道使用vim查看代码的时候有没有一个困惑,就是像IDE一样查看函数在哪里定义的,以及被谁调用的,会觉得很不方便。
cscope最初就是为了解决这个问题,尤其是c code的这个问题而生的。
通过它生成的的符号数据库,可以检索符号的声明,定义,调用关系等,它涵盖了ctags的功能,比ctags更加强大。
sudo apt-get install cscope
安装完成后在~/.vimrc
中添加如下关于cscope的配置项,包括了添加cscope.out
,快捷键的映射等设置,至于如何生成cscope.out
文件,下面会介绍。
"====== cscope configuration ======
" 指定了执行cscpoe的命令
" csto 值决定了:cstag执行查找的顺序。为0则cscope数据将会被优先查找,然后才会查找tag文件。为1,则查找顺序相反。默认值是0
" cscopequickfix指定了是否使用quickfix窗口来显示cscope的结果
if has("cscope")
set csprg=/usr/bin/cscope
set csto=0 " cscope数据将会被优先查找
set nocsverb
" 添加当前目录下的数据库
if filereadable("cscope.out")
cs add cscope.out
" 添加环境变量中指定的数据库
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set cscopequickfix=s-,g-,c-,f-,t-,d-,i-,e-,a-
" 快捷键映射
nnoremap fs :cs find s =expand(""):copen " 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
nnoremap fg :cs find g =expand(""):copen " 查找函数、宏、枚举等定义的位置
nnoremap fd :cs find d =expand(""):copen " 查找本函数调用的函数
nnoremap fc :cs find c =expand(""):copen " 查找调用本函数的函数
nnoremap ft :cs find t =expand(""):copen " 查找指定的字符串
nnoremap fe :cs find e =expand(""):copen " 查找egrep模式,相当于egrep功能,但查找速度快多了
nnoremap ff :cs find f =expand(""):copen " 查找并打开文件,类似vim的find功能
nnoremap fi :cs find i =expand(""):copen " 查找包含本文件的文件
nnoremap :cnext " 切换至下一个cscopequickfix的搜索结果 映射为 ctrl+j
nnoremap :cprev " 切换至上一个cscopequickfix的搜索结果 映射为 ctrl+k
nnoremap t :copen " 打开cscopequickfix窗口
autocmd FileType qf nnoremap :cclose
endif
cscope的符号表和基于符号的索引一般是以项目为单位的,完成了上面的配置之后,还需要建立符号和索引。
假设你的项目是以c code编写,则cd 到你项目的根目录,执行如下命令:
find -name "*.[chsS]" > cscope.files
cscope -bkq
上面两条命令的目的分别是
.c
,.h
,.s
,.S
文件,然后写入cscope.files
文件中具体cscope的指令用法如下,大家可以根据自身需求选择,一般使用我上面写的就可以了
-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
-k: 在生成索引文件时,不搜索/usr/include目录
-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪去找源文件列表。可以使用“-”,表示由标准输入获得文件列表
-I : 在-I选项指出的目录中查找头文件
-u: 扫描所有文件,重新生成交叉索引文件
-C: 在搜索时忽略大小写
-P : 在以相对路径表示的文件前加上的path,这样你不用切换到数据库文件所在的目录也可以使用它
这种方式有一个缺点,就是必须在建立数据库的目录下打开文件才可以使用cscope进行搜索,细心的朋友可以发现2.4.2节中 cscope的配置里有一条添加环境变量中指定的数据库的if分支,代码块如下:
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
如果设置了CSCOPE_DB
这个环境变量,即使不在建立数据库的目录下打开文件,也可以使用数据库建立的索引进行检索了
添加环境变量的方法有很多种,大家可以自行搜索,这里就不展开介绍了,只给出一种最简单的方式,即在~/.bashrc
的末尾添加如下内容,然后source ~/.bashrc
即可
CSCOPE_DB="cscope.out path"
上面的cscope.out path
代表着你通过cscope -bkq
命令生成的cscope.out
文件的绝对路径
完成以上的配置之后,就可以去使用了,按照我的配置,则查找函数的定义为leader键
fg,因为leader键
被映射为了减号,则执行-fg
即可查找函数的定义了,例如光标放在platform_driver_register()
上面键入-fg
,则跳出cscopequickfix显示搜索该函数的定义位置,即红框中的内容了
lightline是一个轻量级且可配置的 Vim 状态行/表格插件,配置这个插件,用vim打开文件后,在屏幕的底部有一个栏,告诉你你在处理什么文件,并且根据vim的状态改变状态栏的颜色
在Vundle的call vundle#begin()
和call vundle#end()
块中加入如下部分,然后执行Vundle的插件安装即可
Plugin 'itchyny/lightline.vim'
set laststatus=2
let g:lightline = { ‘colorscheme’: ‘PaperColor’ } "配置状态栏主题
大部分编程语言都有方括号,圆括号,花括号等括号
rainbow插件可以帮忙区分哪两个括号是一对,增加代码的可读性,也会让你的代码变得丰富多彩
在Vundle的call vundle#begin()
和call vundle#end()
块中加入如下部分,然后执行Vundle的插件安装即可
Plugin 'luochen1990/rainbow'
将以下配置添加到~/.vimrc
中即可
"rainbow
let g:rainbow_active = 1
let g:rainbow_conf = {
\ 'guifgs': ['royalblue3', 'darkorange3', 'seagreen3', 'firebrick'],
\ 'ctermfgs': ['lightblue', 'lightyellow', 'lightcyan', 'lightmagenta'],
\ 'operators': '_,_',
\ 'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/{/ end=/}/ fold'],
\ 'separately': {
\ '*': {},
\ 'tex': {
\ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/'],
\ },
\ 'lisp': {
\ 'guifgs': ['royalblue3', 'darkorange3', 'seagreen3', 'firebrick', 'darkorchid3'],
\ },
\ 'vim': {
\ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/', 'start=/{/ end=/}/ fold', 'start=/(/ end=/)/ containedin=vimFuncBody', 'start=/\[/ end=/\]/ containedin=vimFuncBody', 'start=/{/ end=/}/ fold containedin=vimFuncBody'],
\ },
\ 'html': {
\ 'parentheses': ['start=/\v\<((area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)[ >])@!\z([-_:a-zA-Z0-9]+)(\s+[-_:a-zA-Z0-9]+(\=("[^"]*"|'."'".'[^'."'".']*'."'".'|[^ '."'".'"><=`]*))?)*\>/ end=#\z1># fold'],
\ },
\ 'css': 0,
\ }
\}
然后重启vim就可以看到变化啦
今天就先总结到这,之后会继续更新的~
如果有哪里理解错的地方欢迎大家留言交流,如需转载请标明出处。
如果你没看懂一定是我讲的不好,欢迎留言,我继续努力。
手工码字码图码代码,如果有帮助到你的话留个赞吧,谢谢。
以上。