Usando las pestañas de Vim como buffers

366

He examinado la posibilidad de utilizar pestañas en Vim (con :tabe, :tabnew, etc.) como un reemplazo para mi práctica actual de tener muchos archivos se abren en la misma ventana en tampones ocultos.

Me gustaría que cada archivo distinto que he abierto esté siempre en su propia pestaña. Sin embargo, hay algunas cosas que se interponen en el camino de esto. ¿Cómo soluciono esto?

  1. Cuando los comandos les gusta gfy ^]saltan a una ubicación en otro archivo, el archivo se abre en un nuevo búfer en la pestaña actual. ¿Hay alguna manera de hacer que todos estos tipos de comandos abran el archivo en una nueva pestaña o cambien a la pestaña existente con el archivo si ya está abierto?

  2. Al cambiar buffers puedo usar :b <part of filename><tab> y completará los nombres de archivos en buffers existentes. <part of filename>incluso puede ser el medio de un nombre de archivo en lugar del principio. ¿Hay un equivalente para cambiar de pestaña?

sangría
fuente

Respuestas:

642

Pará pará pará.

No es así como las pestañas de Vim están diseñadas para ser utilizadas. De hecho, están mal nombrados. Un nombre mejor sería "ventana gráfica" o "diseño", porque eso es lo que es una pestaña: es un diseño diferente de las ventanas de todos los búferes existentes.

Intentar vencer a Vim en 1 pestaña == 1 búfer es un ejercicio inútil. Vim no sabe o cuidado y no lo respetará en todos los órdenes, en particular, cualquier cosa que utiliza el búfer quickfix ( :make, :grep, y :helpgrepson los que vienen a la mente) ignorará felizmente pestañas y no hay nada que pueda hacer para evitar ese.

En lugar:

  • :set hidden
    Si aún no tiene este conjunto, hágalo. Hace que vim funcione como cualquier otro editor de archivos múltiples en el planeta. Puede haber editado buffers que no están visibles en una ventana en alguna parte.
  • Uso :bn, :bp, :b #, :b name, y ctrl-6para cambiar entre topes. Me gusto a ctrl-6mí mismo (solo cambia al búfer utilizado anteriormente, o #ctrl-6cambia al número de búfer #).
  • Úselo :lspara enumerar buffers o un complemento como MiniBufExpl o BufExplorer .
Zathrus
fuente
192
Para mí, esto es un error, no un "error del usuario". La búsqueda en la web de 'pestañas vim' indica que casi todos los demás no están de acuerdo con usted o desconocen la forma "real" de usar las pestañas Vim. Además, si las pestañas son realmente vistas de "diseño", ¿por qué los títulos de pestañas predeterminados son el nombre del archivo actual? Si quisiera varias vistas del mismo archivo, todos los títulos de mis pestañas tendrían el mismo nombre (¿no es muy útil?). De cualquier forma que lo mire, la implementación de pestaña predeterminada en Vim es defectuosa.
cmcginty
45
¿Qué más vas a mostrar en el título de la pestaña? Muestra el nombre del búfer actual (no "nombre de archivo"). Puede cambiar lo que se muestra en el título de la pestaña de todos modos.
aehlke
46
@Casey: FWIW, cuando supe por primera vez sobre las pestañas de Vim y tuve que pensar en ellas y para qué servían, pensé exactamente en la definición dada por Zathrus. (Soy un Vim Novato por cierto). Entonces, no, no estoy de acuerdo con que sea una característica tan poco clara o poco intuitiva ... y mucho menos estoy de acuerdo en que "sobre todos" no está de acuerdo (y creo que al menos uno o dos árbitros podrían darle más peso a la afirmación). Funciona increíblemente bien para tener múltiples diseños de pantalla simultáneos.
ata
17
Este comentario es incorrecto, no estoy seguro de por qué ha sido votado o aceptado. Robince a continuación tiene la respuesta correcta -: tab sball y: switchbuf son lo que estás buscando.
Roel
38
+1 para "Parar, parar, parar". Vim es tanto una mentalidad como una herramienta. Es importante enseñar a los nuevos usuarios la mentalidad, para que puedan usar la herramienta en todo su potencial.
Cody Poll
273

Llegué un poco tarde a la fiesta, pero me sorprendió no haber visto lo siguiente en esta lista:

:tab sball - Esto abre una nueva pestaña para cada búfer abierto.

:help switchbuf- esto controla el comportamiento de cambio de búfer, intente :set switchbuf=usetab,newtab. Esto debería significar cambiar a la pestaña existente si el búfer está abierto o crear uno nuevo si no.

