Respostas:
Não tenho certeza se existe uma maneira específica de NERDTree fazer isso, mas você sempre pode configurar o Vim para que ele defina o diretório de trabalho como o diretório do arquivo atual :
autocmd BufEnter * lcd %:p:h
Agora, tudo o que você precisa fazer após abrir um arquivo em uma nova guia está :NERDTreeToggle
na própria guia.
Eu uso o seguinte mapeamento para visualizar o buffer atual no NERDTree:
map <leader>r :NERDTreeFind<cr>
<leader>
?
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>
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:
autocmd BufEnter
- é executado sempre que você se concentra em um buffer (incluindo a janela NERDTree)if &modifiable
- ao clicar na janela NERDTree, não faça mais nada (a janela NERDTree não é modificável)wincmd p
- NERDTreeFind deixa o cursor focado no NERDTree; isso volta para a janela em que você se concentrou originalmenteObserve 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 :help
no 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()
isNTFocused()
? O &modifiable
cheque não cobre esse caso?
Function name must start with a capital or "s:": rc:isNTOpen()
Você está usando um plug-in que estende escopos?
.vimrc
em 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. :)
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 NERDTreeCWD
comando 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 NERDTreeFind
mudará 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 NERDTreeToggle
precisará ser acionado duas vezes (primeiro feche a existente e depois abra-a novamente); infelizmente, a segunda abertura ignorará todo o processamento do cwd.
Isso se comporta como, :NERDTreeToggle
mas mostrará o arquivo aberto no momento no NERDTree. Se você ainda não abriu um arquivo (ou seja, você acabou de inserir vim
sua 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
Aplico as duas soluções de Alterar diretório atual usando o NERDTree : use cd
para definir o diretório de trabalho do NERDTree como o diretório atual e C
para definir o nó raiz do NERDTree como o diretório atual
Eu acho que este plugin é o que você deseja https://github.com/jistr/vim-nerdtree-tabs
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
<Leader>f