Como alternar entre duas janelas quando tenho mais de duas abertas?

8

Cenário: tenho várias (mais de 2) janelas abertas. Eu trabalho ativamente com dois deles. Como melhor pular de uma janela para outra e voltar com um comando?

Eu uso a janela do ás; é ótimo, mas eu não quero pressionar o número da janela todas as vezes. Eu sei sobre next-window/ prev-window, mas estes são dois comandos diferentes.

O que estou procurando é algo que se lembre do que eram as janelas anteriores quando eu seleciono outra janela e volto a ela. Invocado repetidamente, ele alternaria entre as duas últimas janelas, Alt- Tab-style.

Onde eu olho?

9000
fonte
Eu uso fnmais uma das teclas de seta para ir em qualquer direção, incluindo dentro e fora do minibuffer (se estiver ativo) - consulte a biblioteca interna windmove.
lawlist
@lawlist: Eu sei sobre windmove. O que estou procurando é uma maneira de não pensar na direção necessária, especialmente se as janelas tiverem outras janelas entre elas.
9000

Respostas:

6

Uma maneira de escrever seu próprio comando é usar a get-mru-windowfunção interna.

Por exemplo:

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window nil nil t)))
    (when win (select-window win))))

Ele procura a janela usada mais recentemente no quadro atual que não é a janela selecionada no momento.

Aqui está uma variação que funciona em quadros visíveis:

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible nil t)))
    (when win
      (select-frame-set-input-focus (window-frame win))
      (select-window win))))

Conforme mencionado nos comentários, aqui está uma variação que funciona quando há apenas uma janela (alternando para o buffer mais recente):

(defun flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible t t)))
    (if win
        (progn
          (select-frame-set-input-focus (window-frame win))
          (select-window win))
      (mode-line-other-buffer))))
glucas
fonte
11
Acertou em cheio! Este é muito melhor do que o que eu montei. Bom encontrar get-mru-window.
Dan
11
Acabei adicionando isso à minha configuração com uma variação adicional: quando houver apenas um quadro / janela (get-mru-window retorna zero), então chame mode-line-other-buffer. Dessa forma, eu tenho uma chave que alterna entre dois buffers em qualquer configuração de janela.
glucas
Ótimo. Eu amo essa última variação @glucas. Obrigado. Aqui está como eu escrevi e funciona. Essa é a melhor maneira de fazer isso? (defun my-switch-to-previous-window () (interativo) (let ((win (obter-mru-window nil nil t)))) (se vencer (selecionar-janela vencer) (modo-linha-outro-buffer ))))
prosoitos
6

Se você já estiver usando ace-window, poderá usar o comando aw-flip-windowpara alternar entre duas janelas. Por padrão, isso está vinculado nna janela do ás aw-dispatch-alist.

Isso significa que você pode invocar a ás-janela e pressionar em nvez do número da janela para voltar à janela anterior. Você também pode vincular aw-flip-windowa outra chave.

Observe que isso voltará apenas para uma janela que foi selecionada anteriormente pela janela do ás. Se você alterna frequentemente o Windows com outros comandos, pode querer uma solução mais geral.

glucas
fonte
4

Aqui está um comando simples, levemente testado, que o levará para a janela visitada mais recentemente:

(defvar recent-window nil
  "The most recently visited window.")

(defun switch-to-recent-window ()
  "Switch to the most recently visited window, as stored in
`recent-window'."
  (interactive)
  (let ((current (car (window-list))))
    (if recent-window
        (select-window recent-window)
      (message (concat "No recent window selected, "
                       "so I'm setting this window "
                       "as the most recent.")))
    (setq recent-window current)))
Dan
fonte
Obrigado! Funciona. Você se importa se eu fizer um pacote com atribuição?
9000
De nada. Claro, fique à vontade para usá-lo em um pacote, mas saiba que o código não é (ainda) muito inteligente. Se você alternar para outras janelas com comandos como next-windowou other-window, a alteração não será identificada na recent-windowvariável. Não há um gancho óbvio para usar, portanto, consertar essa parte pode envolver a definição de conselhos para várias outras funções.
Dan
11
Eu acho que você poderia usar buffer-list-update-hook, que é chamado quando a janela ativa muda (depois select-window). Esse gancho é chamado em outros casos, mas pode ser usado para acompanhar a última janela.
glucas