Como posso alterar a janela para a qual ctrl + w, ctrl + p vai?
O que estou procurando é uma maneira programática de alterar para qual janela Ctrl+ w, Ctrl+ pirá saltar.
A razão pela qual eu quero fazer isso é que tenho um autocmd
como o seguinte
autocmd BufEnter SpecialWindow call MyFunction()
Onde
function! MyFunction()
let current_win_id = win_getid()
windo ...
call win_gotoid(current_win_id)
endfunction
portanto, assim que eu pulo para a SpecialWindow
partir de AnotherWindow
, o significado de Ctrl+ w, Ctrl+ pé tal que não pula para AnotherWindow
( comportamento desejado ), mas vai para a janela inferior direita, a última visitada por windo
.
Se você estiver interessado em saber por que estou fazendo esta pergunta, consulte isto .
Respostas
Uma opção é salvar a janela anterior antes do windo
comando. Então, mais tarde, pule para essa janela antes de pular para a janela de destino.
função! MyFunction () let previous_win_id = win_getid (winnr ('#')) deixe current_win_id = win_getid () windo ... chamar win_gotoid (previous_win_id) chamar win_gotoid (current_win_id) função final
Uma solução melhor, porém, é usar a win_execute()função em vez do windo
comando. A win_execute()
função evita os efeitos colaterais de entrar em uma janela enquanto executa um comando nessa janela, que inclui a atualização da janela anterior (e da janela atual também).
Você precisa usar um for
loop explícito para executar o comando em cada janela. Você pode usar gettabinfo()para encontrar os ids das janelas das janelas na guia atual.
função! MyFunction () para winid em gettabinfo (tabpagenr ()) [0] ['windows'] chamar win_execute (winid, '...') endfor função final
Se quiser iterar em todas as janelas de todas as guias, você pode usar gettabinfo()
sem argumentos (para obter informações para todas as guias) e dois for
loops aninhados (um para a lista de guias e outro para as janelas dessa guia. você pode usar getwininfo()
diretamente, o que retorna informações para todas as janelas em todas as guias em uma lista nivelada, então você precisa de um único for
loop.
Se você está simplesmente tentando definir uma variável ou opção em outras janelas (por exemplo, desabilitar 'relativenumber'
), então você pode usar setwinvar()para janelas na guia atual, ou settabwinvar()mais geralmente.
Por exemplo, para desativar 'relativenumber'
em todas as janelas de todas as guias:
função! MyFunction () para tabinfo em gettabinfo () let tabnr = tabinfo ['tabnr'] para winid em tabinfo ['windows'] chamarsetabwinvar (tabnr, winid, '& relativenumber', 0) endfor endfor função final