Respuestas:
No estoy seguro de si hay una forma específica de NERDTree para hacer eso, pero siempre puedes configurar Vim para que establezca el directorio de trabajo en el directorio del archivo actual :
autocmd BufEnter * lcd %:p:h
Ahora, todo lo que tiene que hacer después de abrir un archivo en una nueva pestaña está :NERDTreeToggle
en la nueva pestaña.
Utilizo la siguiente asignación para ver el búfer actual en NERDTree:
map <leader>r :NERDTreeFind<cr>
<leader>
?
lanzar un signo% al final como un jefe
:NERDTree %
Tengo esto en mi .vimrc, se asigna Ctrl+ opara alternar nerdtree en el directorio del búfer actual:
map <C-o> :NERDTreeToggle %<CR>
Las dos respuestas existentes me parecieron educativas y las combiné con éxito para que el comportamiento sea más parecido al que muchas personas esperarían de un IDE: haga clic en una ventana abierta / búfer y haga que ese archivo se destaque en el NERDTree. Puse esto en mi ~ / .vimrc:
autocmd BufEnter * if &modifiable | NERDTreeFind | wincmd p | endif
Qué hace esto:
autocmd BufEnter
- se ejecuta cada vez que te enfocas en un búfer (incluida la ventana NERDTree)if &modifiable
- cuando hace clic en la ventana NERDTree, no haga nada más (la ventana NERDTree no se puede modificar)wincmd p
- NERDTreeFind deja el cursor enfocado en el NERDTree; esto vuelve a la ventana en la que originalmente te enfocasteTenga en cuenta que esto no funcionará en ningún otro búfer que no sea modificable, pero generalmente es algo bueno; de lo contrario (por ejemplo) cada vez que :help
ingresas a vim, NERDTree encontraría y enfocaría el directorio donde se almacenan los archivos de ayuda, probablemente no es algo que quieras que haga.
Al principio, esa solución de una línea funcionó muy bien para mí, pero pronto descubrí que hace que NERDTree se active cada vez que abro un archivo, y como resultado, ¡evita que NERDTree se cierre! Si no quieres usar NERDTree a tiempo completo, pon esto en tu .vimrc en su lugar:
" 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()
? ¿El &modifiable
cheque no cubre ese caso?
Function name must start with a capital or "s:": rc:isNTOpen()
¿Está utilizando un complemento que amplía los ámbitos?
.vimrc
en el que había escrito ese código. No recuerdo por qué usé el rc:
, pero creo que era una cuestión de espacio de nombres para evitar conflictos de nombres con otras funciones. Por lo que recuerdo, no estaba usando ningún complemento específicamente relacionado con eso. Tendrás que estudiar los documentos, o simplemente tratar de omitirlos y ver si algo se rompe. Pero creo que uno de los nombres de funciones está en conflicto con algo en NerdTree o en otro lugar. Nadie más ha pedido en casi 5 años, así que tengo la sensación de que es algo simple. :)
Me encontré con esta pregunta ayer, después de unas horas de excavación, envié una solicitud de extracción al repositorio nerdtree de scrooloose que presenta un NERDTreeCWD
comando que cambia la raíz del árbol NERD al directorio de trabajo actual (Actualización en 2012-11-12: El PR se ha fusionado en el maestro ascendente, debería poder usarse en una versión actualizada). Con este cambio, esta pregunta puede resolverse simplemente con el siguiente código.
autocmd BufEnter * silent! if bufname('%') !~# 'NERD_tree_' | cd %:p:h | NERDTreeCWD | wincmd p | endif
Compárese con el enfoque de @ shinzui y @ Lambart NERDTreeFind
, esto hace exactamente lo que hizo la pregunta. El uso NERDTreeFind
cambiará la posición de desplazamiento del nerdtree y el resultado no siempre es el mismo (si CWD está en la raíz del árbol NERD, simplemente expande el nodo en lugar de cambiarlo).
Compare con la respuesta de @Yaser Sulaiman, esta solución siempre tiene una ventana de árbol NERD abierta y puede codificarse fácilmente. Si ya se ha abierto una ventana de árbol NERD, NERDTreeToggle
será necesario disparar dos veces (primero cierre la existente, luego ábrala nuevamente), desafortunadamente, la segunda apertura omitirá todo el proceso de cwd.
Esto se comporta como, :NERDTreeToggle
pero mostrará el archivo abierto actualmente en NERDTree. Si aún no ha abierto un archivo (es decir, acaba de ingresar vim
en su línea de comando), se muestra NERDTree /home
.
Pon esto en tu .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 ambas soluciones desde Cambiar el directorio actual usando NERDTree : utilizo cd
para establecer el directorio de trabajo de NERDTree en el directorio actual y C
para configurar el nodo raíz NERDTree en el directorio actual
Creo que este complemento es lo que quieres https://github.com/jistr/vim-nerdtree-tabs
Encontré que la respuesta que Matthias publicó es una gran respuesta con un problema, no funciona bien en un par de casos extremos. Funciona un poco mejor con el cambio a continuación:
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