robince
fuente
44
1 para switchbuf- set switchbuf=useopenes grande para evitar el comportamiento molesto de :make, :vimgrepy comandos similares que cambia las memorias intermedias en el diseño de la ventana, incluso cuando ya se ha mostrado el búfer.
mMontu
3
¿Por qué no me queda? después de configurar :se switchbuf=usetab,newtab, cuando se usa bnpara cambiar el búfer, ¿aún abre el archivo del búfer en la pestaña actual en lugar de cambiar a la pestaña existente? ¿Hay algo mal?
zhiyelee
173

Vim :help windowexplica bastante bien la confusión "pestañas vs amortiguadores".

Un búfer es el texto en memoria de un archivo.
Una ventana es una ventana gráfica en un búfer.
Una página de pestañas es una colección de ventanas.

La apertura de múltiples archivos se logra en vim con buffers . En otros editores (por ejemplo, notepad ++) esto se hace con pestañas, por lo que la pestaña de nombre en vim puede ser engañosa.

Windows tiene el propósito de dividir el espacio de trabajo y mostrar múltiples archivos (buffers) juntos en una pantalla. En otros editores, esto podría lograrse abriendo múltiples ventanas GUI y reorganizándolas en el escritorio.

Finalmente, en esta analogía, las páginas de pestañas de vim corresponderían a múltiples escritorios, es decir, diferentes reordenamientos de ventanas.

Como help: tab-pageexplica vim , se puede usar una página de pestañas cuando se desea editar temporalmente un archivo, pero no se desea cambiar nada en el diseño actual de ventanas y buffers. En tal caso, se puede usar otra página de pestañas solo para editar ese archivo en particular.

Por supuesto, debe recordar que mostrar el mismo archivo en muchas páginas de pestañas o ventanas daría lugar a mostrar la misma copia de trabajo (búfer).

crenate
fuente
11
Esta es en realidad una respuesta increíble, pero tomó un par de lecturas para tener sentido. buffers = pestañas, windows = gui windows, pestañas páginas = escritorios tienen el mejor sentido hasta ahora que he encontrado para alguien que no está familiarizado con los conceptos
icc97
44
Tiendo a pensar en ellos como mirando a través de una ventana a una habitación - buffer= objeto , window= panel y tab= ventana . Puedo moverme por la habitación y mirar desde diferentes ventanas ( tabs). Las diferentes ventanas pueden tener diferentes números, arreglos y tamaños de paneles . El mismo objeto se puede ver simultáneamente desde diferentes paneles en diferentes ventanas .
go2null
Si está familiarizado con los espacios de trabajo de Linux y el paradigma de Windows, verá la herencia del vimuso. Al principio solo había una ventana . Los gestores de ventanas le permitieron dividir las ventanas en paneles (mosaico WM) o en paneles superpuestos (WM flotante), pero todavía se referían a cada panel como una ventana. Ahora agregue el concepto de un espacio de trabajo donde el panel se puede mostrar en múltiples espacios de trabajo. Entonces, en este paradigma, buffer= aplicación , window= ventana y tab= espacio de trabajo .
go2null
56

Al contrario de algunas de las otras respuestas aquí, digo que puedes usar pestañas como quieras. vim fue diseñado para ser versátil y personalizable, en lugar de obligarlo a trabajar de acuerdo con parámetros predefinidos. Todos sabemos cómo a nosotros los programadores nos encanta imponer nuestra "ética" a todos los demás, por lo que este logro es sin duda una característica principal.

<C-w>gfes la pestaña equivalente del gfcomando de los buffers . <C-PageUp>y <C-PageDown>cambiará entre pestañas. (En Byobu, estos dos comandos nunca funcionan para mí, pero funcionan fuera de Byobu / tmux. Las alternativas son gty gT.) <C-w>TMoverán la ventana actual a una nueva pestaña.

Si prefiere que vim use una pestaña existente si es posible, en lugar de crear una pestaña duplicada, agréguela :set switchbuf=usetaba su archivo .vimrc. Puede agregar newtaba la lista ( :set switchbuf=usetab,newtab) para forzar que los comandos QuickFix que muestran errores de compilación se abran en pestañas separadas. Prefiero en splitcambio, que abre los errores de compilación en una ventana dividida.

Si tiene habilitado el soporte para mouse :set mouse=a, puede interactuar con las pestañas haciendo clic en ellas. También hay un +botón por defecto que creará una nueva pestaña.

Para la documentación en pestañas, escriba :help tab-pageen modo normal. (Después de hacer eso, puede practicar mover una ventana a una pestaña usando <C-w>T). Hay una larga lista de comandos. Algunos de los comandos de la ventana tienen que ver con pestañas, por lo que es posible que también desee ver esa documentación a través de :help windows.

