先上个图:
需要用到的插件:
taglist需要ctags支持
ctags.exe:http://ctags.sourceforge.net/
taglist显示tag列表
taglist:http://www.vim.org/scripts/script.php?script_id=273
显示buf列表:
bufexplorer:http://www.vim.org/scripts/script.php?script_id=42
Nerd_Tree文件浏览
Nerd_tree:http://www.vim.org/scripts/script.php?script_id=1658
界面管理插件:
winmanager:http://www.vim.org/scripts/script.php?script_id=95
一、ctags:
下载解压后是源码,感觉就那个exe文件有点用。直接放到一个目录里,D:\ctags58。
设置一下环境变量。path=D:\ctags58。这样可以直接运行目录下面的ctags.exe文件。或者直接把ctags.exe放入windows的目录里。
vimrc中的设置:
1
2
|
"生成一个tags文件
nmap <F9> <Esc>:!ctags -R *<CR>
|
二、taglist设置:
下载解压到相应的vim文件夹中。
vimrc中设置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
"设置Taglist
"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
" 这项必须设定,否则出错,配置taglist的ctags路径
let Tlist_Ctags_Cmd = 'D:\ctags58\ctags.exe'
" 不同时显示多个文件的 tag ,只显示当前文件的
let Tlist_Show_One_File=1
" 如果 taglist 窗口是最后一个窗口,则退出 vim
let Tlist_Exit_OnlyWindow=1
"让当前不被编辑的文件的方法列表自动折叠起来
let Tlist_File_Fold_Auto_Close=1
"把taglist窗口放在屏幕的右侧,缺省在左侧
let Tlist_Use_Right_Window=1
"显示taglist菜单
let Tlist_Show_Menu=1
"启动vim自动打开taglist
"let Tlist_Auto_Open=1
|
启动自动打开这个选项暂时不设置。后面要让winmanager调用taglist。
三、bufexplorer:
下载解压,没啥说的。
四、winmanager:
下载解压,vimrc中的设置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "
"" winManager setting
"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "
"设置界面分割
"let g:winManagerWindowLayout = " BufExplorer,FileExplorer|TagList"
let g:winManagerWindowLayout = "TagList|FileExplorer,BufExplorer"
"设置winmanager的宽度,默认为25
let g:winManagerWidth = 30
"定义打开关闭winmanager按键
nmap <silent> <F8> :WMToggle<cr>
|
以上3个插件安装设置完毕后,基本的界面功能就可以实现了。按F8可以打开/关闭界面。同时显示taglist和fileexplorer。在fileexplorer窗口中按<c-n>可以切换到bufexplorer窗口。
上述设置好后,有3个问题:
1 我想让插件显示在右侧,但是winmanager里面没有此选项
2 进入vim时候不能自动打开winmanager,winmanager不像taglist支持该功能
3 退出时不会像只有taglist时候那样,退出当前文件就会退出vim了
经过多次修改代码终于实在了上述3个功能。
五、将插件显示在右侧
打开winmanager.vim,在function! <SID>StartWindowsManager()函数中修改:
将:wincmd H 修改为wincmd L:
1
2
3
4
5
6
7
8
9
|
" for now assume that the explorer windows always stay on the left.
" TODO: make this optional later
" make the explorers window always stay on the right ---by chenyong
" wincmd H
wincmd L
|
六、进入vim自动打开winmanager
这个功能作为可选功能,我们可以在vimrc中设置:
1
2
3
|
"在进入vim时自动打开winmanager
let g:AutoOpenWinManager = 1
|
就可以让winmanager自动打开。
在winmanager.vim中修改:
1
2
3
4
5
6
7
|
"set auto open Winmanager
if g:AutoOpenWinManager
autocmd VimEnter * nested call s:StartWindowsManager()|1wincmd w
endif
|
七、退出缓冲区时,自动退出vim
这个功能是参考了taglist的自动退出功能,在taglist.vim中修改的。
函数:function! s:Tlist_Window_Exit_Only_Window()中的winbunr(2)改为winbunr(3),即只剩2个窗口时关闭,考虑到2个窗口肯定是同时存在,所以这样还是可行的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
function! s:Tlist_Window_Exit_Only_Window()
" Before quitting Vim, delete the taglist buffer so that
" the '0 mark is correctly set to the previous buffer.
if v:version < 700
if winbufnr(3) == -1
bdelete
quit
endif
else
if winbufnr(3) == -1
if tabpagenr( '$' ) == 1
" Only one tag page is present
bdelete
quit
else
" More than one tab page is present. Close only the current
" tab page
close
endif
endif
endif
endfunction
|
同时在vimrc中需要设置:
1
|
let Tlist_Exit_OnlyWindow=1
|
winmanager自带的fileexplorer这个插件实在是比较差。最重要的一点是fileexplorer不能自动更新,如果通过其他的途径修改了文件夹中的内容,fileexplorer是不会显示的。相对而言Nerd_Tree功能就比较强大了。下面要把Nerd_Tree加入winmanager。
四、Nerd_tree:
下载解压,打开NERD_tree.vim,按照winmanager的说明,在最后加入下面代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
"Used by winmanager {{{1
let g:NERDTree_title = "[NERDTree]"
function! NERDTree_Start()
exe 'NERDTree'
endfunction
function! NERDTree_IsValid()
return 1
endfunction
|
同时把在vimrc中:
1
|
let g:winManagerWindowLayout= 'NERDTree|TagList,BufExplorer'
|
原来的设置注释掉。加好后,发现每次打开winmanager都会出现一个空白的buffer。试验了好多次,但是Nerd_tree调用的函数就是会打开一个新窗口。因为如此,将bufExplorer和NERD_Tree放在一起会显示不正常。NERD_Tree放在下面的窗口也会出错,实在比较郁闷。。。。看了下NERD_Tree的代码,没看懂,只好再次改winmanager的代码了。
打开winmanager.vim,找到函数function! <SID>ToggleWindowsManager(),加入两行,修改后整个函数如下:
1
2
3
4
5
6
7
8
9
10
11
|
" toggle showing the explorer plugins.
function! <SID>ToggleWindowsManager()
if IsWinManagerVisible()
call s:CloseWindowsManager()
else
call s:StartWindowsManager()
" NERD_tree need this. 打开时会有一个空白窗口,要把他关闭。
exe '1wincmd w'
exe 'q'
end
endfunction
|
加个注释,以免以后忘掉了,如果不想用nerd_Tree了,这2句话还得删掉。
另外打开时的命令和关闭时的命令也得同时修改了,试验了很多次:
taglist.vim中,找到下面的代码:
1
2
3
4
5
|
" Exit Vim itself if only the taglist window is present (optional)
" if g:Tlist_Exit_OnlyWindow
" autocmd BufEnter __Tag_List__ nested
" \ call s:Tlist_Window_Exit_Only_Window()
" endif
|
将这段代码修改为:
1
2
3
4
5
6
7
8
9
10
11
|
" Exit Vim itself if only the taglist window is present (optional)
let s:NERDTreeBufName = 'NERD_tree_'
if g:Tlist_Exit_OnlyWindow
augroup Exit_onlywindow
"当进入Nerd_Tree的buffer时也检测是否需要退出
exec "autocmd BufEnter " . s:NERDTreeBufName .
\ "* call s:Tlist_Window_Exit_Only_Window()"
autocmd BufEnter __Tag_List__ nested
\ call s:Tlist_Window_Exit_Only_Window()
augroup end
endif
|
winmanager中:刚才添加的自动执行命令要改为:
1
2
3
4
5
|
"set auto open Winmanager
if g:AutoOpenWinManager
" autocmd VimEnter * nested call s:StartWindowsManager()|1wincmd w
autocmd VimEnter * nested call s:StartWindowsManager()|1wincmd w|q
endif
|
这样所有的功能就实现了。在taglist窗口使用ctrl+n可以转换到bufexplorer窗口。