Navegación de archivos Vim

90

Me estoy esforzando mucho por aprender vim después de usar TextMate durante los últimos años.

Comencé a guardar parte de la navegación en el archivo en la memoria, pero tengo problemas para navegar entre varios archivos.

En mi flujo de trabajo, es bastante común que esté cambiando entre un puñado de archivos con bastante regularidad (suficientes archivos como para que las ventanas de panel dividido se vuelvan demasiado pequeñas).

Actualmente estoy usando NERDTree, pero encuentro que profundizar en directorios es engorroso, así como usar constantemente CTRL+ W h/ CTRL+ W lpara saltar de un lado a otro.

Creo que lo haría mejor con pestañas entre las que puedo alternar fácilmente, pero tal vez necesite usar un flujo de trabajo diferente.

También me gustaría un acceso directo "Ir a archivo ..." como CMD+ Ten TextMate. Lo encontré, fuzzy_file_finderpero requiere que vim se compile con enlaces Ruby, lo que no es el caso de las instalaciones nativas en las que he trabajado.

Si bien podría reconstruir, la razón principal por la que quiero cambiar a vim es para poder tener un entorno de editor que sé que funcionará fácilmente en cualquier plataforma.

Las opciones que existen son abrumadoras, ¡cualquier idea es muy apreciada!

Pete
fuente
1
No he encontrado una forma realmente satisfactoria de navegar por archivos y búferes, que no utilice ninguna ayuda externa. Las cosas integradas son bastante malas (quiero decir, ¿cambiar a un búfer por su número? ¿Quién anda recordando los números de búfer temporales ...)
Svend
1
@svend: puede referirse a los búferes por nombre y número; vea mi respuesta a continuación
Dave Kirby

Respuestas:

92

No encuentro que profundizar en subdirectorios a través de simple antiguo :esea ​​tan engorroso dada una configuración decente para completar con pestañas.

Busque la 'wildmenu'opción para que Vim muestre una lista de finalizaciones (nombres de archivo) en la línea de modo sobre la línea de comandos. Puede cambiar la 'wildmode'opción para configurar aún más el tipo de finalización de tabulación que hará Vim.

Personalmente utilizo :set wildmode=full.

Mi flujo de trabajo es así:

  1. :cd en el directorio de nivel superior de mi proyecto.
  2. Para abrir el archivo foo/bar/baz:

    • Escenario más simple: tipo :e f<tab>b<tab>b<tab><enter>.

    • Si hay más de un archivo a partir de buno de esos directorios es posible que tenga que hacer una <left>o <right>u otra <tab>en el teclado para saltar entre ellos (o escribir unas cuantas más cartas para eliminar la ambigüedad).

    • En el peor de los casos, hay archivos y directorios que comparten un nombre y es necesario profundizar en el directorio. En este caso, complete con la pestaña el nombre del directorio y luego escriba *<tab>para profundizar.

  3. Abra 2 o 3 ventanas y abra archivos en todas ellas según sea necesario.
  4. Una vez que un archivo está abierto en un búfer, no mates el búfer. Déjelo abierto en segundo plano cuando abra archivos nuevos. Solo :eun nuevo archivo en la misma ventana.
  5. Luego, use :b <tab>para recorrer los búferes que ya están abiertos en segundo plano. Si escribe :b foo<tab>, coincidirá solo con los archivos abiertos que coincidan foo.

También utilizo estas asignaciones para que sea más fácil abrir nuevas ventanas y saltar entre ellas porque es algo que hago con mucha frecuencia.

" Window movements; I do this often enough to warrant using up M-arrows on this"
nnoremap <M-Right> <C-W><Right>
nnoremap <M-Left> <C-W><Left>
nnoremap <M-Up> <C-W><Up>
nnoremap <M-Down> <C-W><Down>

" Open window below instead of above"
nnoremap <C-W>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR>

" Vertical equivalent of C-w-n and C-w-N"
nnoremap <C-w>v :vnew<CR>
nnoremap <C-w>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR>