Adición: 2013-12-19

Para abrir varios archivos en vim con cada archivo en una pestaña separada, use vim -p file1 file2 .... Si eres como yo y siempre olvidas agregar -p, puedes agregarlo al final, ya que vim sigue las reglas normales de análisis de opciones de línea de comando. Alternativamente, puede agregar una asignación de alias bash vima vim -p.

Zenexer
fuente
3
+1 para, vim -psin embargo, tenga en cuenta que solo se mostrarán hasta 10 pestañas de forma predeterminada. Los archivos adicionales se cargan en buffers, pero no se muestran en su propia pestaña.
IanB
@IanB: ¿cómo supero la configuración predeterminada de limitarlo a 10 pestañas?
0xC0000022L
3
@ 0xC0000022L ver tabpagemaxconfiguración
IanB
14

Tuve el mismo problema. Quería que las pestañas funcionaran como buffers y nunca logré conseguirlas. ¡La solución que finalmente decidí fue hacer que los buffers se comporten como pestañas!

Eche un vistazo al complemento llamado Mini Buffer Explorer , una vez instalado y configurado, podrá trabajar con los buffers de la misma manera que las pestañas sin perder ninguna funcionalidad.

Dominic Dos Santos
fuente
10

Esta es una respuesta para aquellos que no están familiarizados con Vim y que provienen de otros editores de texto (en mi caso, Sublime Text).

Leí todas estas respuestas y aún no estaba claro. Si los lees lo suficiente, las cosas comienzan a tener sentido, pero me llevó horas ir y venir entre preguntas.

Lo primero es, como otros han explicado:

Las páginas de pestañas , se parecen mucho a las pestañas , actúan como pestañas y se parecen mucho a las pestañas en la mayoría de los otros editores de GUI, pero no lo son. Creo que es un mal modelo mental construido en Vim, que desafortunadamente nubla el poder extra que tienes dentro de una página de pestañas.

La primera descripción que entendí fue de la respuesta de @ crenate es que son equivalentes a múltiples escritorios. Cuando se lo ve en ese sentido, solo tendrá un par de escritorios abiertos, pero tendrá muchas ventanas GUI abiertas dentro de cada uno.

Yo diría que son similares a otros editores / navegadores:

  1. Agrupaciones de pestañas
  2. Espacios de trabajo de Sublime Text (es decir, una lista de los archivos abiertos que tiene en un proyecto)

Cuando los ve así, se da cuenta del poder de ellos de que puede agrupar fácilmente conjuntos de archivos (buffers) juntos, por ejemplo, sus archivos CSS, sus archivos HTML y sus archivos JS en diferentes páginas de pestañas. Lo que en realidad es bastante asombroso.

Otras descripciones que encuentro confusas

Viewport

Esto no tiene ningún sentido para mí. Una ventana gráfica que, aunque tiene un término de diccionario definido , solo he oído referirse a las ventanas de Vim en el :help windowdocumento. Viewport no es un término que haya escuchado con respecto a editores como Sublime Text, Visual Studio, Atom, Notepad ++. De hecho, nunca había oído hablar de eso para Vim hasta que comencé a intentar usar páginas con pestañas.

Si ve páginas con pestañas como varios escritorios, entonces, hacer referencia a un escritorio como una sola ventana parece extraño.

Espacios de trabajo

Posiblemente esto tenga más sentido, la definición del diccionario es:

Una instalación de almacenamiento de memoria para uso temporal.

Entonces es como un lugar donde almacena un grupo de buffers.

Inicialmente no parecía el concepto de Sublime Text de un espacio de trabajo que es una lista de todos los archivos que tienes abiertos en tu proyecto:

el archivo sublime-workspace, que contiene datos específicos del usuario, como los archivos abiertos y las modificaciones a cada uno.

Sin embargo, pensando más en esto, esto realmente está de acuerdo. Si considera una página de pestaña Vim como un proyecto de Sublime Text, entonces parecería extraño tener solo un archivo abierto en cada proyecto y seguir cambiando entre proyectos. Por lo tanto, es extraño usar una página de pestañas para abrir solo un archivo.

Colección de ventanas

Se :help windowrefiere a las páginas de pestañas de esta manera. Además, muchas otras respuestas usan el mismo concepto. Sin embargo, hasta que entiendas lo que es una ventana vim, entonces no sirve de mucho, como construir un castillo en la arena.

Como mencioné anteriormente, una ventana vim es lo mismo que una ventana gráfica y silenciosa, excelentemente explicada en este artículo de linux.com :

