Как я могу изменить окно, в которое будут переходить ctrl + w, ctrl + p?
Я ищу программный способ изменения окна 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
.
Если вас интересует, почему я задаю этот вопрос, посмотрите это .
Ответы
Один из вариантов - сохранить то, что было в предыдущем окне перед 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) конец конец конечная функция