VIM打造成IDE

1.安装git

由于VIM的包管理软件Vundle需要Git支持,所以第一步我们先安装git

sudo apt-get install git

2.安装Vundle

Vundle是VIM的包管理软件,我们的插件大部分是通过这个包管理软件进行安装的,还有一部分是系统自带的,使用系统命令安装即可

2.1下载

执行git clone命令进行下载

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

2.2配置.vimrc文件

将如下内容放在.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

恢复即可

2.3VIM常规配置

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('')

3.NERDTree

NERDTree插件时VIM的目录树插件,安装之后你可以查看工程的目录结构

3.1NERDTree安装

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

即可

 

3.2NERDTree配置

" 按打开或关闭文件目录树
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

 

3.3NERDTree使用方法

  • 使用Ctrl + K/J/H/L在不同窗口之间切换
  • 使用P/p 快读跳转到根目录/上层目录
  • 使用 i 以水平方式打开文件
  • 使用 s 以垂直方式打开文件
  • 更多使用方式可以在NERDTree界面中使用?来查看

 

4.ctags

ctags相当于对所有符号建立了索引,这样我们就可以在符号之间进行查看和跳转了

4.1安装ctags

sudo apt-get install ctags

4.2ctags配置

"设置当前的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文件夹,其余目录更新的是当前目录下所有文件夹

4.3ctags使用

先使用ctags * -R + dir 对某些目录建立符号表,然后可以使用下面的快捷键使用ctags

  • Ctrl+] 跳到当前光标下单词的标签
  • Ctrl + W + ] 在新窗口打开当前光标下单词的标签
  • Ctrl+T 返回上一个标签
  • 如果想在新窗口打开标签,可以先使用 :sp 命令打开一个新窗口,然后在新窗口中跳转
  • :tag + name 跳转到名字为name的变量处,可以先使用这个命令再使用Ctrl + ]来快速查找

5.taglist

taglist顾名思义就是可以将所有符号显示出来的插件,这样我们在新的窗口就可以看到当前文件中所有的变量,结构体,函数定义等等

5.1 安装taglist

vundle配置中添加

Plugin 'taglist.vim'

使用“PluginList”查看后用“PluginInstall”进行安装

 

5.2 taglist配置

nnoremap  :TlistToggle

let Tlist_Use_Right_Window=1  	"让窗口显示在右边,0的话就是显示在左边
let Tlist_Show_One_File=1 		"只显示当前文件的taglist
let Tlist_Exit_OnlyWindow=1 	"当taglist是最后一个分割窗口时,自动退出vim

5.3 taglist使用方法

  • 使用Enter在当前窗口跳转到tag
  • 使用Space查看函数或变量原型
  • 使用U更新taglist,这个更新不会保存在tags中,建议还是使用上面的F5进行更新
  • 使用o在新窗口打开当前tag
  • 使用x放大缩小taglist,方便查看较长的名字
  • 使用zc,闭合当前tag
  • 使用zo,展开当前tag

 

6.cscope

前面说了ctags已经建立了符号表,但是他并不知道各个符号的调用关系,所以我们用ctags只能跳转到定义处,而使用cscope就可以按照我们想要的符号关系进行跳转,比如查找所有调用此函数的地方

6.1cscope安装

sudo apt-get install cscope

6.2cscope配置

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

6.3cscope使用

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: 查找包含本文件的文件

7.syntastic

syntastic是一个静态检查工具,在你打开VIM或者保存VIM的时候,工具会自动检查并提示语法错误

7.1syntastic安装

Plugin 'scrooloose/syntastic'

7.2syntastic配置

目前使用默认配置即可

7.3syntastic使用

在保存时,如果有错误,VIM会自动进行提示,但是感觉并不好用,因为跳转之后有的文件感觉这个功能没有生效

 

8.Quickfix

VIM自带插件,可以在Make的时候自动跳转到错误的地方,同样感觉不习惯使用,个人还是习惯新打开一个窗口然后进行编译,出错的文件也肯定是之前修改过的,已经在原来窗口打开了

9.总结

有了上述功能,虽然和SourceInsight比不了,但是也是一个强大好用的IDE了,总结一下,其实我们有一个配置的vimrc文件,还有一个用于自动更新tag的脚本,全部内容如下

9.1vimrc文件内容如下

"================================
"===      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

9.2自动更新脚本文件内容如下

#!/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

可以在每个工程的根目录下创建这个脚本,然后根据不同的工程修改需要建立所以的目录和文件类型

 

你可能感兴趣的:(Linux,VIM,IDE,Vundle)