Vim: Como sincronizar o NERDTree com o caminho atual do arquivo de guia aberto?

60

Quando abro uma nova guia com caminho diferente do arquivo anterior no VIM, o NERDTree continuará sendo a mesma hierarquia de diretórios do arquivo anterior.

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

Jichao
fonte

Respostas:

116

Eu uso o seguinte mapeamento para visualizar o buffer atual no NERDTree:

 map <leader>r :NERDTreeFind<cr>
shinzui
fonte
3
Acho isso muito útil e fui ao meu .vimrc. Eu queria usar alguma outra encadernação para facilitar a lembrança. E eu descobri que já existe uma ligação para isso com o NERDTree <Leader>f
benzen
11
Impressionante! Exemplo do que eu estava procurando.
mawaldne
Você pode elaborar sobre isso?
jterm
Se você estiver usando este vimrc incrível (não é meu), que é mapeado para, nf: github.com/amix/vimrc
alpha_989
Qual é a chave <leader>?
28918 stillanoob
29

jogue um sinal de% no final como um chefe

:NERDTree %

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

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

schpet
fonte
2
Você sabe que eu era cético. Algo na maneira como você disse: D. Mas esta é a única coisa que funcionou como eu precisava, muito bem.
Hugo
Uma resposta tão chefe!
ecbrodie
11
muito chefe, essa resposta
mhz
O único problema é que, ao iniciar a partir de um arquivo em branco, a alternância não funcionará, pois não há dir do buffer atual.
X.Arthur 25/03
25

Achei as respostas existentes educacionais e combinei as duas com êxito, de modo que o comportamento se parecesse com o que muitas pessoas esperariam de um IDE: Clique em uma janela / buffer aberto e destaque esse arquivo no NERDTree. Coloquei isso no meu ~ / .vimrc:

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

O que isso faz:

  1. autocmd BufEnter - é executado sempre que você se concentra em um buffer (incluindo a janela NERDTree)
  2. if &modifiable - ao clicar na janela NERDTree, não faça mais nada (a janela NERDTree não é modificável)
  3. wincmd p- NERDTreeFind deixa o cursor focado no NERDTree; isso volta para a janela em que você se concentrou originalmente

Observe que isso não funcionará em nenhum outro buffer que não seja modificável - mas isso geralmente é uma coisa boa; caso contrário (por exemplo) sempre que você entrar :helpno vim, o NERDTree encontrará e focará o diretório em que os arquivos de ajuda estão armazenados - provavelmente não é algo que você deseja que ele faça.

Essa solução de uma linha funcionou muito bem para mim no início, mas logo descobri que ela faz com que o NERDTree seja ativado sempre que eu abro um arquivo - e, como resultado, impede que o NERDTree seja fechado! Se você não quiser usar o NERDTree em tempo integral, coloque-o 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()
Lambart
fonte
11
Qual é o propósito isNTFocused()? O &modifiablecheque não cobre esse caso?
Jrdioko
2
Function name must start with a capital or "s:": rc:isNTOpen()Você está usando um plug-in que estende escopos?
Brian Haak
11
Desculpe, mas eu não sei, @BrianHaak. Atualmente, não uso o NerdTree e perdi meu antigo lugar .vimrcem que escrevi esse código. Não me lembro por que usei o rc:, mas acho que foi uma coisa de espaço para nome evitar conflitos de nome com outras funções. Eu não estava usando nenhum plugin especificamente relacionado a isso, tanto quanto me lembro. Você terá que estudar os documentos ou apenas tentar deixar de fora e ver se algo quebra. Mas acho que um dos nomes das funções entra em conflito com algo no NerdTree ou em outro lugar. Ninguém mais perguntou em quase cinco anos, então eu sinto que é algo simples. :)
Lambart
4
@Lambart Eu criei uma configuração utilizável com todos os problemas resolvidos: gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Brian Haak
11
Legal. Há anos que pretendo git-ify meus vários arquivos .rc. Algum dia ...
Lambart
2

Encontrei essa pergunta ontem, depois de algumas horas de escavação, enviei uma solicitação de solicitação ao repositório nerdtree do scrooloose, introduzindo um NERDTreeCWDcomando que altera a raiz da árvore NERD para o diretório de trabalho atual (Atualização em 12/11/2012: o PR foi mesclado o mestre upstream, deve ser utilizável em uma versão atualizada). Com essa alteração, essa questão pode ser simplesmente resolvida pelo código a seguir.

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

Compare com a abordagem do @ shinzui e do @ Lambart NERDTreeFind, isso faz exatamente o que a pergunta foi feita. O uso NERDTreeFindmudará a posição de rolagem da 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, essa solução sempre tem uma janela de árvore NERD aberta e pode ser facilmente codificada. Se uma janela da árvore NERD já foi aberta, o uso NERDTreeToggleprecisará ser acionado duas vezes (primeiro feche a existente e depois abra-a novamente); infelizmente, a segunda abertura ignorará todo o processamento do cwd.

weynhamz
fonte
Sua solução não leva o NERDTree a estar sempre aberto? Também acho que se eu usar o plug-in MRU e tentar abrir arquivos, ele abrirá os arquivos na janela NERDtree depois de usar essa alteração. No momento, essa modificação causará muitos problemas e conflitos com o MRU ( github.com/yegappan/mru/wiki/User-Manual ), mas não sei por quê. Talvez outras pessoas possam verificar se têm problemas semelhantes. Eu gosto que a guia NERDtree esteja sempre aberta .. #
alpha_989
Sim, isso resulta no NERDTree sempre aberto. Tristeza.
31518 Meredith
1

Isso se comporta como, :NERDTreeTogglemas mostrará o arquivo aberto no momento no NERDTree. Se você ainda não abriu um arquivo (ou seja, você acabou de inserir vimsua linha de comando), o NERDTree é exibido /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
Matthias Braun
fonte
1

Aplico as duas soluções de Alterar diretório atual usando o NERDTree : use cdpara definir o diretório de trabalho do NERDTree como o diretório atual e Cpara definir o nó raiz do NERDTree como o diretório atual

Casper Gerritsen
fonte
0

Eu acho que este plugin é o que você deseja https://github.com/jistr/vim-nerdtree-tabs

j2fly
fonte
2
Bem-vindo ao Super Usuário! Embora o link seja bom, seria preferível incluir um pouco de contexto aqui e explicar o que o plug-in faz, como deve ser usado etc. Obrigado!
slhck
Na verdade, essa poderia ser uma boa solução para o que foi solicitado. #
Alpha_989 21/11
0

Eu achei a resposta que Matthias postou como uma ótima resposta para um problema, ela não funciona bem em alguns casos extremos. Funciona um pouco melhor com a alteração abaixo:

function! NERDTreeToggleInCurDir()
  " If NERDTree is open in the current buffer
  if (exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1)
    exe ":NERDTreeClose"
  elseif bufname('%')
    exe ":NERDTreeFind"
  else
    exe ":NERDTreeCWD"
  endif
endfunction
Keith Schaab
fonte