Duplicar el búfer en una pestaña nueva en lugar de moverlo


10

Con frecuencia, quiero maximizar temporalmente un búfer en una página de pestañas y luego volver a la configuración anterior del búfer que estaba viendo. Mi flujo de trabajo actual para hacer algo como esto es cerrar todos los demás búferes usando <c-w>oo mover el búfer que estoy viendo actualmente a su propia pestaña <c-w>T. El problema con el segundo enfoque es que elimina el búfer de la página de pestaña original.

Me pueblan tres archivos a.txt, b.txty c.txtcon a, by crespectivamente.

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

Cuando abro los tres archivos en una página de pestañas, aparece lo siguiente.

ingrese la descripción de la imagen aquí

Entonces puedo moverme a.txta una pestaña por sí mismo. Cuando lo hago, sin embargo, a.txtse elimina de la página de pestaña original. (Entonces esto sería después de a <c-w>Tgt)

ingrese la descripción de la imagen aquí

Me gustaría poder elegir en el momento en que habría presionado <c-w>Tpara preservar el contenido del búfer original, crear una nueva página de pestañas que contenga solo el búfer enfocado actualmente y luego enfocar la nueva página de pestañas que acabo de creado. En otras palabras, un comando casi exactamente igual, <c-w>Texcepto que la página de pestaña original se conserva y ahora a.txtestá en dos páginas de pestaña.

¿Hay alguna forma de hacer esto?

Respuestas:


13

No estoy seguro, pero podrías intentarlo :tab split(o la versión más corta :tab sp).

El :splitcomando debe duplicar la visualización de la ventana gráfica a.txt, mientras que el :tabmodificador debe mover esta ventana gráfica a una página de pestaña dedicada.


Si desea cambiar el comportamiento de C-w T, puede reasignarlo así:

nnoremap <C-w>T :tab split<CR>

En términos más generales, cada vez que encuentra un comando que divide la ventana, y prefiere que cree una nueva página de pestañas, puede agregarle un prefijo :tab.

Se puede usar, por ejemplo, para leer un búfer de ayuda en una nueva pestaña:

:tab help {your_topic}

Por defecto, la nueva pestaña aparecerá después de la actual. Pero si desea que aparezca en otro lugar, puede prefijar :tabcon un recuento.

Por ejemplo, para duplicar la ventana gráfica actual en una página de pestañas después de la tercera, podría escribir:

:3tab split

Y para que aparezca como el primero:

:0tab split

Para más información, puedes leer :h :tab:

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one

2

Principalmente he estado evitando pestañas debido a este problema, pero ahora tengo una función que tiene el comportamiento de duplicación de pestañas que quiero. Lo he probado, pero no he comenzado a usarlo en serio. Puede haber algún inconveniente oculto en este flujo de trabajo.

Un problema con la función es que no duplica parte del estado del par anterior de la ventana del búfer (como si set numberestá activado o no). Especular un poco, c-w Tprobablemente no tiene este problema porque no se realiza ninguna duplicación y la ventana probablemente solo se reparetea.

Vim tiene un par de listas basadas en 1 para cosas como búferes, pestañas y ventanas. Por lo que puedo decir, están basados ​​en 1 porque la 0clave se usa para moverse al comienzo de una línea y, como resultado, pasar cero como argumento numérico es imposible.

Nos interesan tres listas para emular esta funcionalidad:

  • La lista global de páginas de pestañas
  • La lista de ventanas por- [página de pestaña]
  • La lista global de buffers

Guardamos todos estos valores, luego creamos una nueva pestaña a través de "tabnew". Las nuevas pestañas siempre se crean a la derecha, por lo que ninguno de los índices que se encuentran debajo de la pestaña de la que tabnewprocedemos están invalidados. (Sin embargo, una forma más sólida de hacer esto probablemente sería mejor).

El tabnewcomando también mueve el foco a la nueva pestaña y la ventana única dentro de ella. A partir de ahí, podemos usar el buffercomando para crear una vista en el búfer que originalmente tenía el foco.

Luego, usamos el índice guardado de la pestaña original para restaurar el enfoque a esa pestaña. Y luego, en gran parte por paranoia, establecemos el foco dentro de esa pestaña en la ventana original. Vim parece recordar qué ventana tiene el foco en pestañas no visibles, pero no me gusta confiar en eso.

(Algunos puntos estilísticos: la conversión numérica explícita 0+, las variables globales y las afirmaciones son todas intencionales)

function! TabDuplicate()
  " set vars, sanity checking
  let g:tabdup_win      = 0+ winnr()
  let g:tabdup_buf      = 0+ bufnr('%')
  let g:tabdup_tabpage  = 0+ tabpagenr()
  call assert_true(g:tabdup_win > 0)
  call assert_true(g:tabdup_buf > 0)
  call assert_true(g:tabdup_tabpage > 0)
  " make a new tab page,
  " the new tab page will have focus
  " none of the indices, which are all
  " less than the current index, are
  " invalidated by creating a new tab
  execute "tabnew"
  " visit the buffer we saved
  execute "buffer " . g:tabdup_buf
  " return to the original tab page
  execute "tabnext " . g:tabdup_tabpage
  " return focus to original window
  execute g:tabdup_win . " windcmd w"
endfunction
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.