Wie kann ich das Fenster ändern, zu dem Strg + W, Strg + P springen?

Aug 15 2020

Was ich suche, ist eine programmatische Methode, um zu ändern, zu welchem ​​Fenster Ctrl+ w, Ctrl+ pgesprungen wird.

Der Grund, warum ich dies tun möchte, ist, dass ich autocmdFolgendes habe

autocmd BufEnter  SpecialWindow call MyFunction()

wo

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

Sobald ich zum SpecialWindowvon springe AnotherWindow, ist die Bedeutung von Ctrl+ w, Ctrl+ pso, dass es nicht zu AnotherWindow( gewünschtes Verhalten ) springt, sondern zum Fenster unten rechts, dem zuletzt besuchten windo.

Wenn Sie interessiert sind, warum ich diese Frage stelle, lesen Sie dies bitte .

Antworten

1 filbranden Aug 15 2020 at 22:50

Eine Möglichkeit besteht darin, das vorherige Fenster vor dem windoBefehl zu speichern . Springen Sie später zu diesem Fenster, bevor Sie zu Ihrem Zielfenster springen.

Funktion! MyFunction ()
   let previous_win_id = win_getid (winnr ('#'))
  let current_win_id = win_getid ()
  windo ...
  Rufen Sie win_gotoid (previous_win_id) auf.
  Rufen Sie win_gotoid (current_win_id) auf.
Endfunktion

Eine bessere Lösung besteht jedoch darin, die win_execute()Funktion anstelle des windoBefehls zu verwenden. Die win_execute()Funktion verhindert die Nebenwirkungen beim Betreten eines Fensters während der Ausführung eines Befehls in diesem Fenster, einschließlich der Aktualisierung des vorherigen Fensters (und des aktuellen Fensters).

Sie müssen eine explizite forSchleife verwenden, um den Befehl in jedem Fenster auszuführen. Sie können verwenden gettabinfo(), um die Fenster-IDs der Fenster auf der aktuellen Registerkarte zu finden.

Funktion! MyFunction ()
  für winid in gettabinfo (tabpagenr ()) [0] ['windows']
    Rufen Sie win_execute auf (winid, '...')
  endfor
Endfunktion

Wenn Sie über jedes Fenster in jeder Registerkarte iterieren möchten, können Sie entweder gettabinfo()ohne Argumente (um Informationen für alle Registerkarten abzurufen) und zwei verschachtelte forSchleifen (eine für die Liste der Registerkarten, dann eine andere für die Fenster in dieser Registerkarte) verwenden Sie können getwininfo()direkt verwenden, wodurch Informationen für alle Fenster in allen Registerkarten in einer abgeflachten Liste zurückgegeben werden. Sie benötigen also eine einzelne forSchleife.

Wenn Sie lediglich versuchen, eine Variable oder Option in den anderen Fenstern festzulegen (z. B. Deaktivieren 'relativenumber'), können Sie diese setwinvar()für Fenster auf der aktuellen Registerkarte oder settabwinvar()allgemeiner verwenden.

So deaktivieren Sie beispielsweise 'relativenumber'in allen Fenstern aller Registerkarten:

Funktion! MyFunction ()
  für tabinfo in gettabinfo ()
    let tabnr = tabinfo ['tabnr']
    für winid in tabinfo ['windows']
      Rufen Sie settabwinvar auf (tabnr, winid, '& relativumber', 0)
    endfor
  endfor
Endfunktion