Como posso alterar a janela para a qual ctrl + w, ctrl + p vai?

Aug 15 2020

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 autocmdcomo 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 SpecialWindowpartir 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

1 filbranden Aug 15 2020 at 22:50

Uma opção é salvar a janela anterior antes do windocomando. 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 windocomando. 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 forloop 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 forloops 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 forloop.

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