Vim: Como sincronizar o NERDTree com o caminho atual do arquivo da aba aberta?

50

Quando eu abro uma nova aba com um caminho diferente do arquivo anterior no VIM, o NERDTree ainda permanece a mesma hierarquia de diretórios do arquivo anterior.

Existe um atalho de sincronização para alterar o diretório raiz atual para o diretório do novo arquivo aberto?

    
por Jichao 02.10.2010 / 05:57

8 respostas

10

Não tenho certeza se existe uma maneira específica do NERDTree para fazer isso, mas você sempre pode configurar o Vim para que ele defina diretório de trabalho para o diretório do arquivo atual :

autocmd BufEnter * lcd %:p:h

Agora tudo o que você precisa fazer depois de abrir um arquivo em uma nova guia é :NERDTreeToggle na nova guia.

    
por 02.10.2010 / 22:40
103

Eu uso o mapeamento a seguir para visualizar o buffer atual no NERDTree:

 map <leader>r :NERDTreeFind<cr>
    
por 09.11.2010 / 00:10
21

Eu encontrei as duas respostas educacionais existentes e combinei as duas com sucesso, para que o comportamento seja mais como muitas pessoas esperariam de um IDE: Clique em uma janela / buffer aberto e tenha esse arquivo destacado no NERDTree. Eu coloquei isso no meu ~ / .vimrc:

autocmd BufEnter * if &modifiable | NERDTreeFind | wincmd p | endif

O que isso faz:

  1. autocmd BufEnter - é executado toda vez que você se concentra em um buffer (incluindo a janela NERDTree)
  2. if &modifiable - quando você clica na janela NERDTree, não faz mais nada (a janela NERDTree não é modificável)
  3. wincmd p - NERDTreeFind deixa o cursor focado no NERDTree; isso muda para a janela que você focou originalmente em

Note que isto não funcionará em qualquer outro buffer que não seja modificável - mas isso geralmente é uma coisa boa; de outra forma (por exemplo) sempre que você obtivesse :help no vim, o NERDTree encontraria e focaria o diretório onde os arquivos de ajuda estão armazenados - provavelmente não é algo que você queira fazer.

Essa solução de uma linha funcionou muito bem para mim no início, mas logo descobri que isso faz com que o NERDTree seja ativado sempre que abro um arquivo - e, como resultado, ele impede que o NERDTree seja fechado! Se você não quiser usar o NERDTree em tempo integral, coloque isso no seu .vimrc:

" returns true iff is NERDTree open/active
function! rc:isNTOpen()        
  return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1)
endfunction

" calls NERDTreeFind iff NERDTree is active, current window contains a modifiable file, and we're not in vimdiff
function! rc:syncTree()
  if &modifiable && rc:isNTOpen() && strlen(expand('%')) > 0 && !&diff
    NERDTreeFind
    wincmd p
  endif
endfunction

autocmd BufEnter * call rc:syncTree()
    
por 14.09.2012 / 21:41
20

jogue um sinal de% no final como um chefe

:NERDTree %

Eu tenho isso no meu .vimrc, ele mapeia Ctrl + o para alternar nerdtree no diretório do buffer atual:

map <C-o> :NERDTreeToggle %<CR>

    
por 16.03.2013 / 19:14
2

Me deparei com essa pergunta ontem, depois de algumas horas de pesquisa. Enviei Solicitação de solicitação para < href="https://github.com/scrooloose/nerdtree"> repositório nerdtree da scrooloose introduzindo um comando NERDTreeCWD que altera a raiz da árvore NERD para o diretório de trabalho atual (Atualização em 2012-11-12: The PR foi mesclado no mestre de upstream, deve ser utilizável em uma versão atualizada). Com essa mudança, essa questão pode ser simplesmente resolvida pelo seguinte código.

autocmd BufEnter * silent! if bufname('%') !~# 'NERD_tree_' | cd %:p:h | NERDTreeCWD | wincmd p | endif

Compare com a abordagem NERDTreeFind do @ shinzui e @ Lambart, isso faz exatamente o que a pergunta foi feita. Usar NERDTreeFind mudará a posição de rolagem do nerdtree e o resultado nem sempre será o mesmo (Se o CWD estiver na raiz da árvore NERD, ele simplesmente expandirá o nó, mudando para ele).

Compare com a resposta de @Yaser Sulaiman, esta solução sempre tem uma janela de árvore NERD aberta e pode ser facilmente codificada. Se uma janela da árvore NERD já tiver sido aberta, usar NERDTreeToggle precisará ser acionado duas vezes (primeiro feche a existente e abra-a novamente), infelizmente, a segunda abertura ignorará todo o processamento da cwd.

    
por 05.11.2012 / 00:53
1

Isso se comporta como :NERDTreeToggle , mas mostrará o arquivo atualmente aberto no NERDTree. Se você ainda não abriu um arquivo (ou seja, você acabou de digitar vim na sua linha de comando) NERDTree mostra /home .

Coloque isso no seu .vimrc:

" Open NERDTree in the directory of the current file (or /home if no file is open)
nmap <silent> <C-i> :call NERDTreeToggleInCurDir()<cr>
function! NERDTreeToggleInCurDir()
  " If NERDTree is open in the current buffer
  if (exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1)
    exe ":NERDTreeClose"
  else
    exe ":NERDTreeFind"
  endif
endfunction
    
por 22.01.2015 / 17:41
1

Eu aplico as duas soluções de Altere o diretório atual usando NERDTree : use cd para definir o diretório de trabalho NERDTree para o diretório diretório atual e C para definir o nó raiz NERDTree para o diretório atual

    
por 31.01.2018 / 11:45
0

Acho que este plug-in é o que você deseja link

    
por 30.08.2013 / 06:45