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 number
está activado o no). Especular un poco, c-w T
probablemente 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 0
clave 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 tabnew
procedemos están invalidados. (Sin embargo, una forma más sólida de hacer esto probablemente sería mejor).
El tabnew
comando también mueve el foco a la nueva pestaña y la ventana única dentro de ella. A partir de ahí, podemos usar el buffer
comando 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