由于VIM的包管理软件Vundle需要Git支持,所以第一步我们先安装git
sudo apt-get install git
Vundle是VIM的包管理软件,我们的插件大部分是通过这个包管理软件进行安装的,还有一部分是系统自带的,使用系统命令安装即可
执行git clone命令进行下载
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
将如下内容放在.vimrc文件中,该内容是由Readme中的内容删减的
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
call vundle#end()
filetype plugin indent on
" :PluginList
" :PluginInstall
" :PluginSearch foo
" :PluginClean
这里粘贴的时候会因为自动注释和自动换行,导致粘贴的内容混乱,可以先使用
set paste
进入粘贴模式,将内容粘贴完毕后,再使用
set nopaste
恢复即可
syntax on " 支持语法高亮
set tabstop=4 " 设置制表符(tab键)的宽度
"set softtabstop=4 " 设置按退格键的时候退回缩进的长度
set expandtab " 使用空格代替Tab
set ai " 设置自动缩进
set shiftwidth=4 " (自动) 缩进使用的4个空格
set hls " 打开搜索高亮
set nu " 显示行号
"设置Ctrl + K/J/H/L的映射
nmap
nmap
nmap
nmap
"按F8高亮当前单词
nmap :let @/=expand('')
NERDTree插件时VIM的目录树插件,安装之后你可以查看工程的目录结构
vundle配置中添加
Plugin 'scrooloose/nerdtree'
执行PluginInstall即可,如果安装后目录树显示是
"�~V�"
请将~/.vim/bundle/nerdtree/plugin/NERD_tree.vim中的如下代码
if !nerdtree#runningWindows() && !nerdtree#runningCygwin()
call s:initVariable("g:NERDTreeDirArrowExpandable", "�~V�")
call s:initVariable("g:NERDTreeDirArrowCollapsible", "�~V�")
else
call s:initVariable("g:NERDTreeDirArrowExpandable", "+")
call s:initVariable("g:NERDTreeDirArrowCollapsible", "~")
endif
改为
"if !nerdtree#runningWindows() && !nerdtree#runningCygwin()
" call s:initVariable("g:NERDTreeDirArrowExpandable", "�~V�")
" call s:initVariable("g:NERDTreeDirArrowCollapsible", "�~V�")
"else
call s:initVariable("g:NERDTreeDirArrowExpandable", "+")
call s:initVariable("g:NERDTreeDirArrowCollapsible", "~")
"endif
即可
" 按打开或关闭文件目录树
map : NERDTreeToggle
" 修改树的显示图标
let g:NERDTreeDirArrowExpandable = '+'
let g:NERDTreeDirArrowCollapsible = '-'
" 窗口位置
let g:NERDTreeWinPos='left'
" 窗口是否显示行号
let g:NERDTreeShowLineNumbers=1
" 不显示隐藏文件
let g:NERDTreeHidden=0
"打开vim时如果没有文件自动打开NERDTree
autocmd vimenter * if !argc()|NERDTree|endif
" 当NERDTree为剩下的唯一窗口时自动关闭
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
ctags相当于对所有符号建立了索引,这样我们就可以在符号之间进行查看和跳转了
sudo apt-get install ctags
"设置当前的tags路径
set tags=tags
set tags+=./tags
"使用F5来重新生成tags文件并更新taglist
"如果只想更新某些目录必须要更改之前的路径
nmap :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . :TlistUpdate
imap :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . :TlistUpdate
"使用g + ]而不是Ctrl + ],这样每次都可以直接列出所有匹配项
nmap g]
如果有许多个工程,每个工程需要更新的目录不一样,可以这样设置
:let betaflight_path = "/home/xia/betaflight_master"
set tags=tags
set tags+=./tags
if getcwd() == betaflight_path
nmap :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q ./src ./lib :TlistUpdate
"imap :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q ./src ./lib :TlistUpdate
else
nmap :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . :TlistUpdate
"imap :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . :TlistUpdate
endif
这样,当我们在betaflight_master目录下,更新的就是./src 和 ./lib文件夹,其余目录更新的是当前目录下所有文件夹
先使用ctags * -R + dir 对某些目录建立符号表,然后可以使用下面的快捷键使用ctags
taglist顾名思义就是可以将所有符号显示出来的插件,这样我们在新的窗口就可以看到当前文件中所有的变量,结构体,函数定义等等
vundle配置中添加
Plugin 'taglist.vim'
使用“PluginList”查看后用“PluginInstall”进行安装
nnoremap :TlistToggle
let Tlist_Use_Right_Window=1 "让窗口显示在右边,0的话就是显示在左边
let Tlist_Show_One_File=1 "只显示当前文件的taglist
let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动退出vim
前面说了ctags已经建立了符号表,但是他并不知道各个符号的调用关系,所以我们用ctags只能跳转到定义处,而使用cscope就可以按照我们想要的符号关系进行跳转,比如查找所有调用此函数的地方
sudo apt-get install cscope
if has("cscope")
set csprg=/usr/bin/cscope " 指定用来执行cscope的命令
set csto=0 " 设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标>签文件再找cscope数据库
set cst " 同时搜索cscope数据库和标签文件
set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用QuickFix窗口来显示cscope查找结果
set nocsverb
if filereadable("cscope.out") " 若当前目录下存在cscope数据库,添加该数据库到vim
cs add cscope.out
elseif $CSCOPE_DB != "" " 否则只要环境变量CSCOPE_DB不为空,则添加其指定的数据库到vim
cs add $CSCOPE_DB
endif
set csverb
endif
nmap s :cs find s =expand("") :copen
nmap g :cs find g =expand("")
nmap d :cs find d =expand("") :copen
nmap c :cs find c =expand("") :copen
nmap t :cs find t =expand("") :copen
nmap e :cs find e =expand("") :copen
nmap f :cs find f =expand("")
nmap i :cs find i =expand("") :copen
cscope也需要先单独生成文件,可以按照如下方式使用
find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
这里需要说明一下,由于cscope和ctags是配合使用的,所以如果要更新,也需要一起更新,包含的文件夹需要一直,所以这里建议,不使用vim配置中的快捷键更新,而是单独写个脚本用来更新,需要更新的时候执行这个脚本,或者在vim中执行":sh"进入shell,运行完这个脚本之后,在执行exit()回到vim中即可,脚本内容如下
#!/bin/sh
UPDATE_DIR="./src ./lib"
find $UPDATE_DIR -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
ctags -R $UPDATE_DIR
按照上面的配置,使用Ctrl + Shift + - 之后在按对应的功能进行查找即可
s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文件
syntastic是一个静态检查工具,在你打开VIM或者保存VIM的时候,工具会自动检查并提示语法错误
Plugin 'scrooloose/syntastic'
目前使用默认配置即可
在保存时,如果有错误,VIM会自动进行提示,但是感觉并不好用,因为跳转之后有的文件感觉这个功能没有生效
VIM自带插件,可以在Make的时候自动跳转到错误的地方,同样感觉不习惯使用,个人还是习惯新打开一个窗口然后进行编译,出错的文件也肯定是之前修改过的,已经在原来窗口打开了
有了上述功能,虽然和SourceInsight比不了,但是也是一个强大好用的IDE了,总结一下,其实我们有一个配置的vimrc文件,还有一个用于自动更新tag的脚本,全部内容如下
"================================
"=== Vundle Setting ===
"================================
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'scrooloose/nerdtree'
Plugin 'scrooloose/syntastic'
Plugin 'taglist.vim'
call vundle#end()
filetype plugin indent on
" :PluginList
" :PluginInstall
" :PluginSearch foo
" :PluginClean
"=================================
"=== Vim Setting ===
"=================================
syntax on " 支持语法高亮
set tabstop=4 " 设置制表符(tab键)的宽度
"set softtabstop=4 " 设置按退格键的时候退回缩进的长度
set expandtab " 使用空格代替Tab
set ai " 设置自动缩进
set shiftwidth=4 " (自动) 缩进使用的4个空格
set hls " 打开搜索高亮
set nu " 显示行号
"设置Ctrl + K/J/H/L的映射
nmap
nmap
nmap
nmap
"按F8高亮当前单词
nmap :let @/=expand('')
"==================================
"=== NERDTree Setting ===
"==================================
" 按打开或关闭文件目录树
map : NERDTreeToggle
" 修改树的显示图标
let g:NERDTreeDirArrowExpandable = '+'
let g:NERDTreeDirArrowCollapsible = '-'
" 窗口位置
let g:NERDTreeWinPos='left'
" 窗口是否显示行号
let g:NERDTreeShowLineNumbers=1
" 不显示隐藏文件
let g:NERDTreeHidden=0
"打开vim时如果没有文件自动打开NERDTree
autocmd vimenter * if !argc()|NERDTree|endif
" 当NERDTree为剩下的唯一窗口时自动关闭
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
"===================================
"=== ctags Setting ===
"===================================
set tags=tags
set tags+=./tags
"ctags更新请使用脚本进行更新
"nmap ]
nmap g]
"=====================================
"=== taglist Setting ===
"=====================================
nnoremap :TlistToggle
"taglist临时更新,可以使用u进行更新,永久更新请使用脚本更新
let Tlist_Use_Right_Window=1 "让窗口显示在右边,0的话就是显示在左边
let Tlist_Show_One_File=1 "只显示当前文件的taglist
let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动推出vim
"====================================
"=== cscope Setting ===
"====================================
if has("cscope")
set csprg=/usr/bin/cscope " 指定用来执行cscope的命令
set csto=0 " 设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标>签文件再找cscope数据库
set cst " 同时搜索cscope数据库和标签文件
set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用QuickFix窗口来显示cscope查找结果
set nocsverb
if filereadable("cscope.out") " 若当前目录下存在cscope数据库,添加该数据库到vim
cs add cscope.out
elseif $CSCOPE_DB != "" " 否则只要环境变量CSCOPE_DB不为空,则添加其指定的数据库到vim
cs add $CSCOPE_DB
endif
set csverb
endif
nmap s :cs find s =expand("") :copen
nmap g :cs find g =expand("")
nmap d :cs find d =expand("") :copen
nmap c :cs find c =expand("") :copen
nmap t :cs find t =expand("") :copen
nmap e :cs find e =expand("") :copen
nmap f :cs find f =expand("")
nmap i :cs find i =expand("") :copen
#!/bin/sh
UPDATE_DIR="./src ./lib"
find $UPDATE_DIR -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
ctags -R $UPDATE_DIR
可以在每个工程的根目录下创建这个脚本,然后根据不同的工程修改需要建立所以的目录和文件类型