" I open new windows to warrant using up C-M-arrows on this"
nmap <C-M-Up> <C-w>n
nmap <C-M-Down> <C-w>N
nmap <C-M-Right> <C-w>v
nmap <C-M-Left> <C-w>V

Me toma unos segundos abrir Vim, configurar algunas ventanas y abrir algunos archivos en ellas. Personalmente, nunca he encontrado que ninguno de los scripts de exploración de archivos de terceros sea muy útil.

Brian Carper
fuente
4
Punta del sombrero para la asombrosa explicación. Menea el dedo para el skillz ++ que ya necesitas para entender la explenation.
Sr. Baudin
256

Una forma sencilla de explorar el sistema de archivos es el comando:

:Sex

No me lo estoy inventando :)


fuente
14
y gracias a la ayuda veo que: Vex también es genial.
jrwren
15
Y esto tiene 69 votos a favor. No creo que tenga el corazón para cambiar eso.
AlbeyAmakiir
3
Y :Vexsi desea dividir la pantalla verticalmente en lugar de horizontalmente
sreenivas
1
Vaya, nunca supe ninguno de estos. Me parece :Vexmás práctico, pero :Sexme alegra el día.
William Robertson
2
para el registro, :Setambién funciona (lo mismo para las Ve, Tevariantes). No hay necesidad de hacerlo raro :)
towc
46

:Sex, :Vex, :TexY :Exson todos los comandos útiles para la ex (ploring) los archivos en su sistema si desea utilizar algo diferente de:e

(donde S/V/Tson las abreviaturas de Split / Vertical / Tab)

Emil Rehhnberg
fuente
7

Si aún no los ha encontrado, es posible que desee consultar:

  • el complemento original del buscador difuso , que IIRC no tiene los problemas de vinculación de Ruby
  • el complemento del proyecto - similar a NERDTree
  • el complemento del explorador de búfer: muestra una lista de búferes abiertos

También tenga en cuenta que puede reasignar atajos de teclas en su .vimrc para que sean menos engorrosos. Yo uso mucho las ventanas divididas; Descubrí que lo siguiente hace que lidiar con ellos sea mucho más fácil:

" set your own personal modifier key to something handy
let mapleader = "," 

" use ,v to make a new vertical split, ,s for horiz, ,x to close a split
noremap <leader>v <c-w>v<c-w>l
noremap <leader>s <c-w>s<c-w>j
noremap <leader>x <c-w>c

" use ctrl-h/j/k/l to switch between splits
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-l> <c-w>l
map <c-h> <c-w>h
dlimeb
fuente
5

Creo que lo haría mejor con pestañas entre las que pueda alternar fácilmente, pero tal vez necesite usar un flujo de trabajo diferente.

¿Conoce las pestañas de Vim? No estoy seguro si se refería a las pestañas de Vim allí, o si suspiraba por las de TextMate. No está claro qué versión de Vim estás usando, pero ha tenido pestañas desde al menos 7.0 (que parece estar instalado en todos los lugares donde miro últimamente), y son increíbles.

:tabeabre una nueva (abreviatura de "editar pestaña", por ejemplo, :tabepara vacía o :tabe path/to/filepara abrir un archivo en una nueva pestaña), puede moverse entre pestañas adyacentes con gt/ gT, y también hay un montón de otros comandos de navegación relacionados con pestañas, como que podría esperar de Vim ( :help tabs)

Mi flujo de trabajo para proyectos grandes tiende a involucrar un montón de pestañas, cada una con entre 1 y 3 ventanas dependiendo del tipo de contexto que necesite. Esto funciona incluso mejor si tengo una ventana de terminal de doble ancho, ya que puedo dividir verticalmente :vs, por lo que una sola pestaña puede mostrarme fácilmente 4 archivos a la vez con mucho espacio para cada uno.

