现在的位置: 首页 > 综合 > 正文

VIM5:利用vundle打造经典IDE

2018年03月18日 ⁄ 综合 ⁄ 共 6101字 ⁄ 字号 评论关闭

在上篇文章里讲了 vundle ,这次我们用 vundle 打造vim利器

 声明:  $xxxxx 表示shell命令    :xxxxx 表示vim命令

1.  由于在下面的插件中需要ctags程序,所以我们这里先打造好ctags环境

ctags

 

      tags文件(标签文件)可是程序员的看家宝呀, 你可以不用它, 但你不能不知道它, 因为Linux内核源码都提供了"make tags"这个选项.

   tags文件是由ctags程序产生的一个索引文件, ctags程序其时叫"Exuberant Ctags", 是Unix上面ctags程序的替代品, 并且比它功能强大, 是大多数Linux发行版上默认的ctags程序。Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号(tag/symbol),如变量名、函数名等。下面插件中tags文件就是Tagbar和OmniCppComplete工作的基础。如果你在读程序时看了一个函数调用, 或者一个变量, 或者一个宏等等, 你想知道它们的定义在哪儿, 现在流行用是的<C-]>, 当光标在某个函数或变量上时, 按下"Ctrl+]", 光标会自动跳转到其定义处。这个功能就是可以由ctags程序来帮助实现。

 

查查你电脑里有没有ctags这个程序。

方法:

$ ctags --version

我的 ubuntu12.04没有,所以用如下命令安装

$ sudo apt-get install exuberant-ctags
$ ctags --version

结果显示装好了

Exuberant Ctags 5.9~svn20110310, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Nov  9 2011, 17:40:39
  Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
  Optional compiled features: +wildcards, +regex

如果没有或者有但版本低于5.6,那建议你去装个高版本

下载地址: http://ctags.sourceforge.net  安装和普通软件一样,不再赘述

 

由于vim的某些插件需要将tags文件,所以要用ctags生成tags文件,这样viim会自动调用,下面看如何生成tags文件

方法一:在vimrc中增加一句

"设置ctags的快捷键为 Ctrl-F12
map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>  

               然后,进入源码的根目录,打开vim,按下ctrl-F12,会自动生成tags文件并自动加载到vim,以后可以跳转到定义处了。

方法二:进入源码根目录,执行

$ctags -R

命令,就会生成tags文件,然后用vim打开源程序,并执行

:set tags = /..../tags 

 /..../tags  这表示你的tags文件路径 

此时tags文件加载进vim了,可以跳转了。

ctags的使用

                 快捷键:Ctrl-]    跳转到光标所在符号的定义。

               Ctrl-t    回到上次跳转前的位置。

        更多功能通过命令man ctags或在Vim命令行下运行help ctags查询

                 注意:tags文件不会自动更新,所以当你中途修改了代码时,应该手动重新生成tags文件,vim会随时更新加载tags文件所以不用重启。

 2. 插件的安装:注意要添加到vimrc文件中的内容我用代码形式表示出来

       在https://github.com/vim-scripts里面可以找插件

添加vim-scripts里面插件(注意插件名称要跟仓库的一致)

"提供多文件同时编辑功能,操作缓存buffer窗口
Bundle 'minibufexplorerpp'         
let g:miniBufExplMapWindowNavVim = 1 "Ctrl-<hjkl> to move to window 
let g:miniBufExplTabWrap = 1 " make tabs show complete (no broken on two lines)

这样就可以使用 minibuf explorerpp了,

Ctrl-h/j/k/l 在各个窗口中切换,其中minibuf 占用的就是一个窗口,你可以用 Ctrl-k 切换到其上

 在minibuf窗口中用<tab>、<shitf - tab> 循环选择 buffer,按 d 则删除该 buffer 

按 <enter> e o 都是在原窗口打开 buffer

s 水平方向分隔原来窗口打开
v 垂直方向分隔原来窗口打开

每个 buffer 名称前都有个数字,那是 buffer 的编号,因此,可以输入 :b <buffer编号> 来快速切换

下面红色部分是网友写的一个快捷键的设置,我没用,如果大家想用的话可以看看,但是要注意不要跟别的冲突

先自声明,本人是个懒种,因此设定了几个快捷键:
<F1> 切换至前一缓冲区
<F2> 切换至后一缓冲区
<F3> 保存缓冲区(:update 罗)
<F4> 关闭缓冲区(:bd,或 :bdelete,删除缓冲区)
脚本如下:

nnoremap <F1> :call MyCyclebuffer(0)<CR>

nnoremap <Leader>1 :call MyCyclebuffer(0)<CR>

inoremap <F1> <ESC>:call MyCyclebuffer(0)<CR>

nnoremap <F2> :call MyCyclebuffer(1)<CR>

nnoremap <Leader>2 :call MyCyclebuffer(1)<CR>

inoremap <F2> <ESC>:call MyCyclebuffer(1)<CR>

" Cycle Through buffers 

" from MiniBufExplorer, modified by DJW

function! MyCyclebuffer(forward)

" Change buffer (keeping track of before and after buffers)

let l:origBuf = bufnr(''%'')

if (a:forward == 1)

bn!

else

bp!

endif

let l:curBuf = bufnr(''%'')

" Skip any non-modifiable buffers, but don''t cycle forever

" This should stop us from stopping in any of the [Explorers]

while getbufvar(l:curBuf, ''&modifiable'') == 0 && l:origBuf != l:curBuf

if (a:forward == 1)

bn!

else

bp!

endif

let l:curBuf = bufnr(''%'')

endwhile

endfunction

 

" <F4> delete buffer

nnoremap <F4> :bd<CR>

