将vim打造成IDE编译环境——自己用的vim(gvim)插件

来源:互联网 发布:美国衰落了吗 知乎 编辑:程序博客网 时间:2024/05/18 03:46
网上经过多方搜索,在前大神们的指导下,终于让自己的vim有了一点雏形。但是网上的一些教程难免有笔误,或者是与自己不符的地方,特此立文,防止重装环境后不好找这些插件。
主要参考: http://blog.csdn.net/tge7618291/article/details/4216977 
                  http://blog.csdn.net/wooin/article/details/1858917 
#=============================================================================
1. 查看 key 相关信息说明的命令  :help keycodes
 10 
 11 #=============================================================================
 12 2. ctags
 13 (1). 帮助手册查看
 14     :help usr_29
 15 
 16 (2). 功能
 17     ctags的功能, 只要在unix/linux环境编程过的人都知道它的历害! 我在这也作个小
 18     小介绍吧ndow=0: 对浏览代码非常的方便, 可以在函数, 变量之间跳来跳去等等.(注
 19             意: 我这里说到的仅是小小的一部分!).
 20 
 21 (3). 安装
 22     首先, 下载ctags安装包, 然后解压并安装, 命令如下:
 23     $ tar -xzvf ctags-5.6.tar.gz
 24     $ cd ctags-5.6
 25     $ make
 26     # make install   // 需要root权限
 27         或:
 28         $ tar -xzvf ctags-5.7.tar.gz
 29         $ cd ctags-5.7
 30         $ ./configure
 31         # make
 32         # make install
 33 
 35 (4). 使用方法
 36     然后去你的源码目录, 如果你的源码是多层的目录, 就去最上层的目录, 在该目录下
 37     运行命令: ctags -R
 38     我现在以 vim71 的源码目录做演示
    (此处可以用脚本,把ctags跟cscope要生成的东东一起生成 
 39     $ cd /home/nuoerll/vim71
 40     $ ctags -R
 41 
 42     此时在/home/nuoerll/vim71目录下会生成一个 tags 文件, 现在用vim打开
 43     /home/nuoerll/vim71/src/main.c
 44     $ vim /home/nuoerll/vim71/src/main.c
 45     
 46     再在vim中运行命令:
 47     :set tags=/home/nuoerll/vim71/tags
 48     该命令将tags文件加入到vim中来, 你也可以将这句话放到~/.vimrc中去, 如果你经
 49     常在这个工程编程的话.
 50     对于经常在不同工程间编程, 可以在.vimrc中设置:
 51         set tags=tags
 52         set autochdir  "这句即使不用ctags也要加。跳转到当前目录
 53 
 54 (5). 使用例子
 55     把光标定位到某一函数名上, 按下 Ctar + ], vim就可以自动切换到该函数定义处!
 56     要返回只需要按下Ctrl + t .
 57     更多用法, 在vim命令模式输入 :help usr_29 查看即可.
 58 
 59 
 60 #=============================================================================
 61 3. TagList 插件
 62 (1). 帮助手册查看
 63     :help taglist.txt
 64 
 65 (2). 功能
 66     高效地浏览源码, 其功能就像vc中的workpace, 那里面列出了当前文件中的所有宏,
 67     全局变量, 函数名等.
 68 
 69 (3). 安装
 70     下载taglist压缩包, 然后把解压的两个文件taglist.vim 和 taglist.txt 分别放到
 71     $HOME/.vim/plugin 和 $HOME/.vim/doc 目录中.
 72 
 73 (4). 使用方法
 74     首先请先在你的~/.vimrc文件中添加下面语句:
 75         let Tlist_Ctags_Cmd='/usr/bin/ctags' "此处是ctags的安装目录
 76         let Tlist_Show_One_File=1
 78         let Tlist_OnlyWindow=1
 79         let Tlist_Use_Right_Window=0
 80         let Tlist_Sort_Type='name'
 81         let Tlist_Exit_OnlyWindow=1
 82         let Tlist_Show_Menu=1
 83         let Tlist_Max_Submenu_Items=10
 84         let Tlist_Max_Tag_length=20
 85         let Tlist_Use_SingleClick=0
 86         let Tlist_Auto_Open=0
 87         let Tlist_Close_On_Select=0
 88         let Tlist_File_Fold_Auto_Close=1
 89         let Tlist_GainFocus_On_ToggleOpen=0
 90         let Tlist_Process_File_Always=1
 91         let Tlist_WinHeight=10
 92         let Tlist_WinWidth=18
 93         let Tlist_Use_Horiz_Window=0
 94 
 95     
 96     此时用vim打开一个c源文件试试:
 97     $ vim ~/vim/src/main.c
 98     
 99     进入vim后用下面的命令打开taglist窗口.
