Como alternar entre janelas rapidamente?

90

Como alterno entre janelas rapidamente?

Muitas vezes, tenho várias janelas abertas e preciso alternar entre elas. Agora, eu uso C-x opara chegar ao que eu quero. Existe um fluxo de trabalho mais eficiente disponível para isso?

Sibi
fonte

Respostas:

62

Obviamente, prefiro uma janela de ás para isso. Você pode alternar entre janelas e quadros visíveis. Está no MELPA, você pode instalá-lo rapidamente. A única coisa que resta a fazer é vinculá-lo:

(global-set-key (kbd "C-x o") 'ace-window)

Ou talvez use um acorde mais curto, pois alternar janelas é uma tarefa comum:

(global-set-key (kbd "M-p") 'ace-window)

Sumário de ace-window

É um substituto para o drop-in other-window. Ao contrário do último, você nunca precisa ligar ace-windowduas ou mais vezes para selecionar uma janela: você seleciona a janela que deseja em uma chamada (possivelmente em vários quadros).

Além de alternar entre janelas, ace-windowpode fazer mais (excluir ou trocar janelas etc.), consulte o arquivo LEIA-ME .

abo-abo
fonte
2
Isto é interessante. Eu usei ace-windowe depois vi o switch-windowque parece fazer aproximadamente a mesma coisa, exceto que as letras são mais pronunciadas. parece engraçado, temos os dois pacotes.
milkypostman
Você está certo. Existem apenas pequenas diferenças entre eles. Esse é um problema que devemos enfrentar quando tivermos um repositório com 2000 pacotes. Eu não estava ciente switch-windowaté me submeter ace-windowao MELPA.
abo-abo
1
obrigado por ace-window, ele tem mais personalização do que outros pacotes, eu acho. Ainda assim, uma ajuda no futuro é uma ligação de chave para uma função que seria de maneira semelhante à ação de troca inteligente, mas consumiria essa janela, resultando em uma janela maior no ponto e uma janela escolhida em tamanho menor (a consumida janela). A proporção deve ser determinada nesse caso como metade, um quarto ou um terço.
doctorado
4
Por favor, considere adicionar uma descrição. Você acabou de dizer que gosta e cria um link para ele. Isso torna isso essencialmente uma resposta apenas para link.
Desenhou
4
Qual é o benefício da janela do ás? Por que devo usá-lo nas 14 outras soluções propostas nesta página?
Gilles
103

Uma maneira é usar windmove. Com seus atalhos de teclado padrão, ele permite alternar para a janela ao lado da ativa no momento.

Ele é construído no Emacs, portanto não há necessidade de instalar nada; basta ativá-lo com a seguinte configuração mínima no seu arquivo init:

(windmove-default-keybindings)

Você pode então mudar para o Windows vizinhos utilizando as seguintes teclas (onde a seta utilizado intuitivamente define a direção em que você se move): S-<left>, S-<right>, S-<up>, S-<down>.


Se você preferir usar outro modificador, em vez de shift, poderá fornecê-lo como argumento windmove-default-keybindings. Por exemplo:

(windmove-default-keybindings 'meta)

ou

(windmove-default-keybindings 'control)

Mais informações no Emacs Wiki .

ffevotte
fonte
16
Esta deve ser a resposta aceita!
rowman
OMG, por que nenhum tutorial menciona shift + setas para mover pela janela! É muito melhor do que ctrl + o
Didier A.
Eu diria que algumas das outras respostas aqui contêm configuração redundante de windmove. Talvez valha a pena atualizar a resposta para mencionar que a função aceita a tecla modificadora como argumento, por exemplo, (windmove-default-keybindings 'meta)conforme sugerido no EmacsWiki.
metaturso 9/08/19
Isso cria muitos conflitos com outras combinações de teclas (ou com gerenciadores de janelas). Eu prefiro ás-window.
azzamsa
Estou usando algo parecido (estou andando com ele Shift-arrow) , mas quando você tem um monitor grande com muitas divisões, esse movimento rapidamente se torna pesado. Seria mais interessante de alguma forma enumerar janelas / divisões. Como ace-window, mas com menos pressionamentos de tecla e um algoritmo óbvio para descobrir imediatamente o número desejado.
Hi-Angel
21

Você pode vincular other-windowa uma sequência de teclas mais fácil de digitar.

Por exemplo, eu tenho C-.vinculado a other-window, e C-,obrigado a ir para a janela anterior.

(global-set-key (kbd "C-.") #'other-window)
(global-set-key (kbd "C-,") #'prev-window)

(defun prev-window ()
  (interactive)
  (other-window -1))

Isso é especialmente útil para mover várias janelas; depois de pressionar Control, você só precisa pressionar um único botão para ir para a próxima janela. Isso é muito mais fácil do que três pressionamentos de tecla por movimento.

zck
fonte
2
+1 C-x opara other-windowé um dos poucos candidatos sólidos ao título de "pior atalho padrão do emacs". Minha solução (semelhante ao zck) foi voltar other windowa uma sequência de teclas (muito) mais fácil - eu a vinculei C-;(e a minha Caps-Locké trocada Ctrlpor tudo o que é preciso é um toque rápido nos dedos mínimos). Aliás, sou totalmente dependente de certos recursos do helme icicles(ou seja, não sou "anti-packages" nem nada); Eu apenas acho que uma solução simples funciona melhor aqui.
iceman
2
+1 Essa deve ser a resposta aceita E a resposta mais simples também (infelizmente, ainda não existe tal coisa no StEx). Funciona imediatamente, dimensiona perfeitamente, simples de memorizar. Este último achei especialmente importante na selva do Emacs. Depois de sobreviver lá 20+ anos, às vezes eu me encontro yearningly escondido no deserto vi ...
Andreas Spindler
Simples, fácil de usar, fácil de implementar. Isso precisa de mais votos.
precisa
1
É também o que eu faço. Eu uso M-opara other-window. Alguns modos já tem M-oligação, nomeadamente diff-mode, ggtag-modee ibuffer-mode. Você precisa desatá-lo manualmente em cada mapa de modo. unbind-keyfornecido por bind-key.elé muito útil.
Yasushi Shoji
Eu também uso M-o, e estou M-Oligado a ace-windowquando preciso de energia adicional.
glucas
13

window-numbering.el!

Atribuo a tecla de atalho ", 1", ", 2", ", 3" para alternar entre janelas específicas (observe que eu uso o modo maligno)

além disso, mostro o número da janela na linha de modo na cor PINK, sublinhada.

É uma dica visual que você nunca pode ignorar,

Essa é a maneira mais rápida de mudar de janela.

verifique https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.el e https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .el para minha configuração.

Sylvain Benner adotou minha idéia no espaço, mas as combinações de teclas são diferentes . Portanto, se você usa o spacemacs, obtém a solução mais rápida imediatamente.

Chen Bin
fonte
2
Sim. Esse conceito é ótimo. Eu uso o pacote window-numbercom M-<num>para alternar rapidamente as janelas preto e branco. Conceito semelhante a este
unperson325680 13/11
1
Observe que window-numbering.el está obsoleto em favor do winum , que está aqui . FWIW o número de janelas para mim nem funcionou.
Hi-Angel
Eu posso mudar para winum em breve. Mas a numeração de janelas ainda funciona bem no emacs24 / 25/26.
Página
10

Sem usar nenhum complemento adicional, você pode continuar usando C-x oum prefixo opcional para pular essas janelas. Por exemplo: C-u 1 C-x ovai para a próxima janela na ordem (ou seja, o que você obteria com a planície C-x o), C-u 2 C-x oabre duas janelas, C-u 3 C-x oabre três janelas e assim por diante.

Um trecho da other-windowdoutrina (a função chamada por C-x o:

COUNT especifica o número de janelas a serem puladas, começando pela janela selecionada, antes de fazer a seleção. Se COUNT for positivo, pule COUNT janelas para a frente. Se COUNT for negativo, pule -COUNT janelas para trás. COUNT zero significa não pular nenhuma janela; portanto, selecione a janela selecionada. Em uma chamada interativa, COUNT é o argumento do prefixo numérico. Retorno nulo.

Dan
fonte
Quando você tem várias janelas, que ordem elas seguem?
Stsquad
A ordem é a ordem da janela cíclica .
Dan
2
hmm "A ordenação é determinada por uma primeira travessia profunda da árvore da janela do quadro, recuperando as janelas ativas que são os nós das folhas da árvore" não é a descrição mais útil para o cérebro humano tentar adivinhar qual janela é a próxima ou quantos a pular. Eu acho que é por isso que eu uso o ás-window.
Stsquad
2
@stsquad: oh, eu concordo com você - isso também faz minha cabeça girar. Eu coloquei esta resposta aqui em cima por uma questão de integridade.
Dan
8

Algumas pessoas podem se lembrar do editor Brief (engraçado o suficiente por uma empresa chamada Underware).

Tinha uma maneira elegante de alternar entre janelas visíveis. A seta M moveria o cursor para a janela diretamente em linha com a direção da tecla de seta.

Então, eu mapeados os winmove-left, winmove-right, winmove-upe winmove-downfunções para M-left, M-right, M-upe M-downteclas na seguinte sequência no meu arquivo .emacs -

(global-set-key [M-left] 'windmove-left)          ; move to left window
(global-set-key [M-right] 'windmove-right)        ; move to right window
(global-set-key [M-up] 'windmove-up)              ; move to upper window
(global-set-key [M-down] 'windmove-down)          ; move to lower window

Agora posso mover-me com facilidade entre janelas, independentemente de quão confusa eu tenha a configuração ... E pode ficar bastante confusa com o tamanho dos monitores hoje em dia ...

user2542
fonte
Isso não é mais ou menos a resposta de @ Francesco?
Dan
Concordo. Eu não percebi antes de publicar o meu.
user2542
2
Uma maneira muito mais curta de obter essas combinações de teclas é (windmove-default-keybindings 'meta)!
Omar
8

Se você usar Icicles , C-x opoderá selecionar janelas pelo nome (ou andar de bicicleta).

  • Sem prefixo arg, C-x oé o mesmo de sempre, a other-windowmenos que o quadro tenha apenas uma janela; nesse caso, é other-frame.

  • Com um prefixo arg, C-x oé um comando múltiplo que permite navegar entre janelas ou quadros por nome (ou de bicicleta). Navegar entre janelas usa multi-comando icicle-select-window; navegando entre os usos de quadros icicle-select-frame.

Qual navegação é usada depende do prefixo arg:

  • Zero prefixo arg (por exemplo C-0): se o quadro selecionado tiver várias janelas, isto é icicle-select-window, com janelas no mesmo quadro que os candidatos. Caso contrário (quadro de janela única), é isso icicle-select-frame.

  • C-u: Se o quadro selecionado tiver várias janelas, é o caso icicle-select-window, com as janelas de todos os quadros visíveis como candidatas. Caso contrário, é isso icicle-select-frame.

  • C-u C-u: icicle-select-window, com janelas de todos os quadros como candidatos (incluindo quadros iconificados ou ocultos).

Como sempre em Sincelos , você pode combinar (a) a conclusão , digitando o texto para restringir o conjunto de candidatos correspondentes (nomes de janelas ou quadros, neste caso), com (b) ciclismo (entre candidatos correspondentes).

Desenhou
fonte
4

Considere usar um acorde para pular rapidamente entre janelas. Acho muito mais rápido do que pegar uma tecla modificadora (e menos cansativa também).

Minha escolha de pacote a ser usada é o ace-windowque permite navegar em várias janelas mais facilmente do que apenas other-window.

(require 'key-chord)
(key-chord-define-global "xo" 'ace-window)
(key-chord-mode +1)

Obviamente, para usar isso, você precisa key-chorde ace-windowambos estão disponíveis no melpa.

Zavior
fonte
2
Essa não é mais ou menos a resposta de @ abo-abo?
Dan
1
@ Dan não usa acordes de teclas, observe a falta de meta ou super chaves no acorde. Se você usa o ás-window / algo mais é um pouco irrelevante, o objetivo era dar uma resposta que não use teclas modificadoras para uma operação tão comumente usada.
Zavior 13/11/2014
1
Vi isso, mas levantei a questão porque ace-windowestá fazendo o trabalho como na resposta de @ abo-abo. Parece-me que, nesse contexto, a combinação de teclas específica a ser usada faria mais sentido como um comentário do que como uma resposta. Apenas meus dois centavos.
Dan
@ Dan, no geral, a questão era trocar rapidamente as janelas, e não acho que essa solução tenha sido levantada ainda. Esclareceu um pouco a resposta em relação a isso.
Zavior # 13/14
@Zavior levanta um ponto importante. A questão é mudar rapidamente as janelas - para as quais a forma da ligação é muito importante. Independentemente da biblioteca que você preferir, key-chordé possível vincular combinações de teclas muito acessíveis. O exemplo de ligação de xoé mais rápido que C-x o(profundidade de um versus dois). Essa resposta pode ser reformulada para enfatizar que a resposta é ortogonal às outras respostas sobre a seleção de funções (e ace-windowé apenas uma das muitas opções que podem ser vinculadas da maneira descrita). Mantenha esta resposta como distinta!
Ebpa
3

Algumas boas respostas aqui, também sou fã do WinMove, mas vinculo-o ao C- porque o modo org usa M- para manipular títulos

(define-key global-map (kbd "C-<up>") 'windmove-up)
(define-key global-map (kbd "C-<down>") 'windmove-down)
(define-key global-map (kbd "C-<left>") 'windmove-left)
(define-key global-map (kbd "C-<right>") 'windmove-right)

Onde fica realmente bom é se você combiná-lo com o Hydra . Seguindo os exemplos em seu wiki , criei meu próprio monstro:

(defhydra hydra-windows ()
  "C-arrow = switch, S-arrow = size, M-arrow = move"
  ("C-<left>" windmove-left nil)
  ("C-<right>" windmove-right nil)
  ("C-<up>" windmove-up nil)
  ("C-<down>" windmove-down nil)
  ("S-<left>" hydra-move-splitter-left nil)
  ("S-<right>" hydra-move-splitter-right  nil)
  ("S-<up>" hydra-move-splitter-up nil)
  ("S-<down>" hydra-move-splitter-down nil)
  ("M-<left>" buf-move-left nil)
  ("M-<right>" buf-move-right nil)
  ("M-<up>" buf-move-up nil)
  ("M-<down>" buf-move-down nil)
  ("p" previous-buffer "prev-buf")
  ("n" next-buffer "next-buf")
  ("1" delete-other-windows "1")
  ("d" delete-window "del")
  ("k" kill-buffer "kill")
  ("s" save-buffer "save")
  ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
  ("r" winner-redo "redo")
  ("b" helm-mini "helm-mini" :exit t)
  ("f" helm-find-files "helm-find" :exit t)
  ("|" (lambda () (interactive) (split-window-right) (windmove-right)))
  ("_" (lambda () (interactive) (split-window-below) (windmove-down)))
  ("q" nil "cancel")
  )

(global-set-key (kbd "M-#") 'hydra-windows/body)

Isso permite alterar janelas, redimensioná-las, mover buffers de janela para janela, alternar buffers, kill buffers e até desfazer configurações de janelas via modo vencedor, além de integrar o leme. Para sair da hidra, basta pressionar a seta ou outra tecla que não esteja na hidra. Você pode encontrar as funções "hydra-move" nos exemplos da hidra. O melhor da hidra é que não preciso me lembrar de todas essas teclas e seus "modestos"; assim, quando estiver na hidra, tudo estará disponível como uma única tecla. pressione.

Philip Daniels
fonte
1
Uma maneira mais curta de obter as combinações de teclas mencionadas no começo é (windmove-default-keybindings 'control).
Omar
1

Se você usar evil-mode, basta usar um prefixo numérico com C-w C-w( evil-window-next) para escolher a janela que deseja. Então: 1 C-w C-wseleciona a primeira janela em ordem cíclica, 3 C-w C-wescolhe a terceira janela em ordem cíclica e assim por diante.

Dan
fonte
Parece que isso deve ser combinado apenas com sua outra resposta : é a mesma coisa, apenas com ligações específicas do mal.
npostavs
1

O Ace Jump permite que você navegue com o ponteiro em todas as palavras da tela, independentemente da janela ou moldura em que estão, portanto, não é tão diferente de usar a Ace Window ou a Switch Window.

Uma vantagem é que, ao pular janelas, você também pode posicionar o ponteiro com alguma precisão.

Ainda acho um pouco complicado ou perturbador, e acho que estou usando windmovemais, porque é muito simples, mas ainda uso o Ace Jump quando leio em outra janela ou moldura e quero ir para um local lá.

Mallory-Erik
fonte
1

Como sempre, existem centenas de maneiras diferentes de conseguir isso. Minha maneira preferida é usar o NumberedWindows . Em seguida, defino o seguinte atalho de teclado usando Super e as teclas 1-9.

(global-set-key (kbd "s-1") (lambda() (interactive) (window-number-select 1)))

Entro em um pouco mais de detalhes sobre esse assunto exato com um post recente que você pode ler em Afternoon Coder .

Travis
fonte
Como isso difere da resposta de chen bin ?
Gilles
Tem um exemplo de configuração.
Travis
-1

Você também pode optar por usar a janela do comutador como um substituto visual paraC-x o

csantosb
fonte
1
Qual é o benefício do switch-window? Por que devo usá-lo nas 14 outras soluções propostas nesta página?
Gilles
Como diz que você deveria? O Emacs trata de alternativas, personalização e liberdade de decisão.
Csantosb
2
Isso não é aqui nem ali. Por que alguém escolheria essa alternativa em particular? Por que alguém decide usar switch-windowsobre todos os outros?
Gilles