Saya sebagian besar telah menghindari tab karena masalah ini, tetapi sekarang saya memiliki fungsi yang memiliki perilaku duplikasi tab yang saya inginkan. Saya sudah mengujinya, tetapi belum mulai menggunakannya dengan sungguh-sungguh. Mungkin ada beberapa kekurangan tersembunyi untuk alur kerja ini.
Salah satu masalah dengan fungsi ini adalah bahwa itu tidak menduplikasi beberapa negara dari pasangan buffer-window sebelumnya (seperti apakah set number
aktif atau tidak). Berspekulasi sedikit, c-w T
mungkin tidak memiliki masalah ini karena tidak ada duplikasi yang dilakukan dan jendela mungkin hanya direparasi.
Vim memiliki beberapa daftar berbasis 1 untuk hal-hal seperti buffer, tab, dan windows. Sejauh yang saya tahu, mereka berbasis 1 karena 0
kuncinya digunakan untuk pindah ke awal garis dan sebagai hasilnya melewati nol sebagai argumen numerik tidak mungkin.
Kami peduli dengan tiga daftar untuk meniru fungsi ini:
- Daftar halaman tab global
- Daftar per [tab halaman] windows
- Daftar buffer global
Kami menyimpan semua nilai ini, lalu membuat tab baru melalui "tabnew". Tab baru selalu dibuat di sebelah kanan, sehingga tidak ada indeks di bawah tab yang kami tabnew
gunakan tidak valid. (Cara yang lebih kuat untuk melakukan ini mungkin akan lebih baik).
The tabnew
perintah juga bergerak fokus ke tab baru dan satu jendela di dalamnya. Dari sana kita dapat menggunakan buffer
perintah untuk membuat tampilan ke buffer yang awalnya memiliki fokus.
Kemudian kami menggunakan indeks tersimpan dari tab asli untuk mengembalikan fokus kembali ke tab itu. Dan kemudian, sebagian besar karena paranoia, kami menetapkan fokus di dalam tab itu ke jendela asli. Vim tampaknya mengingat jendela mana yang memiliki fokus pada tab yang tidak terlihat, tapi saya tidak suka mengandalkan itu.
(Beberapa poin gaya: konversi numerik eksplisit 0+
, variabel global, dan pernyataan semuanya disengaja)
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