Vim: ¿Cómo sincronizar NERDTree con la ruta de archivo de pestaña abierta actual?

60

Cuando abro una nueva pestaña con una ruta diferente del archivo anterior en VIM, NERDTree seguirá siendo la misma jerarquía de directorio del archivo anterior.

¿Hay un acceso directo de sincronización para cambiar el directorio raíz actual al directorio del nuevo archivo abierto?

Jichao
fuente

Respuestas:

116

Utilizo la siguiente asignación para ver el búfer actual en NERDTree:

 map <leader>r :NERDTreeFind<cr>
Shinzui
fuente
3
Esto me parece muy útil, y fui a mi .vimrc. Quería usar algún otro enlace para que sea más fácil de recordar. Y me di cuenta de que ya existe una unión de este con NERDTree <Leader>f
benceno
1
¡Increíble! Ejemplo de lo que estaba buscando.
mawaldne
¿Puedes dar más detalles sobre esto?
jterm
Si está utilizando este increíble vimrc (no el mío), está asignado a, nf: github.com/amix/vimrc
alpha_989
Lo clave es <leader>?
stillanoob
30

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>

Schpet
fuente
2
Sabes que era escéptico. Algo en la forma en que lo dijiste: D. Pero esto es lo único que funcionó como lo necesitaba, bien hecho.
Hugo
¡Qué respuesta tan jefe!
ecbrodie
1
mucho jefe, tal respuesta
mhz
El único problema es que al comenzar desde un archivo en blanco, el alternar no funcionará ya que no hay directorio del búfer actual.
X. Arthur
25

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:

  1. autocmd BufEnter - se ejecuta cada vez que te enfocas en un búfer (incluida la ventana NERDTree)
  2. if &modifiable - cuando hace clic en la ventana NERDTree, no haga nada más (la ventana NERDTree no se puede modificar)
  3. wincmd p- NERDTreeFind deja el cursor enfocado en el NERDTree; esto vuelve a la ventana en la que originalmente te enfocaste

Tenga 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 :helpingresas 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()
Lambart
fuente
1
¿Para qué sirve isNTFocused()? ¿El &modifiablecheque no cubre ese caso?
jrdioko
2
Function name must start with a capital or "s:": rc:isNTOpen()¿Está utilizando un complemento que amplía los ámbitos?
Brian Haak
1
Lo siento pero no sé, @BrianHaak. Actualmente no uso NerdTree, y he perdido mi antiguo .vimrcen 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. :)
Lambart
44
@Lambart He creado una configuración utilizable con todos los problemas resueltos: gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Brian Haak
1
Bueno. He estado intentando durante años poner a prueba mis diversos archivos .rc. Algún día ...
Lambart
2

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 NERDTreeCWDcomando 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 NERDTreeFindcambiará 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, NERDTreeToggleserá necesario disparar dos veces (primero cierre la existente, luego ábrala nuevamente), desafortunadamente, la segunda apertura omitirá todo el proceso de cwd.

weynhamz
fuente
¿Su solución no lleva a que NERDTree siempre esté abierto? También encuentro que si uso el complemento MRU e intento abrir archivos, abre archivos en la ventana NERDtree después de usar este cambio. Tal como está, esta modificación causará muchos problemas y conflictos con MRU ( github.com/yegappan/mru/wiki/User-Manual ), sin embargo, no sé por qué. Tal vez otras personas puedan verificar si tienen problemas similares. Me gusta que la pestaña NERDtree siempre esté abierta ..
alpha_989
Sí, esto da como resultado que NERDTree siempre esté abierto. Tristeza.
Meredith
1

Esto se comporta como, :NERDTreeTogglepero mostrará el archivo abierto actualmente en NERDTree. Si aún no ha abierto un archivo (es decir, acaba de ingresar vimen 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
Matthias Braun
fuente
1

Aplico ambas soluciones desde Cambiar el directorio actual usando NERDTree : utilizo cdpara establecer el directorio de trabajo de NERDTree en el directorio actual y Cpara configurar el nodo raíz NERDTree en el directorio actual

Casper Gerritsen
fuente
0

Creo que este complemento es lo que quieres https://github.com/jistr/vim-nerdtree-tabs

j2fly
fuente
2
¡Bienvenido a Super User! Si bien tener el enlace es bueno, sería preferible incluir un poco de contexto aquí y explicar qué hace el complemento, cómo debe usarse, etc. ¡Gracias!
slhck
En realidad, esta podría ser una buena solución para lo que se le preguntó ..
alpha_989
0

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
Keith Schaab
fuente