Jak mogę zmienić okno, do którego skoczą ctrl + w, ctrl + p?
To, czego szukam, to programistyczny sposób zmiany okna Ctrl+ w, Ctrl+ pdo którego przeskoczy.
Powodem, dla którego chcę to zrobić, jest to, że mam autocmd
następujący
autocmd BufEnter SpecialWindow call MyFunction()
gdzie
function! MyFunction()
let current_win_id = win_getid()
windo ...
call win_gotoid(current_win_id)
endfunction
dlatego jak tylko przeskoczę do SpecialWindow
from AnotherWindow
, znaczenie Ctrl+ w, Ctrl+ pjest takie, że nie przeskakuje do AnotherWindow
( pożądane zachowanie ), ale przeskakuje do prawego dolnego okna, ostatniego odwiedzonego przez windo
.
Jeśli jesteście ciekawi, dlaczego zadaję to pytanie, zobacz to .
Odpowiedzi
Jedną z opcji jest zapisanie tego, co było w poprzednim oknie przed windo
poleceniem. Później przeskocz do tego okna, zanim przeskoczysz do okna docelowego.
funkcjonować! MyFunction () let previous_win_id = win_getid (winnr ('#')) let current_win_id = win_getid () Windo ... zadzwoń do win_gotoid (previous_win_id) zadzwoń do win_gotoid (current_win_id) funkcja końcowa
Lepszym rozwiązaniem jest jednak użycie win_execute()funkcji zamiast windo
polecenia. win_execute()
Funkcja zapobiega skutków ubocznych wprowadzania okno podczas wykonywania poleceń w tym oknie, że obejmuje aktualizowanie poprzedniego okna (i bieżące okno zbyt).
Musisz użyć jawnej for
pętli, aby uruchomić polecenie w każdym oknie. Możesz użyć, gettabinfo()aby znaleźć identyfikatory okien w bieżącej karcie.
funkcjonować! MyFunction () dla winid w gettabinfo (tabpagenr ()) [0] ['windows'] zadzwoń do win_execute (winid, '...') endfor funkcja końcowa
Jeśli chcesz iterować po każdym oknie na każdej karcie, możesz użyć gettabinfo()
bez argumentów (aby uzyskać informacje o wszystkich kartach) i dwóch zagnieżdżonych for
pętli (jedna dla listy kart, a druga dla okien na tej karcie. możesz użyć getwininfo()
bezpośrednio, co zwraca informacje dla wszystkich okien we wszystkich kartach w spłaszczonej liście, więc potrzebujesz jednej for
pętli.
Jeśli po prostu próbujesz ustawić zmienną lub opcję w innych oknach (np. Wyłączyć 'relativenumber'
), możesz użyć setwinvar()dla okien w bieżącej karcie lub settabwinvar()bardziej ogólnie.
Na przykład, aby wyłączyć 'relativenumber'
we wszystkich oknach wszystkich kart:
funkcjonować! MyFunction () dla tabinfo w gettabinfo () let tabnr = tabinfo ['tabnr'] dla winid w tabinfo ['windows'] zadzwoń do setabwinvar (tabnr, winid, '& relativenumber', 0) endfor endfor funkcja końcowa