Jak mogę zmienić okno, do którego skoczą ctrl + w, ctrl + p?

Aug 15 2020

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 autocmdnastę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 SpecialWindowfrom 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

1 filbranden Aug 15 2020 at 22:50

Jedną z opcji jest zapisanie tego, co było w poprzednim oknie przed windopoleceniem. 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 windopolecenia. 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 forpę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 forpę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 forpę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