¿Cómo edito un búfer existente en una nueva pestaña en vim?


51

Supongamos que he empezado vim así:

vim foo bar

Ahora decido que quiero cada uno de esos archivos en su propia pestaña. ¿Hay alguna manera de hacerlo sin salir de vim y agregar la -popción a mi línea de comando?


Probablemente muchos de ustedes estén buscando lo tabe %que se menciona en la respuesta de liuyang1 a continuación.
Mateusz Piotrowski

1
@MateuszPiotrowski Como mencioné en este comentario a esa respuesta , :tabe %no funciona con buffers que no tienen una ruta de archivo válida. :tab sbfunciona todo el tiempo.
JoL

Respuestas:


30

Cuando inicia vim así, no obtiene un cliente vim, el editor de texto está utilizando el terminal o el indicador de cmd: los dos archivos están en dos buffers diferentes. Use :lspara enumerar los buffers:

:ls
  1 %a   "foo"                 line 6
  2      "bar"             line 0

El% a es el búfer activo. Puede usar :b2para cambiar al búfer 2 o usar para pasar al :bnsiguiente o :bpal anterior. Prefiero (CTRL-W v) dividir las ventanas verticalmente, en lugar de (CTRL-W s), que se divide horizontalmente.

Si tiene 2 archivos cargados y no tiene pestañas (todavía), puede hacerlo :tabnewy en el nuevo tipo de pestaña:b2

Si desea tener siempre los buffers cargados en sus propias pestañas, consulte este artículo .


Sí, pero quiero tener pestañas.
innaM

Entonces, ¿ya ha iniciado vim de manera que tenga sus archivos en el cliente vim, no en un shell de cmd / terminal?
DaveParillo el

1
No estoy seguro de lo que quieres decir. Uso el shell para iniciar vim como se describe anteriormente y luego tengo un vim en ejecución.
INNAM

Ah! Supongo que nunca entendí que los buffers no son locales para las pestañas. Siempre pensé (sin pensar mucho) que cada pestaña tiene su propia lista de búfer.
innaM el

En mi máquina, vimlanzaré un editor dentro del shell. Para obtener la interfaz gráfica de usuario vim tengo que usar gvim. Y tiene razón: los buffers son globales para la aplicación vim.
DaveParillo el

47

¿Desea abrir un búfer en una nueva pestaña?

Divide la pantalla (Ctrl-W s), toma una ventana y Ctrl-W T


Hmm No es exactamente lo que tenía en mente, pero no está mal para empezar. Ctrl-w TAún no lo sabía . Por supuesto, la primera pestaña todavía tendrá dos buffers de esa manera.
innaM el

No. Después de dividir la pantalla en dos ventanas y abrir una de ellas en una pestaña nueva, desaparece de la primera pestaña. No permanecerá (al menos no en mi gvim72). En lo que respecta a los buffers, no están conectados a ventanas / pestañas ... son más como memoria donde vim almacena el contenido del archivo.
Torre

Ah! Tienes razón. Estaba malinterpretando la salida de :ls.
innaM el

Además, ctrl-w V divide la ventana verticalmente.
Shannon Nelson el

1
CTRL-w v es el comando correcto para dividir ventanas verticalmente
JRM

27

Puede lograr esto combinando el tabcomando con el sb[uffer]comando.

Primero, necesitará conocer la identificación del búfer que desea abrir en una nueva pestaña. Puedes descubrir esto con el lscomando:

:ls
  1 %a   "foo"                          line 1
  2      "bar"                          line 0

Una vez que tenga la identificación, puede abrirla fácilmente en una nueva pestaña usando:

:tab sb 2

El sbcomando normalmente abre el búfer dado en una nueva ventana dividida, pero el tabcomando hace que se abra en una nueva pestaña.

El tabcomando también le permite especificar en qué parte de la lista de pestañas se debe crear la nueva pestaña. Por ejemplo, :0tab sb 2la nueva pestaña 'barra' aparecerá al comienzo de la lista en lugar de después de la pestaña actual.


2
No necesita el número de búfer, dele una parte inequívoca del nombre del búfer y VIM hace el resto por usted.
postre

