Mover ventana existente a pestaña existente

14

A veces necesito mover ventanas a una pestaña ya existente, y me preguntaba si había un atajo de comando / teclado que pudiera hacer esto. Sé que puedo cerrar la ventana, cambiar a la pestaña y luego abrirla en una nueva división, pero me preguntaba si había una forma más corta de lograr esto. Tenga en cuenta que quiero moverlo a una pestaña existente , no a una pestaña nueva como lo <C-w>Thace.

Árbol de hoja perenne
fuente
No es posible mover ventanas a través de pestañas.
lcd047
Hmm, eso está muy mal. Probablemente podría crear algún mapeo o comando que podría lograrlo.
EvergreenTree
Creo que lo mejor que puede hacer es guardar todas las configuraciones de la ventana y luego volver a crearlas en la pestaña existente.
tommcdo

Respuestas:

10

Aunque hay comandos para mover las ventanas existentes en la página de la pestaña actual (es decir, afectar el diseño de la ventana al girar, cambiar el tamaño y mover), no hay comandos para mover una ventana a otra pestaña.

Como una ventana es solo una ventana gráfica en un búfer cargado, debe:

  1. Tenga en cuenta el número de búfer que se muestra en la ventana actual.
  2. :close! la ventana.
  3. Cambie a la página de pestaña de destino existente.
  4. :sbuffer el número de búfer para volver a abrirlo.

Perderá cualquier opción específica de la ventana por esto. También puede guardarlos y restaurarlos en un script.

Ingo Karkat
fuente
Pensé que este era el caso. Probablemente podría hacer un pequeño script que haga exactamente eso.
EvergreenTree
2
  1. ir a la pestaña objetivo existente
  2. dividirlo como quieras
  3. :b ab(pestaña-completa el resto)

abson solo letras aleatorias, reemplácelas con el comienzo del nombre de archivo deseado. :bLa finalización de tabulación ha funcionado muy bien para mí, por lo general puede encontrar el búfer de origen correcto basado en solo una letra y 1-2 Tabpulsaciones de teclas.

El beneficio de este enfoque sobre el de Ingo es la falta de notar o recordar algo, lo que significa menos carga cognitiva. Nombre de archivo que ya sabes de todos modos.

lkraav
fuente
2

Los dos comandos definidos a continuación mueven todos los búferes de la pestaña de la derecha a la pestaña actual y luego cierran la pestaña de la derecha. Mtabsplos mueve dividiéndolos horizontalmente y los Mtabvspdivide verticalmente. Debe mover la pestaña combinada antes de usar los comandos. Uso +tabm, -tabmo <n>tabm.

Preparar

Agregue el siguiente script vim a su vimrc:

function! Mtab(vert)
    if tabpagenr() == tabpagenr("$")
        return 0
    endif
    +tabnext
    let s:killed_tab = tabpagenr()
    let s:buf_list = tabpagebuflist()
    -tabnext
    for item in s:buf_list
        if a:vert
            vsp
        else
            sp
        endif
        execute "buf " . item
    endfor
    execute "tabclose " . s:killed_tab
endfunction

command! Mtabsp call Mtab(0)
command! Mtabvsp call Mtab(1)

Detalles técnicos

La función Mtab recibe un parámetro vert. Determina si la pestaña actual se divide horizontal o verticalmente.

El resultado deseado se logra con los siguientes pasos:

  1. Pasamos a la siguiente pestaña temporalmente
  2. Use dos variables para hacer referencia a su número de tabulación y a sus buffers
  3. Regresar a la pestaña actual
  4. Dividimos la pestaña y abrimos cada búfer
  5. Finalmente, cerramos la pestaña de la derecha

Si nuestra pestaña actual es la última, los comandos se ignoran.

evpo
fuente
1

Si se trata de un archivo de memoria intermedia (no va a trabajar para rascar tampones, etc.), se puede:

  1. :let @f=@%ENTER - en la ventana de origen;
    • Esto reemplaza el contenido del registro regular f con el contenido del registro especial % , que contiene el nombre del archivo actual.
    • Nota: Elegí el registro f como en el archivo , pero puede usar cualquier otro registro que desee.
    • Puede verificar que el registro contiene la ruta correcta con: :echo @f
  2. Opcionalmente: Ctrl-WCtrl-Q- para cerrar la ventana anterior;
  3. gt/ gT- navega a la pestaña de destino (y ventana);
  4. Ctrl-Ws - divide la pestaña de la forma que quieras para abrir una nueva ventana;
  5. :e␣Ctrl-RfENTER
    • en la ventana recién abierta, carga un archivo desde la ruta almacenada en el registro f ;
    • Nota: el carácter here aquí marca un espacio regular.

Nota importante: ¡ el paso final no funcionará correctamente si la ruta contiene espacios o algunos caracteres especiales! :-( Como solución alternativa, el siguiente comando, un poco más largo, debería funcionar para rutas con espacios (aunque aún puede fallar para algunos otros caracteres especiales):

  • :e␣"Ctrl-Rf"ENTER

(es decir, citando el resultado de Ctrl-R, f )

Inspirado por las respuestas de lkraav e ingo-karkat .

akavel
fuente
Esto es fantástico, necesito configurar una asignación para "cortar y pegar" de Windows en pestañas.
dragon788