Wie kann ich das Fenster ändern, zu dem Strg + W, Strg + P springen?
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 autocmd
Folgendes 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 SpecialWindow
von 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
Eine Möglichkeit besteht darin, das vorherige Fenster vor dem windo
Befehl 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 windo
Befehls 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 for
Schleife 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 for
Schleifen (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 for
Schleife.
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