nnoremap <Leader>4 :bd<CR>

inoremap <F4> <ESC>:bd<CR>

 

" <F3> or Ctrl-S update buffer

nnoremap <C-S> :update<CR>

inoremap <C-S> <C-O>:update<CR>

vnoremap <C-S> <C-C>:update<CR>

nnoremap <F3> :update<CR>

inoremap <F3> <C-O>:update<CR>

"提供源代码符号的结构化视图,这个插件需要tags文件的支持
Bundle 'majutsushi/tagbar' 

nmap <F4> :TagbarToggle<CR>   "设置快捷键,按下F4即可显示列表  
let g:tagbar_autofocus = 1    
let g:tagbar_width = 30       "设置宽度,默认为30  
autocmd VimEnter * nested :call tagbar#autoopen(1)    "打开vim时自动打开tagbar  
let g:tagbar_left = 1         "在左侧  
"let g:tagbar_right = 1        "在右侧  

在终端运行命令  apt-get install cscope  安装cscope

"对cscope的支持
"Bundle  'cscope-quickfix'  
"设定使用 quickfix 窗口来显示 cscope 的查询结果
set cscopequickfix=s-,c-,d-,i-,t-,e- 
"切换到下一个结果
nmap <F6> :cn<cr>
"切换到上一个结果
nmap <F7> :cp<cr>
silent! execute "!find . -name '*.h' -o -name '*.c' -o -name '*.cpp' -o -name '*.java' -o -name '*.cs' > cscope.files"
silent! execute "!cscope -Rbkq "

if has("cscope") 
	set csprg=/usr/bin/cscope              "指定用来执行 cscope 的命令 
	set csto=1                             "先搜索tags标签文件,再搜索cscope数据库 
	set cst                                "使用|:cstag|(:cs find g),而不是缺省的:tag 
	set nocsverb                           "不显示添加数据库是否成功 
" add any database in current directory 
	if filereadable("cscope.out") 
"添加cscope数据库 
		execute "cs add cscope.out"                   
	endif 
	set csverb                             "显示添加成功与否 
endif

"cscope插件:查询符号的调用和定义位置等,已经集成到vim里面,这里只是映射快捷键"<C-_>g的按法是先按"Ctrl+Shift+-", 然后很快再按"g"
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> "查找本 C 符号(可以跳过注释)
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR> "查找本定义
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> "查找调用本函数的函数
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> "查找本字符串
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> "查找本 egrep 模式
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR> "查找本文件
nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR> "查找包含本文件的文件
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> "查找本函数调用的函数

"在Vim命令行下运行cw命令,就能在编辑区下面quickfix窗口看到所有查找结果的列表

nmap <F6> :cn<cr>切换到下一个结果

nmap <F7> :cp<cr>切换到上一个结果

"提供树形浏览文件系统的界面

Bundle 'The-NERD-tree'             

" 在 vim 启动的时候默认开启 NERDTree(autocmd 可以缩写为 au)

autocmd VimEnter * NERDTree

map <F3> :NERDTreeMirror<CR>

map <F3> :NERDTreeToggle<CR>

 ”按F3即可显示或隐藏NerdTree区域了。

和编辑文件一样,通过h j k l移动光标定位

o 打开关闭文件或者目录,再按就是关闭目录,如果是文件的话,光标出现在打开的文件中

go 效果同上,不过光标保持在文件目录里,类似预览文件内容的功能

i和s可以水平分割或纵向分割窗口打开文件,前面加g类似go的功能

t 在标签页中打开文件,并跳到标签

T 在后台标签页中打开,但不跳

p 到上层目录

P 到根目录

K 到同目录第一个节点

J 到同目录最后一个节点

m 显示文件系统菜单(添加、删除、移动操作)

? 帮助

 这个插件的常用快捷键.
常用快捷键:
o - 打开所选文件或目录
enter - 相当于o
go - 类似o, 但光标仍然停留在NERD_tree
t - 在新标签中打开所选文件
T - 类似t, 但光标仍然停留在NERD_tree
i - 在一个水平分割窗口中打开文件
gi - 类似i, 但光标仍然停留在NERD_tree
s - 在一个垂直分割窗口中打开文件 |NERDTree-s|
gs - 类似s, 但光标仍然停留在NERD_tree
O - 递归打开所选目录

在使用中如果发现nerdtree显示列表时,名称前面有 ?则做如下修改:

编辑NERD_tree.vim,找到这句call s:initVariable("g:NERDTreeDirArrows", !s:running_windows) ,把那个"!"去掉试试

 set completeopt=longest,menu

"主要提供输入时实时提供类或结构体的属性或方法的提示和补全,该插件需要安装较高版本ctags

Bundle 'OmniCppComplete'      

 

"使Tab快捷键具有更快捷的上下文提示功能

Bundle 'SuperTab'             

let g:SuperTabRetainCompletionType=2

let g:SuperTabDefaultCompletionType="<C-X><C-O>" "以后当你准备按"Ctrl+X Ctrl+O"的时候直接按<Tab>就好了, 够爽吧

 

"函数原型显示

Bundle 'echofunc.vim'

 

 

 

"PowerLine插件 状态栏增强展示

Bundle 'Lokaltog/vim-powerline'

"vim有一个状态栏 加上powline则有两个状态栏

set laststatus=2

set t_Co=256

let g:Powline_symbols='fancy'

 

 

"用于显示黑客帝国里面的字母屏幕,挺好玩的,哈哈

Bundle 'matrix.vim'

matrix使用

:Matrix

 

如果大家有什么好的插件或者使用方法,欢迎大家评论

 

 


抱歉!评论已关闭.