¿Cómo puedo abrir varias pestañas a la vez?


14

Si yo uso:

:tabedit file1 file2

Yo obtengo:

E172: Only one file name allowed

¿Hay alguna forma de usar :tabeditcon múltiples nombres de archivo? ¿O otra forma de abrir varias pestañas a la vez?



@kenorb Sí. Y tiene exactamente la misma respuesta ya aquí, excepto que no hay explicación sobre lo que hace. Entonces, ¿cómo el enlace a él agrega algún valor?
Martin Tournoij

Hay algunas otras respuestas, y pueden surgir nuevas respuestas. En segundo lugar, hay algunos otros enlaces / relacionados similares allí, por lo que los usuarios también pueden aprender más de las relaciones relacionadas.
kenorb

He aprendido esto de una sola línea: :args *.c | tab all. La otra pregunta es más popular que esta, por lo que es bueno vincularla también.
kenorb

Respuestas:


10

Dados los problemas y la complejidad en mi otra respuesta usando la forma "incorporada" modificando la lista de argumentos, agregué por propia función pequeña para hacer esto:

" Open multiple tabs at once
fun! OpenMultipleTabs(pattern_list)
    for p in a:pattern_list
        for c in glob(l:p, 0, 1)
            execute 'tabedit ' . l:c
        endfor
    endfor
endfun

command! -bar -bang -nargs=+ -complete=file Tabedit call OpenMultipleTabs([<f-args>])

Ahora puedes usar :Tabedit *.vim. Esta función expandirá todos los patrones globales y se ejecutará :tabedit <f>para cada archivo. Puede agregar tantos nombres de ruta como desee, por ejemplo, todo esto funciona:

:Tabedit file.rb
:Tabedit *.c
:Tabedit file1.py file2.py _*.py
:Tabedit /etc/hosts file{1,2}.sh

Bueno, y así sucesivamente ...

Pongo esto en un pequeño globedit.vim plugin, que también contiene comandos para :Edit, :Split, etc.


2
Gran función y comando! Algunas mejoras: (1) Use en [<f-args>]lugar de "<args>"- de esa manera, el patternparámetro será una Lista (matriz) y no tendrá que lidiar con la división manual de la cadena. (2) Pase un valor distinto de cero como tercer argumento para glob()que devuelva una Lista. Entonces puede evitar dividirse manualmente allí también. Tendrá que pasar 0como segundo argumento para omitir sin afectar el comportamiento: glob(l:p, 0, 1).
tommcdo

7

Hasta donde sé, la única forma integrada de hacer esto es:

:args *.vim
:tab all

Primero, :argsreemplazará la lista de argumentos. La lista de argumentos enumera los archivos con los que abrió Vim; por lo vim file1 file2medios que contiene la lista de argumentos file1e file2.
Podemos modificar esto en tiempo de ejecución, y Vim abrirá un búfer para cada nueva entrada en la lista de argumentos.
Ver :help argument-listpara más información.

El :allcomando abre una ventana para cada entrada en la lista de argumentos, el :tabcomando ejecuta un comando y abre una nueva pestaña cuando el comando dado abriría una nueva ventana.

Advertencias

Hay algunas advertencias a este método.

En primer lugar, no hay verificación de duplicados, por lo que puede terminar con 2 o más pestañas para el mismo búfer.

Pero el mayor problema es que reemplaza todas sus pestañas con lo que está en la lista de argumentos; entonces perdiste todas las pestañas existentes.
Puede eludir esto un poco usando :argadd *.vimpara agregar a la lista de argumentos, en lugar de reemplazarlo; pero comandos como :edito :tabeditno , no altera la lista de argumentos, y se perderá esas pestañas menos que se agregan a la lista de argumentos (que todavía tiene en la lista de amortiguamiento, sin embargo). También es posible que no desee abrir todo en su lista de argumentos en una pestaña, tal vez solo quiera abrir 2 archivos como una pestaña adicional.

Quizás podría mejorar esto un poco agregando primero agregar todas las pestañas abiertas actualmente a la lista de argumentos (que realmente no puedo poner a trabajar), pero esto aún está lejos de ser perfecto. Si una pestaña tiene 2 o más ventanas, aún las modificará ...


Podría estar equivocado, pero ¿no abre esto una pestaña adicional (como se ve en mi pregunta sobre cómo abrir pestañas por defecto)?
muru

1
Si te refieres a mi respuesta a esa pregunta, la diferencia es que usé :argdo tabedit %, lo que abre una nueva pestaña para cada argumento. Comenzar con una pestaña y abrir n nuevas naturalmente te dejaría con n + 1 pestañas. :tab allEs una solución mucho mejor.
tommcdo

@tommcdo Estaba hablando de la respuesta de Josh Petrie . No le pasarías a uno de sus alias, ¿verdad? :)
muru

Jaja, no. ¡Debo haber estado pensando en una pregunta diferente!
tommcdo

2

Puede usar el :nextcomando en su lugar, por ejemplo:

:n file1 file2

o:

:n *.txt

Esto es lo mismo que usar :args *.vim? Al menos, se comporta igual, y lo :help next_fdocumenta como el mismo ...
Martin Tournoij

Es más corto y simple y no lo mencionaste. El comportamiento es el mismo, como lo hizo en la pregunta para eso.
kenorb

2

Desde la línea de comandos puedes usar:

vim file1 ... filen -p

Y si olvidó usar -ptodavía puede usar

:tab ball

Por cierto, no olvides que la variable tabpagemax(valor predeterminado 10) limita cuántas pestañas puedes abrir de esta manera.


0

En realidad, puede abrir nuevas pestañas y mantener sus pestañas actuales sin escribir nuevas funciones (consulte esta respuesta en Desbordamiento de pila ):

:args file1 file2 | argdo tabe

Es posible que desee abrir una nueva pestaña vacía ( :tabe) antes de hacerlo, porque el primer archivo se abrirá en la pestaña actual. Además, una pestaña vacía adicional se dejará abierta (vea :help argdopara entender por qué).


También debe corregir el resaltado de sintaxis (por alguna razón), como se explica en el enlace y cerrar la última pestaña, por lo que el comando 'completo' sería: :tabnew | args file1 file2 | argdo tabe | tabdo syntax onDebe presionar Entrar para borrar el mensaje y escribir :closepara eliminar el último ( vacío) ... es una gran cantidad de tipeo, y solo vale la pena si está abriendo muchas pestañas (para 2 o 3 archivos, solo usar :tabedos veces sería más rápido).
Martin Tournoij
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.