1
Esta fue la respuesta que estaba buscando y necesitaba. ¡Estaba consternado cuando :tab buffer part-of-nameno abrí una nueva pestaña! Pero :tab sb part-of-namefuncionó como un encanto. ¡¡¡¡Gracias!!!!
Sukima

Esta no es la pregunta exacta de OP, pero era exactamente lo que estaba buscando :)
jackcogdill

25

Una mejor manera de lograr lo que OP solicitó es esto:

:bufdo tab split

Esto abrirá cada búfer en una pestaña propia, sin importar cuántos haya. Si usa tanto, es fácil convertirlo en un mapeo en su .vimrc. Combinado con algo como este pequeño complemento vim, lo siguiente abrirá cada elemento desde :grep(o : Ack ) en una pestaña propia:

:grep foo
:QuickFixOpenAll
:bufdo tab split

Por supuesto, al recurrir a un complemento, sería bastante fácil modificarlo para abrir el contenido de la lista de soluciones rápidas directamente en pestañas.

ACTUALIZACIÓN : Realmente tengo que dar un agradecimiento al comentario de ggustafsson a continuación. Es de lejos la mejor respuesta del lote e ilustra bellamente la tendencia de Vim hacia el comportamiento compositivo. La sugerencia es:

 :tab sball

Vale la pena buscar la ayuda de Vim para : tab y : sball para ver qué está pasando aquí.


Un enfoque similar de una edición anterior, para la posteridad, es :bufdo execute "tabnew %". Creo que el nuevo enfoque es un poco más claro.
John Whitley

Una advertencia: si el búfer de inicio en vim no está vacío, esto parece abrir el último búfer dos veces. Publicaré una actualización si encuentro una solución simple.
John Whitley

12
:tab sballParece funcionar mejor.
ggustafsson

6

1. Abra dos archivos en Vim.

$ vim foo bar

2. Verifique los números de tampones.

: ls
  1% un "foo"
  2 "barra"

3. Encadena dos comandos: tabnewpara abrir una nueva pestaña y b <buffer_number>cargar el búfer deseado en la pestaña.

: tabnew | b 2

8
El problema con el paso 3 es que primero crea una nueva pestaña con un búfer vacío, y luego abre el búfer 2, lo que resulta en un búfer sin título adicional en la lista de búferes. Mejor usar:tab sb 2
rkjnsn

1
@rkjnsn, debe publicar eso como respuesta: responde mejor a la pregunta '¿cómo edito un búfer existente en una nueva pestaña en vim?'
JonnyRaa

1
@JonnyLeeds hecho.
rkjnsn

4

Solo agrega un punto que otros chicos no mencionaron.

  • ventana actual a nueva pestaña

Si tiene varias ventanas, <C-W>Tmoverá esta ventana a una nueva pestaña. Sin embargo, este acceso directo solo para "Ventana", no "buffer". Si prefiere este estilo, :spo <C-W>spara duplicar el búfer actual a una ventana más, entonces <C-W>Tmuévalo a una nueva pestaña.

4 pulsaciones de teclas o 7 pulsaciones de teclas.

  • buffer actual a la nueva pestaña

:tabe % para abrir una nueva pestaña para el búfer actual.

7 pulsaciones de teclas.

  • buffer a nueva pestaña

Si usa el complemento CtrlP, también podría usar "CtrlPBuffer", luego con <C-t>acceso directo para abrirlo con una nueva pestaña. Este estilo, fácilmente para cambiar a diferentes buffers.

Con acceso directo de "CtrlPBuffer", 4 pulsaciones de teclas o más.


:tabe %es lo que he estado buscando por mucho tiempo, gracias!
pevik

No, :tabe %realmente no abre una nueva pestaña para el búfer actual. Lo que sucede es que %se expande a la ruta del archivo del búfer actual y :tabeabre esa ruta. Vim verá que estás intentando abrir un archivo que ya tienes abierto y reutilizará el búfer que tienes. Esto significa que esto no funciona con buffers que no tienen ruta de archivo. Si abre un nuevo archivo con :newy no lo ha guardado, no puede ponerlo en una nueva pestaña con esto. El verdadero comando que necesita es lo que rkjnsn puso en su respuesta: :tab sb %o más breve::tab sb
JoL
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.