【从入门到进阶】vim基础配置+ 常用插件(NERDTree, cscope, rainbow等)


前言

在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

总结

今天就先总结到这,之后会继续更新的~

如果有哪里理解错的地方欢迎大家留言交流,如需转载请标明出处。

如果你没看懂一定是我讲的不好,欢迎留言,我继续努力。

手工码字码图码代码,如果有帮助到你的话留个赞吧,谢谢。

以上。

  • 23
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值