文章目录
前言
在Windows平台上阅读/写代码常用的工具估计是VS Code或者Source Insight,在Linux平台上个人则认为是vim+cscope/ vim+ ctags了,对于从事底层开发的人员来说就更是了。
参加工作也有一段时间了,虽然参加工作后一直在共vim写代码,但是一直时间梳理一下vim的配置,这次就打算梳理下自己vim的配置,方便大家借鉴,也方便自己今后参考,不断完善。
本文主要是针对平时实践中用到的一些基本配置和插件进行总结,本帖也比较面向刚开始使用vim的小伙伴,如果有问题欢迎大家指正,交流学习~
一、vim基础配置
vim的配置文件在home的user路径下,即/home/<user name>/.vimrc
,如果你第一次使用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 <c-n> :tabnext<cr> "切换下一个使用:tabe打开的tag页 映射为 ctrl+n
nnoremap <c-p> :tabprev<cr> "切换上一个使用:tabe打开的tag页 映射为 ctrl+p
二、常用插件
2.1 Vundle
Vundle 是 Vim bundle 的简称,是一个 Vim 插件管理器。
有了它就可以更为方便地管理所要安装的插件,包括安装,更新,清理等功能
2.1.1 Vundle安装
首先需要通过git来下载 vundle:
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
执行完如下Vundle就被安装在了~/.vim/bundle/Vundle.vim
目录下,今后通过Vundle安装的插件都会被管理在~/.vim/bundle/
目录下。
2.1.2 Vundle配置
为了使用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'
Plugin 'dyng/ctrlsf.vim'
call vundle#end()
filetype plugin indent on " requeired
2.1.3 安装插件
- 方法一
执行如下命令在vim中安装:
vim
:PluginInstall
- 方法二
执行如下命令在terminal中安装:
vim +PluginInstall +qall
2.1.4 Vundle常用指令
:BundleList # 列举.vimrc中配置的所有插件
:BundleInstall # 安装列表中的全部插件
:BundleInstall! # 更新列表中的全部插件
:BundleSearch foo # 查找foo插件
:BundleSearch! foo # 刷新foo插件缓存
:BundleClean # 清除列表中没有的插件
:BundleClean! # 清除列表中没有的插件
2.2 NERDTree
NRDTree是vim编辑器的文件系统资源管理器。使用这个插件,用户可以直观地浏览复杂的目录层次结构,快速打开文件进行阅读或编辑,并执行基本的文件系统操作。简单来说就是有一个可视化的目录层级结构,如下图所示:
2.2.1 NERDTree安装
本文的插件都基于Vundle管理,因此在Vundle的call vundle#begin()
和call vundle#end()
块中加入如下部分,然后执行Vundle的插件安装(2.1.3)即可:
Plugin 'preservim/nerdtree'
2.2.2 NERDTree配置
以下配置大家可以根据个人喜好添加到
vimrc
中,完全不配置的话也可以直接在vim中输入:NERDTree
即可使用了。
" 通过F2键来开启和关闭NERDTree
map <F2> :NERDTreeMirror<CR>
map <F2> :NERDTreeToggle<CR>
" 启动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
2.3 NERD Commenter
用vim撸代码的时候是不是会经常苦于vim不能像一般的IDE一样可以方便的批量注释,那么接下来介绍的这个插件你值得拥有~
本帖介绍的NERD Commenter 是跟NERDTree同一Maintainer的,用于批量注释的插件。
2.3.1 NERD Commenter安装
同NERDTree一样,在Vundle的call vundle#begin()
和call vundle#end()
块中加入如下部分,然后执行Vundle的插件安装即可
Plugin 'preservim/nerdcommenter'
2.3.2 NERD Commenter配置
我在使用这个插件的时候用的都是默认的映射,感觉也挺方便的,但在那之前,需要设置一下leader
键,大家可以理解为我们平时键盘上的Ctrl键,不需要太在意,根据自己的习惯,设置一个键即可,我设置的是减号-
,在vimrc
里添加这一行
let mapleader="-"
关于默认映射,大家可以根据自身的习惯来决定是否修改,常用的默认映射如下:
<leader>cc " 注释掉在Visual模式中选择的当前行或文本
<leader>ci " 反转在Visual模式中选中行的注释,即已注释的行则取消注释,未注释的行则添加注释
<leader>cA " 在本行尾部添加注释
<leader>cu " 取消选在Visual模式中中行的注释
以上映射的使用方法就是先按下
<leader>
键,然后紧接着按下你想用的映射即可,即如果你想在某行尾部添加注释,则将光标停在该行,如果像我一样设置的<leader>
键为减号,则键入-cA
即可实现
2.4 Tagbar
Tagbar可以使得我们快速浏览当前文件的标签,并获得其结构的概述。就像文章的目录一样,把各个变量,函数名等归类显示。
2.4.1 Tagbar安装
2.4.1.1Tagbar依赖准备
- Vim >= 7.3.1058
也就是说需要vim的版本大于等于7.3.1058,只要系统版本不是很旧的话,一般都是满足的,不确定的可以执行一下命令查看:
vim --version | head -n 1
- ctags
ctags的版本有很多种,这里提供一种安装方式:
sudo apt-get install ctags
2.4.1.2 Tagbar安装
同以上两个插件一样,在Vundle的call vundle#begin()
和call vundle#end()
块中加入如下部分,然后执行Vundle的插件安装即可
Plugin 'majutsushi/tagbar'
2.4.2 Tagbar配置
Tagbar的配置比较简单,基本上配置一个快捷键的映射即可满足使用,这里将开启/关闭的快捷键映射为F3
" 通过F3键来开启和关闭Tagbar
nnoremap <F3> :TagbarToggle<CR>
2.5 cscope
不知道使用vim查看代码的时候有没有一个困惑,就是像IDE一样查看函数在哪里定义的,以及被谁调用的,会觉得很不方便。
cscope最初就是为了解决这个问题,尤其是c code的这个问题而生的。
通过它生成的的符号数据库,可以检索符号的声明,定义,调用关系等,它涵盖了ctags的功能,比ctags更加强大。
2.5.1 cscope安装
sudo apt-get install cscope
2.5.2 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 <leader>fs :cs find s <c-r>=expand("<cword>")<cr><cr>:copen<cr> " 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
nnoremap <leader>fg :cs find g <c-r>=expand("<cword>")<cr><cr>:copen<cr> " 查找函数、宏、枚举等定义的位置
nnoremap <leader>fd :cs find d <c-r>=expand("<cword>")<cr><cr>:copen<cr> " 查找本函数调用的函数
nnoremap <leader>fc :cs find c <c-r>=expand("<cword>")<cr><cr>:copen<cr> " 查找调用本函数的函数
nnoremap <leader>ft :cs find t <c-r>=expand("<cword>")<cr><cr>:copen<cr> " 查找指定的字符串
nnoremap <leader>fe :cs find e <c-r>=expand("<cword>")<cr><cr>:copen<cr> " 查找egrep模式,相当于egrep功能,但查找速度快多了
nnoremap <leader>ff :cs find f <c-r>=expand("<cfile>")<cr><cr>:copen<cr> " 查找并打开文件,类似vim的find功能
nnoremap <leader>fi :cs find i <c-r>=expand("<cfile>")<cr><cr>:copen<cr> " 查找包含本文件的文件
nnoremap <c-j> :cnext<cr> " 切换至下一个cscopequickfix的搜索结果 映射为 ctrl+j
nnoremap <c-k> :cprev<cr> " 切换至上一个cscopequickfix的搜索结果 映射为 ctrl+k
nnoremap <leader>t :copen<cr> " 打开cscopequickfix窗口
autocmd FileType qf nnoremap <buffer> <CR> <CR>:cclose<CR>
endif
2.5.3 cscope使用
cscope的符号表和基于符号的索引一般是以项目为单位的,完成了上面的配置之后,还需要建立符号和索引。
2.5.3.1 建立cscope.files
假设你的项目是以c code编写,则cd 到你项目的根目录,执行如下命令:
find -name "*.[chsS]" > cscope.files
cscope -bkq
上面两条命令的目的分别是
- 从项目的根目录开始递归搜索所有的
.c
,.h
,.s
,.S
文件,然后写入cscope.files
文件中 - 建立cscope的数据库索引
具体cscope的指令用法如下,大家可以根据自身需求选择,一般使用我上面写的就可以了
-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
-k: 在生成索引文件时,不搜索/usr/include目录
-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪去找源文件列表。可以使用“-”,表示由标准输入获得文件列表
-I <dir>: 在-I选项指出的目录中查找头文件
-u: 扫描所有文件,重新生成交叉索引文件
-C: 在搜索时忽略大小写
-P <path>: 在以相对路径表示的文件前加上的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
文件的绝对路径
2.5.3.2 cscope使用例子
完成以上的配置之后,就可以去使用了,按照我的配置,则查找函数的定义为leader键
fg,因为leader键
被映射为了减号,则执行-fg
即可查找函数的定义了,例如光标放在platform_driver_register()
上面键入-fg
,则跳出cscopequickfix显示搜索该函数的定义位置,即红框中的内容了
2.6 lightline
lightline是一个轻量级且可配置的 Vim 状态行/表格插件,配置这个插件,用vim打开文件后,在屏幕的底部有一个栏,告诉你你在处理什么文件,并且根据vim的状态改变状态栏的颜色
2.6.1 lightline安装
在Vundle的call vundle#begin()
和call vundle#end()
块中加入如下部分,然后执行Vundle的插件安装即可
Plugin 'itchyny/lightline.vim'
2.6.2 lightline配置
set laststatus=2
let g:lightline = { ‘colorscheme’: ‘PaperColor’ } "配置状态栏主题
2.7 rainbow
大部分编程语言都有方括号,圆括号,花括号等括号
rainbow插件可以帮忙区分哪两个括号是一对,增加代码的可读性,也会让你的代码变得丰富多彩
2.7.1 rainbow安装
在Vundle的call vundle#begin()
和call vundle#end()
块中加入如下部分,然后执行Vundle的插件安装即可
Plugin 'luochen1990/rainbow'
2.7.2 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就可以看到变化啦
2.8 ctrlsf.vim
2.8.1 ctrlsf.vim安装
在Vundle的call vundle#begin()
和call vundle#end()
块中加入如下部分,然后执行Vundle的插件安装即可
Plugin 'dyng/ctrlsf.vim'
2.8.2 ctrlsf.vim配置
let g:ctrlsf_auto_close = {
\ "normal" : 1,
\ "compact": 0
\ }
let g:ctrlsf_auto_focus = {
\ "at" : "start",
\ }
let g:ctrlsf_absolute_file_path = 1
let g:ctrlsf_auto_preview = 1
let g:ctrlsf_confirm_save = 1
2.8.3 ctrlsf.vim使用
TODO
总结
今天就先总结到这,之后会继续更新的~
如果有哪里理解错的地方欢迎大家留言交流,如需转载请标明出处。
如果你没看懂一定是我讲的不好,欢迎留言,我继续努力。
手工码字码图码代码,如果有帮助到你的话留个赞吧,谢谢。
以上。