Ctrl + w, ctrl + p'nin atlayacağı pencereyi nasıl değiştirebilirim?

Aug 15 2020

Ne aradığım pencere değişen programlı bir yoldur Ctrl+ w, Ctrl+ patlar.

Bunu yapmak istememin sebebi şuna autocmdbenzer bir şeye sahip olmam

autocmd BufEnter  SpecialWindow call MyFunction()

nerede

function! MyFunction()
    let current_win_id = win_getid()
    windo ...
    call win_gotoid(current_win_id)
endfunction

Dolayısıyla, en kısa sürede atlamak olarak SpecialWindowgelen AnotherWindowanlam, Ctrl+ w, Ctrl+ po şekildedir değil atlamak AnotherWindow( istenen davranış ), ancak sağ alt pencerede, tarafından ziyaret sonuncusuna atlar windo.

Ben bu soruyu soruyorum ilgilenen varsa, lütfen bkz bu .

Yanıtlar

1 filbranden Aug 15 2020 at 22:50

Bir seçenek, windokomuttan önceki pencereyi kaydetmenizdir . Daha sonra, hedef pencerenize atlamadan önce o pencereye atlayın.

işlev! MyFunction ()
   let previous_win_id = win_getid (winnr ('#'))
  let current_win_id = win_getid ()
  windo ...
  win_gotoid (previous_win_id) çağrısı
  win_gotoid (current_win_id) çağrısı
son işlev

Yine de daha iyi bir çözüm, komut win_execute()yerine işlevi kullanmaktır windo. win_execute()İşlev önceki pencere güncelleme içerir, bu pencerede bir komut yürütülürken bir pencere giren yan etkileri engeller (ve geçerli pencereyi.)

forKomutu her pencerede çalıştırmak için açık bir döngü kullanmanız gerekir . gettabinfo()Geçerli sekmede pencerelerin pencere kimliklerini bulmak için kullanabilirsiniz .

işlev! MyFunction ()
  gettabinfo'da winid için (tabpagenr ()) [0] ['windows']
    win_execute'u çağırın (winid, '...')
  sonu
son işlev

Her sekmedeki her pencerede yineleme yapmak istiyorsanız, gettabinfo()bağımsız değişken olmadan (tüm sekmeler için bilgi almak için) ve iki iç içe fordöngü (biri sekmeler listesi için, sonra bir diğeri o sekmedeki pencereler için) kullanabilirsiniz. getwininfo()doğrudan kullanabilirsiniz ; bu, düzleştirilmiş bir listedeki tüm sekmelerdeki tüm pencereler için bilgi döndürür, böylece tek bir fordöngüye ihtiyacınız olur .

Diğer pencerelerde yalnızca bir değişken veya seçenek ayarlamaya çalışıyorsanız (örneğin devre dışı bırakma 'relativenumber'), o zaman setwinvar()geçerli sekmedeki pencereler için veya settabwinvar()daha genel olarak kullanabilirsiniz.

Örneğin, 'relativenumber'tüm sekmelerin tüm pencerelerinde devre dışı bırakmak için :

işlev! MyFunction ()
  gettabinfo'da tabinfo için ()
    let tabnr = tabinfo ['tabnr']
    tabinfo'da winid için ['windows']
      Setabwinvar'ı çağırın (tabnr, winid, '& relativenumber', 0)
    sonu
  sonu
son işlev