Una característica realmente útil en Vim es la capacidad de dividir el área visible entre uno o más archivos, o simplemente dividir la ventana para ver dos bits del mismo archivo más fácilmente. La documentación de Vim se refiere a esto como una ventana gráfica o ventana, indistintamente.

Es posible que ya esté familiarizado con esta función si alguna vez ha utilizado la función de ayuda de Vim utilizando: tema de ayuda o presionando la tecla F1. Cuando ingresa ayuda, Vim divide la ventana gráfica y abre la documentación de ayuda en la ventana superior, dejando su documento abierto en la ventana inferior.

Me resulta extraño que una página de pestañas se denomine una colección de ventanas en lugar de una colección de buffers. Pero supongo que puede tener dos páginas de pestañas separadas, cada una con múltiples ventanas, todas apuntando al mismo búfer, al menos eso es lo que entiendo hasta ahora.

icc97
fuente
1
Finalmente, después de un año sólido de uso de Vim a tiempo completo, me encontré con un caso en el que quería usar más de una página de pestañas. Actualmente, los buffers funcionan perfectamente para mí, ya que usaría pestañas en otros editores. Pero al tener un monitor grande, estaba comparando un montón de 3-4 buffers diferentes. Luego, un colega quería que buscara algún código en otra parte de la base de código. En lugar de perder mi conjunto de ventanas de comparación, podría crear una nueva página de pestañas que luego me permita hacer una búsqueda por separado como lo haría al usar Vim normalmente y luego podría cerrar la página de pestañas una vez hecho y volver a mi conjunto inicial
icc97
4

Mirando: pestañas de ayuda no parece que vim quiera trabajar como tú ...

Los buffers se comparten entre pestañas, por lo que no parece posible bloquear un buffer determinado para que aparezca solo en una pestaña determinada.

Sin embargo, es una buena idea.

Probablemente podría obtener el efecto que desea utilizando un terminal que admita pestañas, como terminal multi-gnomo, y luego ejecute instancias vim en cada pestaña de terminal. Aunque no es perfecto ...

Mike G.
fuente
He intentado que, el problema de que, además de lo que es difícil de navegar entre pestañas, es que texto pegado no puede ser compartida por las fichas de terminales, ya que son esencialmente dos terminales / conchas diferentes
PUK
@puk: Pruebe el complemento YankRing vim. Guarda el texto arrancado en un archivo, por lo que se puede compartir entre instancias vim.
pixelastic
@Pixelastic Encontré una solución adecuada aquí para tirar al portapapeles del sistema. Además, Vim funciona mejor en una instancia. Dejé de hacer que hiciera lo que quería y aprendí a usar vim correctamente :-) stackoverflow.com/a/8757876/654789
puk
@puk: Gracias, no se me ocurrió que usar el portapapeles del sistema también significa compartirlo entre instancias vim :)
pixelastic
4
  • Puede asignar comandos que normalmente manipulan los búferes para manipular pestañas, como he hecho con gf en mi .vimrc:

    map gf :tabe <cfile><CR>
    

    Estoy seguro de que puedes hacer lo mismo con [^

  • No creo que vim sea compatible con esto para pestañas (todavía). Uso gt y gT para pasar a las pestañas siguiente y anterior, respectivamente. También puede usar Ngt, donde N es el número de la pestaña. Una molestia que tengo es que, por defecto, el número de la pestaña no se muestra en la línea de la pestaña. Para solucionar esto, puse un par de funciones al final de mi archivo .vimrc (no pegué aquí porque es largo y no se formateó correctamente).

Lucas Oman
fuente
<c-w>gfabrirá el nombre del archivo debajo del cursor en una nueva pestaña
Peter Rincker
4

Uso buffers como pestañas, usando el plugin BufExplorer y algunas macros:

" CTRL+b opens the buffer list
map <C-b> <esc>:BufExplorer<cr>

" gz in command mode closes the current buffer
map gz :bdelete<cr>

" g[bB] in command mode switch to the next/prev. buffer
map gb :bnext<cr>
map gB :bprev<cr>

Con BufExplorer no tienes una barra de pestañas en la parte superior, pero por otro lado ahorra espacio en tu pantalla, además puedes tener un número infinito de archivos / buffers abiertos y la lista de búferes se puede buscar ...

jkramer
fuente
2

Si desea que los búferes funcionen como pestañas, consulte el complemento de tabulación .

Utiliza una sola ventana y agrega una línea en la parte superior para simular las pestañas (solo muestra la lista de buffers). Esto salió hace mucho tiempo cuando las pestañas solo eran compatibles con GVim pero no en la línea de comando vim. Como solo funciona con buffers, todo se integra bien con el resto de vim.

thien.vuong
fuente