Consejo final: a veces utilizo el comando "cambiar búfer" ( :sb <partial_buf_name>), que se parece un poco al hallazgo difuso de TM, ya que funciona bastante bien, pero solo para búferes ya abiertos. Sigue siendo ideal para cuando tengo una docena o más de archivos abiertos a la vez. (Nota: necesitaba hacerlo :set switchbuf=usetaben mi vimrc para que esto funcionara en todas las pestañas, pero una vez configurado, es genial).

bitprophet
fuente
1
Mi comprensión de las pestañas es que se trata más de un preservador de diseño, no realmente un método para tener un búfer abierto en cada pestaña (consulte las propias vistas de Bram Molenaars en pestañas en el video "7 hábitos de edición de texto efectiva".
Svend
Luego, una vez que haya descubierto comandos como estos que funcionan para usted, puede vincularlos a una tecla. Tengo un cambio de pestaña de control entre búferes abiertos (a la firefox), pero puedes cambiar de pestaña en su lugar.
Jonathan Hartley
vim-titlecasetornillos con las asignaciones gt / gT, pero hay una solución .
naught101
5

Encuentro a LustyExplorer el mejor hasta ahora.

Puede abrir un archivo escribiendo solo una parte de su nombre.

Puede abrir un archivo desde el directorio del archivo actual, o el actual pwd, o desde la lista de búfer.

Si abre un archivo de la lista de búfer, no tiene que navegar a través del árbol de directorios, aunque desafortunadamente para los otros dos modos, todavía tiene que navegar por el árbol. Lo bueno es que no tienes que empezar desde el primer carácter.

Si usted tiene:

dir_a/
    ...
dir_b/
    file.js
    file.html

y desea abrir dir_b/file.html, generalmente puede encontrarlo escribiendob<Tab>h

hasen
fuente
Hice algunas extensiones para este increíble complemento. svendtofte.com/wp-content/uploads/2009/08/… svendtofte.com/other/vim-stuff Básicamente me permite ingresar el nombre de un archivo usado recientemente, no importa si ya está cargado o no. Esto significa que solo necesita navegar por el FS cuando abre un archivo por primera vez.
Envío el
4

Es sorprendente ver que el :findcomando no se ha mencionado en ninguna de las respuestas. Normalmente trabajo con proyectos de rieles en los que necesito profundizar en la jerarquía de directorios. Entonces, para un archivo application.css, ubicado en app/assets/stylesheets/todo lo que tengo que escribir es :find applicay luego presionar tab para autocompletar e ingresar para abrir.

Imran Ali
fuente
3

Consulte el complemento ctrlp como alternativa al complemento Command-T . Es mejor que esto porque es un script de Vim 'nativo' y no necesita que Vim se compile con ruby ​​(u otro soporte) mientras se ejecuta muy rápido y discreto.

Nikola
fuente
2

Si el archivo que desea ya está cargado en un búfer (lo cual es probable si está pasando entre un puñado de archivos con regularidad), puede cambiar rápidamente al búfer con el :b[uffer]comando.

:bpuede tomar un número de búfer como parámetro o (más útil) una cadena que coincida con parte de la ruta / nombre de archivo. Si hay varias coincidencias, puede usar la pestaña para recorrerlas.

Si desea dividir la ventana y abrir el búfer en la nueva ventana, utilice :sb name

Si desea abrir el búfer en una nueva pestaña, utilice :tab b name

También puede utilizar el :lscomando para ver una lista de búferes cargados actualmente.

Dave Kirby
fuente
1

Utilizo esta función para buscar archivos en subdirectorios, aunque no la escribí. Es de la wiki de vim :

¡función! Buscar (nombre)
    let l: list = system ("buscar. -nombre '" .a: nombre. "' | grep -v \". svn / \ "| perl -ne 'print \" $. \\ t $ _ \ "' ") 
    let l: num = strlen (substitute (l: list, "[^ \ n]", "", "g")) 
    si l: num 0 
            echo "No es un número" 
            regreso 
        terminara si 
        si l: inputl: num 
            echo "Fuera de rango" 
            regreso 
        terminara si 
        let l: line = matchstr ("\ n" .l: list, "\ n" .l: input. "\ t [^ \ n] *") 
    más 
      deje l: línea = l: lista 
    terminara si 
    let l: line = substitute (l: line, "^ [^ \ t] * \ t. /", "", "") 
    ejecutar ": e" .l: línea 
función final 

¡mando! -nargs = 1 Buscar: llamar a Buscar ("")

Una cosa que me gusta es que tiene soporte para comodines (*). También se comporta bien para múltiples partidos.

único copo de nieve8
fuente
1

Además de las wildmenurespuestas, uso el complemento BufExplorer y las siguientes asignaciones para saltar rápidamente los búferes:

nmap <A-1> :b 1<CR>
nmap <A-2> :b 2<CR>
nmap <A-3> :b 3<CR>
...
nmap <A-0> :b 10<CR>
nmap <A-=> \bs

O simplemente puede reemplazar el explorador de búfer con el :lscomando, que básicamente muestra lo mismo.

El último mapea el Alt-=para mostrar el explorador de búfer.

No uso mucho Windows, ya que generalmente solo tengo una o dos ventanas.

También modifiqué el statuslinepara incluir el número de búfer %2n, de modo que siempre sepa qué búfer se está editando. Ver:h statusline

Ayman
fuente
0

Aquí hay algo bastante trivial que guardo en mi .vimrc. Cargará un archivo desde cualquier subdirectorio.

" load from an unspecified subdirectory 
function! LoadFromSubdirectory(filespec) 
  let filename = glob("`find . -name '" . a:filespec . "' -print`") 
  exe ':e '.filename 
endfunction 
:command -nargs=1 Er :call LoadFromSubdirectory(<f-args>) 

Entonces solo puedo decir:

: Er Main.java

y buscará subdirectorios, lo encontrará Main.javay lo cargará. No se comporta bien para varios archivos con el mismo nombre, pero es rápido y sencillo.

La otra herramienta que utilizo es VTreeExplorer , que proporciona una ventana de archivos / directorios basada en árboles, y no requiere ninguna opción de compilación especial de VIM (es decir, es un complemento de vainilla).

Brian Agnew
fuente
Me gustaría poder cargar desde un subdirectorio, pero el problema de múltiples archivos sería un factor decisivo para mí. Soy un desarrollador Django, así que normalmente tienen un montón de subdirectorios que todos tienen una models.py, views.py, etc.
Pete
0

Mi flujo de trabajo para buscar archivos es el wildmenu, autocwd y :e.

Partes relevantes en el .vimrc :

set wildmenu
set wildignore=*.dll,*.o,*.pyc,*.bak,*.exe,*.jpg,*.jpeg,*.png,*.gif
set wildmode=list:full
set autochdir
let g:netrw_list_hide='^\.,.\(pyc\|pyo\|o\)$'

Y cómo usarlo:

:e myf^D

Eso da todos los archivos en el directorio actual que comienzan con myf. Tú también puedes<Tab> través de ellos. Use regresar para abrir :)

^Dsiempre te dará todos los partidos. Debido a que autocmd siempre va a la carpeta del archivo actual, es fácil trabajar con él. Si estás dentro foo/bar.pyy quieres ir foo/baz.py, solo hazlo :e baz.pyy estás ahí. Eso también funciona con búferes ( :b foo^Denumera todos los búferes que comienzan con foo)

Armin Ronacher
fuente
¿Qué tal llegar a otros directorios? Por ejemplo, a menudo estaré trabajando entre mi vista de Python, plantilla HTML y archivos JavaScript que viven en diferentes subdirectorios. En TextMate, empiezo a escribir el nombre del archivo y aparecen todas las coincidencias en mi "proyecto" (también conocido como cwd).
Pete
No recurre a subcarpetas, no. Pero adapté mi flujo de trabajo a eso. Además, una vez que abro el archivo, solo puedo mencionar el nombre del búfer y estoy bien. Puede decirle a Vim que recuerde los búferes abiertos, entonces generalmente no necesita esa función en absoluto.
Armin Ronacher