Как я могу изменить окно, в которое будут переходить ctrl + w, ctrl + p?

Aug 15 2020

Я ищу программный способ изменения окна Ctrl+ w, Ctrl+ p, к которому будет переходить.

Причина, по которой я хочу это сделать, заключается autocmdв следующем:

autocmd BufEnter  SpecialWindow call MyFunction()

где

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

поэтому, как только я перехожу к SpecialWindowот AnotherWindow, значение Ctrl+ w, Ctrl+ pтаково, что он не переходит к AnotherWindow( желаемое поведение ), а переходит в нижнее правое окно, последнее посещенное windo.

Если вас интересует, почему я задаю этот вопрос, посмотрите это .

Ответы

1 filbranden Aug 15 2020 at 22:50

Один из вариантов - сохранить то, что было в предыдущем окне перед windoкомандой. Затем, позже, перейдите к этому окну, прежде чем перейти к целевому окну.

функция! MyFunction ()
   let previous_win_id = win_getid (winnr ('#'))
  пусть current_win_id = win_getid ()
  виндо ...
  вызов win_gotoid (previous_win_id)
  вызов win_gotoid (current_win_id)
конечная функция

Однако лучшее решение - использовать win_execute()функцию вместо windoкоманды. Эта win_execute()функция предотвращает побочные эффекты входа в окно при выполнении команды в этом окне, включая обновление предыдущего окна (и текущего окна тоже).

Вам нужно использовать явный forцикл для запуска команды в каждом окне. Вы можете использовать gettabinfo()для поиска идентификаторов окон на текущей вкладке.

функция! Моя функция ()
  для winid в gettabinfo (tabpagenr ()) [0] ['windows']
    вызов win_execute (winid, '...')
  конец
конечная функция

Если вы хотите перебирать каждое окно на каждой вкладке, вы можете использовать либо gettabinfo()без аргументов (чтобы получить информацию для всех вкладок), либо два вложенных forцикла (один для списка вкладок, затем другой для окон на этой вкладке. вы можете использовать getwininfo()напрямую, который возвращает информацию для всех окон на всех вкладках в уплощенном списке, поэтому вам нужен единственный forцикл.

Если вы просто пытаетесь установить переменную или параметр в других окнах (например, отключить 'relativenumber'), вы можете использовать их setwinvar()для окон на текущей вкладке или в settabwinvar()более общем плане.

Например, чтобы отключить 'relativenumber'во всех окнах всех вкладок:

функция! Моя функция ()
  для tabinfo в gettabinfo ()
    пусть tabnr = tabinfo ['tabnr']
    для winid в tabinfo ['windows']
      вызов setabwinvar (tabnr, winid, '& relativenumber', 0)
    конец
  конец
конечная функция