100     :Tlist
101 
102     为了更方便地使用, 可以在.vimrc文件中加入:
103         map <silent> <leader>tl :TlistToggle<CR>
104     这样就可以用 ",tl" 命令进行taglist窗口的打开和关闭之间方便切换了. // 这里
105     的","是我.vimrc设置的leader, 你也可以设置成别的, 在.vimrc中修改即可, 如我
106     的: let mapleader=",
107         
108     
109 #=============================================================================
110 4. WinManager 插件
111 (1). 帮助手册查看
112     :help winmanager
113 
114 (2). 功能
115     管理各个窗口, 或者说整合各个窗口.
116 
117 (3). 安装
118     下载WinManager.zip压缩包, 解压后把*.vim文件放到 $HOME/.vim/plugin 目录中,
119     把*.txt文件放到 $HOME/.vim/doc 目录中.
120 
121 (4). 使用方法
122     在.vimrc中加入如下设置:
123     let g:winManagerWindowLayout='FileExplorer'  // 这里可以设置/
124     为多个窗口, 如'FileExplorer|BufExplorer|TagList'
125     let g:persistentBehaviour=0             // 只剩一个窗口时, 退出vim.
126     let g:winManagerWidth=20
127     let g:defaultExplorer=1
128     nmap <silent> <leader>fir :FirstExplorerWindow<cr>
129     nmap <silent> <leader>bot :BottomExplorerWindow<cr>
130     nmap <silent> <leader>wm :WMToggle<cr>
131 
132 (5). 使用例子
133     在终端输入vim启动vim:
134     $vim
135     在正常模式下, 敲入 ",wm" 即可看到, vim的左侧新建了两个窗口:FileExplorer和
136     BufExplorer, 这样我们即可在FileExplorer窗口很方便地对目录进行查看, 编辑等
137     操作; 在BufExplorer窗口中查看当前vim已经打开那些文件.
138 
139 
140 #=============================================================================
141 5. cscope
142 (1). 帮助手册查看
143     :help if_cscop.txt
144 
145 (2). 功能
146     用Cscope自己的话说 - "你可以把它当做是超过频的ctags", 其功能和强大程度可见
147     一斑吧, 关于它的介绍我就不详细说了, 如果你安装好了前文介绍的帮助手册.
148 
149 (3). 安装
150     如果是在linux环境中, cscope一般都会随系统一起安装了; 在windows环境中, 则需
151     要下载windows版本的(cscope.exe), 然后把它放到path环境变量所设
152     置的目录中(如: C:/Program Files/Vim/vim72).
153 
154 (4). 使用方法
155     在.vimrc中增加如下设置, 就可以利用相应的快捷键进行不同的查找了.
156         if has("cscope")
157             set cscopetag   " 使支持用 Ctrl+]  和 Ctrl+t 快捷键在代码间跳来跳去
158             " check cscope for definition of a symbol before checking ctags:
159             " set to 1 if you want the reverse search order.
160             set csto=1
161 
162             " add any cscope database in current directory
163             if filereadable("cscope.out")
164                 cs add cscope.out
165             " else add the database pointed to by environment variable
166             elseif $CSCOPE_DB !=""
167                 cs add $CSCOPE_DB
168             endif
169 
170             " show msg when any other cscope db added
171             set cscopeverbose
172 
173             nmap <C-/>s :cs find s <C-R>=expand("<cword>")<CR><CR>
174             nmap <C-/>g :cs find g <C-R>=expand("<cword>")<CR><CR>
175             nmap <C-/>c :cs find c <C-R>=expand("<cword>")<CR><CR>
176             nmap <C-/>t :cs find t <C-R>=expand("<cword>")<CR><CR>
177             nmap <C-/>e :cs find e <C-R>=expand("<cword>")<CR><CR>
178             nmap <C-/>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
179             nmap <C-/>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
180             nmap <C-/>d :cs find d <C-R>=expand("<cword>")<CR><CR>
181         endif
182 
183 (5). 使用例子
184     首先进入源码目录, 在linux终端中输入以下命令以创建cscope数据库:
185         $ find ~/work/..Project/ -name "*.h" -o -name "*.cpp" > cscope.files
186         $ cscope -bkq -i cscope.files
         (此处可以用脚本,把ctags跟cscope要生成的东东一起生成,脚本如下
######################脚本 start##################################   
               #!/bin/sh
               find . -name "*.h" -o -name "*.c"-o -name "*.cc" > cscope.files
               cscope -bkq -i cscope.files
               ctags -R
########################脚本 end###################################
191     然后, 用vim打开一个源文件(如: vim main.cpp),
192     打开后, 第一件事就是导入cscope数据库了:
193         :cs add /home/yourname/workpace/cscope.out /home/yourname/workpace
194 
195     cscope数据库导入成功后, 就可以利用"步骤(4)"中定义的快捷键进行相关的查找,
196     浏览等操作了(当然也可以直接利用相关命令, 嘿嘿).
197 
198 =============================================================================

6. MiniBufExplorer
下载地址http://www.vim.org/scripts/script.php?script_id=159
版本6.3.2安装将下载的 minibufexpl.vim文件丢到 ~/.vim/plugin 文件夹中即可手册
在minibufexpl.vim 文件的头部

在编程的时候不可能永远只编辑一个文件, 你肯定会打开很多源文件进行编辑, 如果每个文件都打开一个vim进行编辑的话那操作起来将是多麻烦啊, 所以vim有buffer(缓冲区)的概念, 可以看vim的帮助:
:help buffer
vim自带的buffer管理工具只有:ls, :bnext, :bdelete 等的命令, 既不好用, 又不直观. 现在隆重向你推荐一款vim插件(plugin): MiniBufExplorer

使用方法:
重新启动vim, 当你只编辑一个buffer的时候
MiniBufExplorer派不上用场, 当你打开第二个buffer的时候, MiniBufExplorer窗口就自动弹出来了, 见下图:

(--- 图13 ---)
上面那个狭长的窗口就是MiniBufExplorer窗口, 其中列出了当前所有已经打开的buffer, 当你把光标置于这个窗口时, 有下面几个快捷键可以用:
<Tab>向前循环切换到每个buffer名上<S-Tab>向后循环切换到每个buffer名上<Enter>在打开光标所在的bufferd删除光标所在的buffer
以下的两个功能需要在~/.vimrc中增加:
let g:miniBufExplMapCTabSwitchBufs = 1
<C-Tab>向前循环切换到每个buffer上,并在但前窗口打开<C-S-Tab>向后循环切换到每个buffer上,并在但前窗口打开
如果在~/.vimrc中设置了下面这句:
let g:miniBufExplMapWindowNavVim = 1则可以用<C-h,j,k,l>切换到上下左右的窗口中去,就像:
C-w,h j k l    向"左,下,上,右"切换窗口.
在~/.vimrc中设置:
let g:miniBufExplMapWindowNavArrows = 1是用<C-箭头键>切换到上下左右窗口中去
加上插件minibufexplorer.vim之后,总会有这种情况,多个窗口,其他插件总是不能和minibufexplorer.vim好好相处,
总会有多个窗口的错误,尤其是切换buffer时,这时在~/.vimrc可以加上下面这句:
let g:miniBufExplorerMoreThanOne=0

7. taglist与minibufexpl冲突解决

参考:http://blog.csdn.net/yysolo/article/details/1476048

这两个plugin在 www.vim.org 是排名前两位的(by rating),但是所谓鱼与熊掌不可兼得,minibufexpl与taglist合用时还是存在一点小问题。

在切换buffer时,如果之前焦点定位于taglist的窗口中,minibufexpl会毫不客气地在taglist的窗口中载入文件。为了解决这一点瑕疵,我对minibufexpl做了一点小修正。

请用以下代码替换原函数MBESelectBuffer()

" MBENeedNextWindow - From the MBE window, test window under the cursor {{{
"
 
"
 If we are in our explorer, then we attempt to open the buffer under the
"
 cursor in the previous window.
"
function! <SID>MBENeedNextWindow()
  
if bufname('%'== '-MiniBufExplorer-' ||bufname('%'== '__Tag_List__' || (g:miniBufExplModSelTarget == 1 && getbufvar(bufnr('%'), '&modifiable'== 0)
    
return 1
  
else
    
return 0
  endif
endfunction

" }}}
"
 MBESelectBuffer - From the MBE window, open buffer under the cursor {{{
"
 
"
 If we are in our explorer, then we attempt to open the buffer under the
"
 cursor in the previous window.
"
function! <SID>MBESelectBuffer()
  call 
<SID>DEBUG('===========================',10)
  call 
<SID>DEBUG('Entering MBESelectBuffer()' ,10)
  call 
<SID>DEBUG('===========================',10)

  
" Make sure we are in our window
  if bufname('%'!= '-MiniBufExplorer-'
    call 
<SID>DEBUG('MBESelectBuffer called in invalid window',1)
    
return 
  endif

  let l:save_rep 
= &report
  let l:save_sc  
= &showcmd
  let 
&report    = 10000
  
set noshowcmd 
  
  let l:bufnr  
= <SID>GetSelectedBuffer()
  let l:resize 
= 0

  
if(l:bufnr != -1)             " If the buffer exists.

    let l:saveAutoUpdate 
= g:miniBufExplorerAutoUpdate
    let g:miniBufExplorerAutoUpdate 
= 0
    
" Switch to the previous window
    wincmd p
    
    let curbufname 
= bufname('%')
    
" If we are in the buffer explorer or in a nonmodifiable buffer with
    " g:miniBufExplModSelTarget set then try another window (a few times)

    
while <SID>MBENeedNextWindow()
        wincmd w
        
if bufname('%'== curbufname
            
break
        endif
    endwhile
    
" The following handles the case where -MiniBufExplorer-
    " is the only window left. We need to resize so we don't
    " end up with a 1 or two line buffer. 
    if bufname('%'== '-MiniBufExplorer-'
        let l:resize 
= 1
    endif

    exec(
'b! '.l:bufnr)
    
if (l:resize)
      resize
    endif
    let g:miniBufExplorerAutoUpdate 
= l:saveAutoUpdate
    call 
<SID>AutoUpdate(-1)

  endif

  let 
&report  = l:save_rep
  let 
&showcmd = l:save_sc

  call 
<SID>DEBUG('===========================',10)
  call 
<SID>DEBUG('Completed MBESelectBuffer()',10)
  call 
<SID>DEBUG('===========================',10)

endfunction


=====================================有用的vimrc设置 START====================================================
set nu "显示行号
set background=light "
设定字体顔色模式,light使字体以较暗的顔色显示出来,适用于亮色系的背景;dark使字体以较亮的顔色显示出来,适用于暗色系的背景
set cindent "编程时c语言自动缩进
set cino=j1 "
设定c/c++自动缩进的风格
set fileencodings=utf8,gb18030,big5,gb2312 "支持的字符编码
set formatoptions=rotcql "
设置Vim中文本和注释的换行方式
set incsearch "
输入查找内容的同时,vim就开始对输入的内容进行匹配,并显示匹配的位置
set hlsearch "对匹配的所有项目进行高亮显示
set ignorecase "
在查找时忽略大小写
set nocompatible "去掉有关vi一致性模式,避免以前版本的一些bug和局限
set shiftwidth=4 "
反向制表符中的空格数目
set tabstop="指定tab缩进的字符数目
set smarttab "
解决shiftwidth和tabstop不等时的麻烦
set wildmenu "自动补全命令时候使用菜单式匹配列表
set mouse=a "
使用鼠标

syntax on "开启语法高亮
filetype plugin indent on "
打开文件类型检测功能

let mapleader =","
let g:mapleader =","

"tags setup
if has("
ctags")
    if filereadable("
tags")
        set tags=tags
    endif
endif

"
Tlist setup
let Tlist_Ctags_Cmd ='/usr/bin/ctags'"设定linux系统中ctags程序的位置
let Tlist_Sort_Type = "
name" "使taglist以tag名字进行排序
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1 "
如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口 
let Tlist_Use_SingleClick = 1 "
单击tag就跳转
let Tlist_WinWidth = 15 "taglist窗口的宽度
map <silent> <leader>tl :TlistToogle<cr>

"
LookupFile setup
let g:LookupFile_MinPatLength = 2 "最少输入2个字符才开始查找
let g:LookupFile_PreserveLastPattern = 0 "
不保存上次查找的字符串
let g:LookupFile_PreservePatternHistory = 1 "保存查找历史
let g:LookupFile_AlwaysAcceptFirst = 1 "
回车打开第一个匹配项目
let g:LookupFile_AllowNewFiles = 0 "不允许创建不存在的文件

"
cscope setup
if has("cscope")
    set csprg=/usr/bin/cscope
    set csto=1
    set cst
    set nocsverb
    if filereadable("cscope.out")
        cs add cscope.out
    endif
    set csverb
endif
========================================有用的vimrc设置 END=================================================
(未完待续)

原创粉丝点击