首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

【转】用winmanager归并显示NERDTree和TagList

2012-11-01 
【转】用winmanager合并显示NERDTree和TagList这篇文章不错,转一下http://www.cnblogs.com/ifys/archive/201

【转】用winmanager合并显示NERDTree和TagList
        这篇文章不错,转一下http://www.cnblogs.com/ifys/archive/2010/10/24/1860610.html
在此做一下备份

一、taglist设置:
下载解压到相应的vim文件夹中。
vimrc中设置:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"设置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中的设置:

"""""""""""""""""""""""""""""""
"" 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:

" 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中设置:

"在进入vim时自动打开winmanager

let g:AutoOpenWinManager = 1

        就可以让winmanager自动打开。
        在winmanager.vim中修改:

        "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个窗口肯定是同时存在,所以这样还是可行的:

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中需要设置:
        let Tlist_Exit_OnlyWindow=1

        winmanager自带的fileexplorer这个插件实在是比较差。最重要的一点是fileexplorer不能自动更新,如果通过其他的途径修改了文件夹中的内容,fileexplorer是不会显示的。相对而言Nerd_Tree功能就比较强大了。下面要把Nerd_Tree加入winmanager。
        八、Nerd_tree:
        下载解压,打开NERD_tree.vim,按照winmanager的说明,在最后加入下面代码:

"Used by winmanager {{{1

let g:NERDTree_title = "[NERD Tree]"

function! NERDTree_Start()

    exe 'NERDTree'

endfunction

function! NERDTree_IsValid()

return 1

endfunction

        同时把在vimrc中:
        let g:winManagerWindowLayout='NERDTree|TagList,BufExplorer'
        原来的设置注释掉。加好后,发现每次打开winmanager都会出现一个空白的buffer。试验了好多次,但是Nerd_tree调用的函数就是会打开一个新窗口。因为如此,将bufExplorer和NERD_Tree放在一起会显示不正常。NERD_Tree放在下面的窗口也会出错,再次改winmanager的代码。

打开winmanager.vim,找到函数function! <SID>ToggleWindowsManager(),加入两行,修改后整个函数如下:

" toggle showing the explorer plugins.

function! <SID>ToggleWindowsManager()

    if IsWinManagerVisible()

        call s:CloseWindowsManager()

    else

        call s:StartWindowsManager()

"        NERD_tree need this. 打开时会有一个空白窗口,要把他关闭。

        exe 'q'

    end

endfunction
 
加个注释,以免以后忘掉了,如果不想用nerd_Tree了,这2句话还得删掉。

另外打开时的命令和关闭时的命令也得同时修改了,试验了很多次:
taglist.vim中,找到下面的代码:


        " 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
 
将这段代码修改为:

view sourceprint?

" 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中:刚才添加的自动执行命令要改为:

"set auto open Winmanager

if g:AutoOpenWinManager

"如果taglist和nerd_tree在左边
"    autocmd VimEnter * nested call s:StartWindowsManager()|exe 'q'

"如果taglist和nerd_tree在右边
    autocmd VimEnter * nested call s:StartWindowsManager()|1wincmd w|q

endif


这样所有的功能就实现了。在taglist窗口使用ctrl+n可以转换到bufexplorer窗口。

热点排行