Definindo a janela apontada por “outra janela”

10

No emacs, com mais freqüência do que eu gostaria, eu termino com 4 janelas ou mais.

Vou usar esse exemplo:

+--------|-----------+
|        |           |
|   1    |   2       |
|        |           |
+--------+-----------+
|    3   |     4     |
|        +-----------+
|        |     5     |
+--------+-----------+

Muitas funções podem executar ações other-window(geralmente a mesma janela apontada por C-x o). Especialmente úteis são scroll-other-window. No entanto, quando 4 ou mais janelas são abertas, other windowé improvável que seja a que eu quero.

Existe uma maneira fácil de gerenciar o conjunto other-windowsem alterar o layout da janela / buffer? Claro, é possível usar um monte de C-x 4 be, C-bmas não quero alterar o layout. Por exemplo:

  • se estiver editando na janela 4 da figura acima, existe uma maneira fácil de configurar C-M-vpara rolar a janela 1 ?
  • Ou simplesmente, suponha que o foco esteja na janela 3 , como definir other-windowpara apontar para a janela 2 ?
Lompik
fonte

Respostas:

7

Se eu li sua pergunta corretamente, você está interessado principalmente em operar os buffers exibidos em outras janelas rapidamente (preservando o layout atual da janela).

Alterar a janela que other-windowaponta é uma maneira de conseguir isso, mas eu gostaria de sugerir um fluxo de trabalho alternativo:

Ao contrário other-window, ace-windowpermite saltar rapidamente para uma janela específica : Quando você liga ace-window, ele mostra um número único em cada janela. Para pular para uma janela específica, basta digitar o número correspondente. Se você tiver apenas duas janelas, isso indica a outra janela sem solicitar que você digite um número. Este screencast demonstra alternando para outra janela, rolando-a e retornando à janela original:

Demonstração da janela do ás

Se você se vincular ace-windowa C-x o, não precisará memorizar uma ligação de chave adicional e parecerá que você está usando uma versão sobrecarregada de other-window.

Além disso, se você digitar e / ou preferir não afastar os dedos da linha inicial, poderá instruir ace-windowa "numerar" as janelas usando letras em vez de números (veja abaixo).

ace-windowestá disponível no MELPA . Depois de instalá-lo via M-x package-install RET ace-window RET, você pode colocar o seguinte no seu arquivo init para configurá-lo como descrito acima:

(global-set-key (kbd "C-x o") 'ace-window)
(setq aw-keys '(?a ?b ?c ?d ?e ?f ?g ?h ?i))
itsjeyd
fonte
Obrigado por demo, eu vi este pacote em outros sites e queria saber como ele works.I realmente pode alternar a janela facilmente como tenho ligado M-1 M-2 ..para selecionar a janela número 1, 2, utilizando o window-numberpacote
Lompik
1

A partir de uma rápida revisão da fonte other-window, parece que ela realmente depende da janela retornada por next-window, definida em c. Infelizmente, scroll-other-windowtambém é definido em c e presumivelmente chama a janela seguinte a partir daí. Não acho fácil substituir isso.

No entanto, switch-to-buffer-other-windowparece usar pop-to-buffer, então você pode ter alguma sorte lá.

dgtized
fonte
1

Não há uma maneira fácil de manipular a lista de janelas; portanto, o resultado retornado por other-windowé mais ou menos fixo. Isso não é algo ruim por si só, pois permite consistência ao navegar pelas janelas. Em relação aos dois cenários que você descreveu, com algumas elisp ou macros, você pode se adequar ao seu fluxo de trabalho.

se estiver editando na janela 4 da figura acima, existe uma maneira fácil de configurar o CMv para rolar a janela 1?

Você pode usar um snippet simples como o abaixo para usar other-windowo número apropriado de vezes, role para baixo e volte para a janela original.

 (defun my-scroll-down-other-window (&optional arg)
 "Like `scroll-other-window' but takes a prefix argument 
 that indicates which window to scroll."
  (interactive "p")
  (save-selected-window
    (other-window arg)
    (scroll-down)))

Você pode passar um argumento de prefixo para especificar qual janela rolar. Como você pode inferir, ele usa o mecanismo incorporado other-windowpara pular o argnúmero de janelas antes de rolar. O save-selected-windowfoco garante retornará à janela original. A documentação de other-windowpode fornecer mais informações sobre como modificar esse snippet para se adequar ao seu comportamento.

Ou simplesmente, suponha que o foco esteja na janela 3, como definir other-windowpara apontar para a janela 2?

Novamente, use a prefix-argcomo C-3 C-x oquando estiver chamando other-window. O número real a ser fornecido variará dependendo da ordem em que você os dividir e não será alterado desde que você não crie novas janelas. Como alternativa, você pode usar pacotes de conveniência, como window-numberou ace-windowdo MELPA, para alternar rapidamente as janelas selecionadas.

Vamsi
fonte
certo, não há maneira fácil de manipular a lista de janelas. Eu tenho dificuldade em usar prefixos. Parece que adiciona outra chave inacessível e torna a coisa mais
lenta
É para isso que servem as macros / atalhos de teclado. Se essa é uma parte regular do seu fluxo de trabalho, você pode definir facilmente uma ligação de teclas baseada em mapa de prefixos, por exemplo, <f7> npara rolar a enésima janela. Crie ligações temporárias de uma tecla com macros do teclado.
Vamsi