2011-07-08 36 views
4

我想<leader>\打開或關閉NERDTree和Tagbar,在下列條件下:如何使用<leader> 打開或關閉NERDTree和Tagbar?

  1. 只有密切雙方如果NERDTree和Tagbar均打開
  2. 同時打開,如果NERDTree和Tagbar被關閉或者一個已經打開

到目前爲止,在vimrc裏,我有:

nmap <leader>\ :NERDTreeToggle<CR> :TagbarToggle<CR> 

這並不完全工作,S因爲如果一個被打開,另一個關閉。它會打開被關閉的那個,並關閉被打開的那個。

這是如何實現的?

+0

我不使用NERDTree或Tagbar,所以這只是假設,但我希望他們都聲明一個全局變量,而他們是開放的。因此,您可以根據這些變量的存在編寫一個函數來執行您希望的命令。然後將函數調用映射到 \。 –

回答

13

您需要使用一個函數來檢查插件窗口是否打開,然後進行相應的操作。這應該工作,也將跳轉回您開始在窗口:

function! ToggleNERDTreeAndTagbar() 
    let w:jumpbacktohere = 1 

    " Detect which plugins are open 
    if exists('t:NERDTreeBufName') 
     let nerdtree_open = bufwinnr(t:NERDTreeBufName) != -1 
    else 
     let nerdtree_open = 0 
    endif 
    let tagbar_open = bufwinnr('__Tagbar__') != -1 

    " Perform the appropriate action 
    if nerdtree_open && tagbar_open 
     NERDTreeClose 
     TagbarClose 
    elseif nerdtree_open 
     TagbarOpen 
    elseif tagbar_open 
     NERDTree 
    else 
     NERDTree 
     TagbarOpen 
    endif 

    " Jump back to the original window 
    for window in range(1, winnr('$')) 
     execute window . 'wincmd w' 
     if exists('w:jumpbacktohere') 
      unlet w:jumpbacktohere 
      break 
     endif 
    endfor 
endfunction 
nnoremap <leader>\ :call ToggleNERDTreeAndTagbar()<CR> 
+1

噢可愛!完美的作品。並感謝「跳回原始窗口功能」。我也在尋找 –

+0

你是如何發現Tagbar窗口的名字的? –

+0

好吧,我寫了Tagbar,所以我自然就知道了。但是你也可以用':echo bufname('%')'獲得當前緩衝區的名稱(這裏是我在這裏使用的名稱,而不是窗口的名稱)。 –

-1

嗯......這對我的作品中的vimrc

的切換選項將檢查窗口已經存在,所以沒有自定義功能需要(@JanLarres或貢獻者之一)必須把它添加到TagBar:d

" NERDTree 
map <leader>n :NERDTreeToggle<CR> 

" TagBar 
map <leader>t :TagbarToggle<CR>