Как открыть или закрыть NERDTree и Tagbar с помощью <leader>\? - PullRequest
4 голосов
/ 08 июля 2011

Я хочу, чтобы <leader>\ открывал или закрывал NERDTree и Tagbar, при следующих условиях:

  1. Закрывал оба, только если открыты оба NERDTree и Tagbar
  2. Открывал оба, если NERDTreeи Tagbar закрыты ИЛИ, если он уже открыт

Пока что в VIMRC у меня есть:

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

, который не совсем работает, так как если он открыт,а другой закрыт.Он откроет тот, который был закрыт, и закроет тот, который был открыт.

Как этого достичь?

Ответы [ 2 ]

13 голосов
/ 08 июля 2011

Вам необходимо использовать функцию, которая проверяет, открыты ли окна плагинов или нет, а затем действует соответствующим образом. Это должно сработать, а также вернуться к окну, в котором вы начали:

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>
0 голосов
/ 23 апреля 2014

хмм ... у меня это работает в vimrc

Параметр переключения проверяет, существует ли уже окно, поэтому не требуется настраиваемая функция (@JanLarres или один из участников), чтобы добавить его в TagBar: D

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

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