Arabelleği taşımak yerine yeni sekmeye çoğaltın


10

Sık sık bir sekme sayfasında geçici olarak arabellek büyütmek ve sonra baktığım eski arabellek yapılandırmasına geri dönmek istiyorum. Bunun gibi bir şey yapmak için şu anki iş akışım ya tüm diğer arabellekleri kullanarak kapatmak ya da <c-w>oşu anda baktığım arabelleği kendi sekmesine taşımaktır <c-w>T. İkinci yaklaşımla ilgili sorun, arabelleği orijinal sekme sayfasından kaldırmasıdır.

Ben üç dosya doldurmak a.txt, b.txtve c.txtile a, bve csırasıyla.

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

Bu dosyaların üçünü de bir sekme sayfasında açtığımda aşağıdakileri alıyorum.

resim açıklamasını buraya girin

Sonra a.txtkendi başına bir sekmeye geçebilirim . Ancak yaptığım zaman a.txt, orijinal sekme sayfasından kaldırılır. (Yani bu bir sonra olurdu <c-w>Tgt)

resim açıklamasını buraya girin

<c-w>TOrijinal arabellek içeriğini korumak, yalnızca o anda odaklanan arabelleği içeren yeni bir sekme sayfası oluşturmak ve daha sonra yeni oluşturduğum yeni sekme sayfasını odaklamak için bastığım zaman seçme yeteneği istiyorum yarattı. Başka bir deyişle, <c-w>Torijinal sekme sayfasının korunması ve şimdi a.txtiki sekme sayfasında olması dışında neredeyse bir komut gibidir .

Bunu yapmanın bir yolu var mı?

Yanıtlar:


13

Emin değilim ama deneyebilirsiniz :tab split(veya daha kısa sürüm :tab sp).

:splitKomut gösteren görünüm çoğaltmak gerekir a.txtiken, :tabdeğiştirici özel bir sekme sayfasına bu görünüm hareket etmelidir.


Davranışını değiştirmek isterseniz C-w T, şu şekilde yeniden eşleştirebilirsiniz:

nnoremap <C-w>T :tab split<CR>

Daha genel olarak, pencereyi bölen bir komut bulduğunuzda ve bunun yerine yeni bir sekme sayfası oluşturmayı tercih ederseniz, önek ekleyebilirsiniz :tab.

Örneğin, yeni bir sekme sayfasında bir yardım arabelleğini okumak için kullanılabilir:

:tab help {your_topic}

Varsayılan olarak, yeni sekme sayfası geçerli sayfadan sonra görünür. Ancak başka bir yerde görünmesini istiyorsanız, :tabbir sayıyla önek ekleyebilirsiniz .

Örneğin, 3. görünümden sonra bir sekme sayfasında geçerli görünüm penceresini çoğaltmak için şunu yazabilirsiniz:

:3tab split

Ve ilk olarak görünmesini sağlamak için:

:0tab split

Daha fazla bilgi için şunları okuyabilirsiniz :h :tab:

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one

2

Ç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ü 0anahtar 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 tabnewgeçersiz kılınmaz. (Bunu yapmanın daha sağlam bir yolu muhtemelen daha iyi olurdu).

tabnewKomut 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.