¿Cómo trabajar efectivamente con múltiples archivos en Vim?

Empecé a usar Vim para desarrollar scripts Perl y estoy empezando a encontrarlo muy poderoso.

Una cosa que me gusta es poder abrir múltiples archivos a la vez con, por ejemplo, vi main.pl maintenance.pl y luego saltar entre ellos con:

 :n :prev 

y ver qué archivo están abiertos con

 :args 

Y para agregar un archivo, puedo decir:

 :n test.pl 

lo cual espero que se agregue a mi lista de archivos, pero en cambio borra mi lista de archivos actual y cuando test.pl :args solo tengo test.pl abierto.

Entonces, ¿cómo puedo AGREGAR y QUITAR archivos a mi lista args?

¿Por qué no usar tabs (introducido en Vim 7)? Puede cambiar entre tabs con :tabn y :tabp , con :tabe puede agregar una nueva pestaña; y con un regular :q o :wq cierra una pestaña. Si :tabn y :tabp en las teclas F7 / F8 , puede cambiar fácilmente de un archivo a otro.

Si no hay tantos archivos o no tiene Vim 7, también puede dividir su pantalla en varios archivos :sp . Luego puede cambiar entre pantallas divididas con Ctrl + W y luego una tecla de flecha en la dirección que desea mover (o en lugar de teclas de flecha, w para siguiente y W para pantalla dividida anterior)

Listado

Para ver una lista de los buffers actuales, uso:

 :ls 

Apertura

Para abrir un nuevo archivo, uso

 :e ../myFile.pl 

con la finalización de tabs mejorada (ponga set wildmenu en su .vimrc ).

Nota: también puede usar :find qué buscará un conjunto de rutas por usted, pero primero debe personalizarlas.


Traspuesta

Para cambiar entre todos los archivos abiertos, uso

 :b myfile 

con la finalización de tabs mejorada (sigue set wildmenu ).

Nota:: :b# elige el último archivo visitado, por lo que puede usarlo para alternar rápidamente entre dos archivos.


Usando Windows

Ctrl-W s y Ctrl-W v para dividir la ventana actual horizontal y verticalmente. También puede usar :split y :vertical split ( :sp y :vs )

Ctrl-W w para alternar entre las ventanas abiertas, y Ctrl-W h (o j o k o l ) para navegar por las ventanas abiertas.

Ctrl-W c para cerrar la ventana actual, y Ctrl-W o para cerrar todas las ventanas excepto la actual.

Al iniciar vim con un indicador -o o -O abre cada archivo en su propia división.


Con todo esto no necesito tabs en Vim, y mis dedos encuentran mis búferes, no mis ojos.

Nota: si desea que todos los archivos vayan a la misma instancia de Vim, inicie Vim con la opción --remote-silent .

 :ls 

para la lista de búferes abiertos

  • :bp buffer anterior
  • :bn next buffer
  • :bn ( n un número) mover a n’th buffer
  • :b con la tecla de tabulación que proporciona la finalización automática (¡increíble!)

En algunas versiones de vim, bn y bp son realmente bnext y bprevious respectivamente. Tab autocompletar es útil en este caso.

O cuando está en modo normal, use ^ para cambiar al último archivo en el que estaba trabajando.

Además, puedes guardar sesiones de vim

 :mksession! ~/today.ses 

El comando anterior guarda los búferes y la configuración de archivos abiertos actuales en ~/today.ses . Puedes cargar esa sesión usando

 vim -S ~/today.ses 

Sin complicaciones al recordar dónde lo dejaste ayer. 😉

Para agregar a la lista args :

 :argadd 

Para eliminar de la lista args :

 :argdelete 

En su ejemplo, podría usar :argedit test.pl para agregar test.pl a la lista args y editar el archivo en un solo paso.

:help args da mucho más detalle y uso avanzado

Utilizo comandos de buffer – :bn (siguiente buffer) :bp (buffer anterior) :buffers (lista de buffers abiertos) :b (open buffer n) :bd (delete buffer). :e se abrirá en un nuevo buffer.

Creo que puede estar utilizando el comando incorrecto para mirar la lista de archivos que tiene abiertos.

