当前位置: 代码迷 >> Web前端 >> (转)制造自己的vim界面-用winmanager合并显示NERDTree和TagList
  详细解决方案

(转)制造自己的vim界面-用winmanager合并显示NERDTree和TagList

热度:787   发布时间:2012-09-13 09:51:52.0
(转)打造自己的vim界面--用winmanager合并显示NERDTree和TagList

转自:http://www.cnblogs.com/ifys/archive/2010/10/24/1860610.html

先上个图:

?
??

需要用到的插件:

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窗口。