Çoğunlukla bu sorun nedeniyle sekmeler kaçınmak, ama şimdi istediğim sekme çoğaltma davranışı olan bir işlevi var. Test ettim, ancak ciddi bir şekilde kullanmaya başlamadım. Bu iş akışının bazı gizli dezavantajları olabilir.
İşlevle ilgili bir sorun, durumun bir kısmını önceki arabellek penceresi çiftinden kopyalamamasıdır (açık olup olmadığı gibi set number
). Biraz spekülasyon yapmak, c-w T
çoğaltma yapılmadığından ve pencere muhtemelen sadece onarıldığından muhtemelen bu sorun yoktur.
Vim, arabellek, sekme ve pencere gibi şeyler için birkaç 1 tabanlı listeye sahiptir. Anlayabildiğim kadarıyla, bunlar 1 tabanlıdır çünkü 0
anahtar bir satırın başına gitmek için kullanılır ve sonuç olarak sayısal bir argüman olarak sıfırdan geçmek imkansızdır.
Bu işlevselliği taklit etmek için üç listeyi önemsiyoruz:
- Sekme sayfalarının genel listesi
- Windows başına [sekme sayfası] listesi
- Global tampon listesi
Tüm bu değerleri kaydediyoruz ve "tabnew" yoluyla yeni bir sekme oluşturuyoruz. Her zaman sağda yeni sekmeler oluşturulur, bu nedenle sekmenin altındaki dizinlerin hiçbiri tabnew
geçersiz kılınmaz. (Bunu yapmanın daha sağlam bir yolu muhtemelen daha iyi olurdu).
tabnew
Komut ayrıca yeni sekmede ve içindeki tek pencereye odağı taşır. Oradan buffer
, başlangıçta odağı olan arabelleğe bir görünüm oluşturmak için komutu kullanabiliriz .
Ardından, odağı o sekmeye geri döndürmek için orijinal sekmenin kaydedilmiş dizinini kullanırız. Ve sonra, büyük ölçüde paranoya dışında, o sekmedeki odağı orijinal pencereye ayarladık. Vim, görünmeyen sekmelerde hangi pencerenin odaklandığını hatırlıyor gibi görünüyor, ancak buna güvenmekten hoşlanmıyorum.
(Birkaç üslup noktası: açık sayısal dönüşüm 0+
, global değişkenler ve iddiaların hepsi kasıtlıdır)
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