J'ai surtout évité les onglets à cause de ce problème, mais maintenant j'ai une fonction qui a le comportement de duplication d'onglets que je veux. Je l'ai testé, mais je n'ai pas vraiment commencé à l'utiliser. Il peut y avoir un inconvénient caché à ce flux de travail.
Un problème avec la fonction est qu'elle ne duplique pas une partie de l'état de la paire tampon-fenêtre précédente (comme si elle set number
est activée ou non). Spéculer un peu, c-w T
n'a probablement pas ce problème car aucune duplication n'est effectuée et la fenêtre est probablement juste réparée.
Vim a quelques listes basées sur 1 pour des choses comme les tampons, les onglets et les fenêtres. Pour autant que je sache, ils sont basés sur 1 car la 0
touche est utilisée pour se déplacer au début d'une ligne et, par conséquent, passer zéro comme argument numérique est impossible.
Nous nous soucions de trois listes pour émuler cette fonctionnalité:
- La liste globale des pages à onglet
- La liste des fenêtres par [onglet]
- La liste globale des tampons
Nous enregistrons toutes ces valeurs, puis créons un nouvel onglet via "tabnew". De nouveaux onglets sont toujours créés à droite, donc aucun des indices sous l'onglet dont nous venons tabnew
n'est invalidé. (Une façon plus robuste de le faire serait probablement mieux cependant).
La tabnew
commande déplace également le focus vers le nouvel onglet et la fenêtre unique qu'il contient. De là, nous pouvons utiliser la buffer
commande pour créer une vue sur le tampon qui avait initialement le focus.
Ensuite, nous utilisons l'index enregistré de l'onglet d'origine pour restaurer le focus sur cet onglet. Et puis, en grande partie hors de la paranoïa, nous avons mis le focus dans cet onglet sur la fenêtre d'origine. Vim semble se rappeler quelle fenêtre a le focus dans les onglets non visibles, mais je n'aime pas me fier à cela.
(Quelques points stylistiques: la conversion numérique explicite 0+
, les variables globales et les assertions sont toutes intentionnelles)
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