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