Ho principalmente evitato le schede a causa di questo problema, ma ora ho una funzione che ha il comportamento di duplicazione delle schede che desidero. L'ho provato, ma non ho iniziato ad usarlo sul serio. Potrebbe esserci qualche inconveniente nascosto a questo flusso di lavoro.
Un problema con la funzione è che non duplica parte dello stato dalla precedente coppia buffer-window (come se set number
sia attiva o meno). Speculando un po ', c-w T
probabilmente non ha questo problema perché non viene eseguita alcuna duplicazione e la finestra è probabilmente appena riparata.
Vim ha un paio di elenchi basati su 1 per cose come buffer, schede e finestre. Per quanto ne so, sono basati su 1 perché la 0
chiave viene utilizzata per spostarsi all'inizio di una riga e, di conseguenza, passare zero come argomento numerico è impossibile.
Abbiamo a cuore tre elenchi per emulare questa funzionalità:
- L'elenco globale delle pagine della scheda
- L'elenco per- [tab page] di finestre
- L'elenco globale di buffer
Salviamo tutti questi valori, quindi creiamo una nuova scheda tramite "tabnew". Le nuove schede vengono sempre create a destra, quindi nessuno degli indici sotto la scheda da cui tabnew
verremmo invalidati. (Un modo più efficace per farlo sarebbe probabilmente meglio però).
Il tabnew
comando sposta inoltre lo stato attivo sulla nuova scheda e sulla singola finestra al suo interno. Da lì possiamo usare il buffer
comando per creare una vista sul buffer che originariamente aveva il focus.
Quindi utilizziamo l'indice salvato della scheda originale per ripristinare lo stato attivo su quella scheda. E poi, in gran parte fuori dalla paranoia, mettiamo il focus all'interno di quella scheda sulla finestra originale. Vim sembra ricordare quale finestra è attiva nelle schede non visibili, ma non mi piace fare affidamento su di esso.
(Alcuni punti stilistici: la conversione numerica esplicita 0+
, le variabili globali e le asserzioni sono tutte intenzionali)
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