Intente hacer un :ls para ver la lista de archivos que tiene abiertos y verá:

  1 %a "./checkin.pl" line 1 2 # "./grabakamailogs.pl" line 1 3 "./grabwmlogs.pl" line 0 etc. 

A continuación, puede pasar por los archivos haciendo referencia a ellos por los números enumerados, por ejemplo: 3b

o puede dividir su pantalla ingresando el número pero usando sb en lugar de simplemente b.

Como un lado% se refiere al archivo actualmente visible y # se refiere al archivo alternativo.

Puede alternar fácilmente entre estos dos archivos presionando Ctrl Shift 6

Editar: como :ls puede usar :reg para ver el contenido actual de sus registros, incluidos los registros 0-9 que contienen lo que ha eliminado. Esto es especialmente útil si desea reutilizar algún texto que haya eliminado previamente.

Vim (¡pero no el Vi original!) Tiene tabs que encuentro (en muchos contextos) superiores a los buffers. Puede decir :tabe [filename] para abrir un archivo en una nueva pestaña. El ciclo entre tabs se realiza haciendo clic en la pestaña o mediante las combinaciones de teclas [ n ] gt y gT . Graphical Vim incluso tiene tabs gráficas.

Cosas como :e y :badd solo aceptará UN argumento, por lo tanto, lo siguiente fallará

 :e foo.txt bar.txt :e /foo/bar/*.txt :badd /foo/bar/* 

Si desea agregar varios archivos desde vim, use arga[dd]

 :arga foo.txt bar.txt :arga /foo/bar/*.txt :argadd /foo/bar/* 

¡Muchas respuestas aquí! Lo que uso sin reinventar la rueda: los complementos más famosos (que no van a morir en el corto plazo y que son utilizados por muchas personas) son ultra rápidos y geek.

  • ctrlpvim / ctrlp.vim – para encontrar el archivo por nombre fuzzy search por su ubicación o solo su nombre
  • jlanzarotta / bufexplorer – para explorar los búferes abiertos (cuando no recuerdas cuántos archivos abriste y modificaste recientemente y no recuerdas dónde están, probablemente porque los buscaste con Ag)
  • rking / ag.vim para buscar los archivos con respecto a gitignore
  • scrooloose / nerdtree para ver la estructura del directorio, lookaround, agregar / eliminar / modificar archivos

ACTUALIZACIÓN : Recientemente estoy usando dyng / ctrlsf.vim para buscar con la vista contextual (como Sublime search) y cambié el motor de ag a ripgrep . El rendimiento es sobresaliente.

Algunas respuestas en este hilo sugieren el uso de tabs y otras sugieren utilizar el búfer para lograr lo mismo. Las tabs y los tampones son diferentes. Te sugiero que leas este artículo Vim Tab locura – Buffers vs Tabs

Aquí hay un buen resumen que saqué del artículo:

Resumen:

  • Un buffer es el texto en memoria de un archivo.
  • Una ventana es una ventana gráfica en un buffer.
  • Una página de tabs es una colección de ventanas.

Cuando uso múltiples archivos en vim, utilizo estos comandos principalmente (con ~ 350 archivos abiertos):

  • :b (saltar a un búfer)
  • :bw (limpieza del buffer, eliminar un buffer)
  • :e (editar, abrir un nuevo búfer>
  • pltags : permite saltar a definiciones de subrutinas / métodos

Uso el mismo archivo .vimrc para GVim y la línea de comando vim. Tiendo a usar tabs en GVim y búferes en la línea de comando vim, así que configuré mi .vimrc para facilitar el trabajo con ambos:

 " Movement between tabs OR buffers nnoremap L :call MyNext() nnoremap H :call MyPrev() " MyNext() and MyPrev(): Movement between tabs OR buffers function! MyNext() if exists( '*tabpagenr' ) && tabpagenr('$') != 1 " Tab support && tabs open normal gt else " No tab support, or no tabs open execute ":bnext" endif endfunction function! MyPrev() if exists( '*tabpagenr' ) && tabpagenr('$') != '1' " Tab support && tabs open normal gT else " No tab support, or no tabs open execute ":bprev" endif endfunction 

Esto anula las asignaciones existentes para H y L, pero hace que cambiar entre archivos sea extremadamente rápido y fácil. Simplemente presiona “H” para el próximo y “L” para el anterior; ya sea que esté usando tabs o búferes, obtendrá los resultados deseados.

Es posible que desee utilizar marcas globales de Vim .

De esta manera puede rebotar rápidamente entre los archivos, e incluso a la ubicación marcada en el archivo. Además, los comandos clave son cortos: 'C me lleva al código con el que estoy trabajando, 'T me lleva a la prueba de unidad con la que estoy trabajando.

Cuando cambia lugares, restablecer las marcas también es rápido: mC marca el nuevo punto de código, mT marca el nuevo punto de prueba.

Si va a utilizar varios búferes, creo que lo más importante es establecerlo de manera que le permita cambiar los buffers incluso si tiene cambios no guardados en el que está dejando.

Mi forma de trabajar efectivamente con múltiples archivos es usar tmux.

Le permite dividir ventanas vertical y horizontalmente, como en:

enter image description here

Lo tengo trabajando de esta manera en mis máquinas Mac y Linux y me parece mejor que el mecanismo nativo de conmutación de ventanas que se proporciona (en Macs). Encuentro el cambio más fácil y solo con tmux he podido obtener la ‘nueva página en el mismo directorio actual’ trabajando en mi mac (a pesar de que parece que hay opciones para abrir paneles nuevos en el mismo directorio) que es una pieza sorprendentemente crítica. Un panel nuevo instantáneo en la ubicación actual es increíblemente útil. Un método que hace paneles nuevos con las mismas combinaciones de teclas para ambos sistemas operativos es fundamental para mí y una ventaja para todos para la futura compatibilidad personal. Además de múltiples paneles tmux, también he intentado usar varias tabs, por ejemplo enter image description here y múltiples ventanas nuevas, por ejemplo enter image description here y finalmente encontré que múltiples paneles de tmux son los más útiles para mí. Soy muy ‘visual’ y me gusta mantener mis diversos contextos justo en frente de mí, conectados entre sí como paneles.

tmux también soporta paneles horizontales y verticales que la screen anterior no tenía (aunque iterm2 de mac parece soportarlo, pero una vez más, la configuración actual del directorio no funcionó para mí). tmux 1.8

Si utilizo solo comandos vim integrados , el mejor que he visto para cambiar entre múltiples buffers es este:

 nnoremap f :set nomore:ls:set more:b 

Combina perfectamente los comandos :ls y :b enumerando todos los búferes abiertos y esperando que ingrese el comando para cambiar el búfer.

Dado el mapeo anterior en vimrc, una vez que escribe f ,

  • Se muestran todos los búferes abiertos
  • Usted puede:
    • Escriba 23 para ir al buffer 23,
    • Escriba # para ir al buffer alternativo / MRU,
    • Escriba el nombre parcial del archivo, luego escriba , o para autocompletar,
    • O solo o para permanecer en el búfer actual

Una instantánea del resultado del mapeo de teclas anterior es:

 :set nomore|:ls|:set more 1 h "script.py" line 1 2 #h + "file1.txt" line 6 -- '#' for alternative buffer 3 %a "README.md" line 17 -- '%' for current buffer 4 "file3.txt" line 0 -- line 0 for hasn't switched to 5 + "/etc/passwd" line 42 -- '+' for modified :b ' here' 

En la instantánea de arriba:

  • Segunda columna: %a para actual, h para oculto, # para anterior, vacío para no ha sido cambiado a.
  • Tercera columna: + para modificado.

Además, sugiero fuertemente set hidden . Ver :help 'hidden' .

Agregar otra respuesta ya que esto no está cubierto por ninguna de las respuestas

Para cambiar todos los búferes a la vista de tab .

  :tab sball 

abrirá todos los búferes a la vista de pestaña. Entonces podemos usar cualquier comando relacionado con tabs

 gt or :tabn " go to next tab gT or :tabp or :tabN " go to previous tab 

detalles en :help tab-page-commands .

Podemos indicarle a vim que abra, como pestaña, varios archivos vim -p file1 file2 . alias vim='vim -p' será útil.
Lo mismo también se puede lograr teniendo el siguiente autocomando en ~/.vimrc

  au VimEnter * if !&diff | tab all | tabfirst | endif 

De todos modos para responder a la pregunta: Para agregar a la lista arg: arga file ,

Para eliminar de la lista arg: argd pattern

Más información en :help arglist

Utilizo varios búferes que están ocultos en mi archivo ~/.vimrc .

El script del explorador mini-buffer también es bueno para obtener una buena lista compacta de sus buffers. Luego :b1 o :b2 … para ir al búfer apropiado o usar el explorador de mini búfer y la pestaña a través de los búferes.

Utilizo lo siguiente, esto le da muchas características que esperaría tener en otros editores, como Sublime Text / Textmate

  1. Use búferes y no ‘páginas con tabs’. Los búferes son el mismo concepto que las tabs de casi todos los demás editores.
  2. Si desea tener el mismo aspecto de tener tabs, puede usar el complemento vim-airline con la siguiente configuración en su .vimrc : let g:airline#extensions#tabline#enabled = 1 . Esto muestra automáticamente todos los búferes como encabezados de tabs cuando no tiene páginas con tabs abiertas
  3. Usa el vim-unimpaird de Tim Pope que da [ b y ] b para pasar a los buffers anteriores / siguientes respectivamente (más toda una serie de otras cosas)
  4. Has set wildmenu en tu .vimrc luego cuando .vimrc :b + Tab para un buffer obtendrás una lista de posibles buffers que puedes usar con las flechas izquierda / derecha para desplazarte
  5. Utilice el plugin vim-obsession de Tim Pope para almacenar sesiones que funcionan muy bien con la aerolínea (tuve muchas molestias con las sesiones y los complementos )
  6. Use el plugin vim-vinagre de Tim Pope. Esto funciona con el nativo :Explore pero hace que sea mucho más fácil trabajar con él. Simplemente escriba - para abrir el explorador, que es la misma clave que para subir un directorio en el explorador. Hace que la navegación sea más rápida (sin embargo, con fzf rara vez uso esto)
  7. fzf (que se puede instalar como un complemento vim) es también un buscador difuso realmente poderoso que puedes usar para buscar archivos (y también buffers). fzf también juega muy bien con fd (una versión más rápida de find)
  8. Use Ripgrep con vim-ripgrep para buscar a través de su base de código y luego puede usar :cdo en los resultados para buscar y reemplazar

intente seguir los mapas para facilitar la edición de varios archivos

“ventanas divididas

nmap sh :leftabove vnew

nmap sl :rightbelow vnew

nmap sk :leftabove new

nmap sj :rightbelow new

“moviéndose

nmap j

nmap k

nmap l

nmap h

Uso la línea de comando y git mucho, así que tengo este alias en mi bashrc:

 alias gvim="gvim --servername \$(git rev-parse --show-toplevel || echo 'default') --remote-tab" 

Esto abrirá cada nuevo archivo en una nueva pestaña en una ventana existente y creará una ventana para cada repository de git. Entonces, si abre dos archivos del repository A, y 3 archivos del repository B, terminará con dos ventanas, una para el repository A con dos tabs y una para el repository B con tres tabs.

Si el archivo que está abriendo no está incluido en un repository git, irá a una ventana predeterminada.

Para saltar entre las tabs, uso estas asignaciones:

 nmap  :tabprevious nmap  :tabnext 

Para abrir varios archivos a la vez, debe combinar esto con una de las otras soluciones.

Hice un video muy simple que muestra el flujo de trabajo que uso. Básicamente utilizo el complemento Ctrl-P Vim, y correlacioné la navegación del buffer con la tecla Enter.

De esta manera puedo presionar Enter en modo normal, mirar la lista de archivos abiertos (que aparece en una pequeña ventana nueva en la parte inferior de la pantalla), seleccionar el archivo que quiero editar y presionar Enter nuevamente. Para buscar rápidamente a través de múltiples archivos abiertos, simplemente escriba parte del nombre del archivo, seleccione el archivo y presione Entrar.

No tengo muchos archivos abiertos en el video, pero se vuelve increíblemente útil cuando empiezas a tener muchos de ellos.

Como el complemento ordena los almacenamientos intermedios utilizando un pedido de MRU, puede presionar Entrar dos veces y saltar al archivo más reciente que estaba editando.

Después de instalar el complemento, la única configuración que necesita es:

 nmap  :CtrlPBuffer 

Por supuesto, puede asignarlo a una clave diferente, pero creo que la asignación para ingresar es muy útil.

si está en OSX y desea poder hacer clic en sus tabs, use MouseTerm y SIMBL (tomado de aquí ). Además, mira esta discusión relacionada .

Cuando comencé a usar VIM, no me di cuenta de que se suponía que las tabs se usaran como diseños de ventanas diferentes, y el búfer cumple la función de editar / cambiar archivos múltiples entre sí. En realidad, al principio las tabs ni siquiera estaban allí antes de v7.0 y acababa de abrir un VIM dentro de una pestaña de terminal (estaba usando gnome-terminal en este momento), y alternaba entre tabs usando alt + numbers, ya que pensaba usar comandos como : buffers,: bn y: bp fueron demasiado para mí. Cuando se lanzó VIM 7.0, creo que es más fácil gestionar una gran cantidad de archivos y cambiar a ellos, pero recientemente me di cuenta de que los búferes siempre deberían ser el camino a seguir, a menos que sea necesario configurarlo para que funcione correctamente.

Así que probé vim-airline y habilité la barra de búfer visual en la parte superior, pero el gráfico tenía problemas con mi iTerm2, así que probé con un par de otros y parece que MBE funciona mejor para mí. También configuré shift + h / l como accesos directos, ya que los originales (moviéndome a la cabeza / cola de la página actual) no son muy útiles para mí.

map :bprev
map :bnext

Parece ser incluso más fácil que gt y gT, y: e es más fácil que: tabnew también. Encuentro: bd no es tan conveniente como: q aunque (MBE está teniendo algún problema) pero creo que puedo vivir con todos los archivos en buffer.

Puedes ser un loco absoluto y alias vim a vim -p al agregar en tu .bashrc :

alias vim="vim -p"

Esto dará como resultado la apertura de múltiples archivos del shell en tabs, sin tener que invocar :tab ball desde dentro vim después.

Sugeriría usar el complemento

NERDtree

Aquí está el enlace de Github con instrucciones.

Nerdtree

Yo uso vim-plug como un administrador de complementos, pero también puedes usar Vundle.

vim-plug

Vundle

La mayoría de las respuestas en este hilo están usando comandos de vim simple, lo cual está bien, pero pensé que proporcionaría una respuesta extensa usando una combinación de complementos y funciones que considero particularmente útiles (al menos algunos de estos consejos vinieron del archivo de Gary Bernhardt consejos de navegación ):

  1. Para alternar entre los dos últimos archivos, simplemente presione dos veces. Recomiendo asignar a la barra espaciadora:

     nnoremap   
  2. Para moverse rápidamente por un proyecto, la respuesta es una solución de coincidencia aproximada , como CtrlP . Lo enlace a a para un acceso rápido.

  3. En el caso de que quiera ver una representación visual de los búferes actualmente abiertos, utilizo el complemento BufExplorer . Simple pero efectivo

  4. Si quiero navegar por el sistema de archivos, usaría la línea de comando o una utilidad externa (Quicklsilver, Afred, etc.) pero para ver la estructura actual del proyecto, NERD Tree es un clásico. No use esto sin embargo en lugar de 2 como su principal método de búsqueda de archivos. Realmente lo hará más lento. Yo uso el enlace ff .

Esto debería ser suficiente para encontrar y abrir archivos. Desde allí, por supuesto, utiliza divisiones horizontales y verticales. Con respecto a las divisiones, encuentro estas funciones particularmente útiles:

  1. Abre nuevas divisiones en áreas más pequeñas cuando no hay suficiente espacio y amplíalas en la navegación. Consulte aquí para comentarios sobre lo que estos hacen exactamente:

     set winwidth=84 set winheight=5 set winminheight=5 set winheight=999 nnoremap v :111vs nnoremap s :rightbelow split set splitright 
  2. Mover de división a división fácilmente:

     nnoremap   nnoremap   nnoremap   nnoremap