Emacs, mude para a janela anterior


93

No Emacs, C-x ome leva para a próxima janela.

Qual macro de teclado me leva para a janela anterior no Emacs?

Respostas:


88

Isso seria C-- C-x o

Em outras palavras, C-x ocom um argumento de -1. Você pode especificar quantas janelas mover inserindo um argumento numérico entre C-ue o comando, como em C-u 2 C-x o. ( C--é um atalho para C-u - 1)


E você pode usar C-x zpara repetir o último comando para alternar rapidamente as janelas.
Ivan Huang

105

Você também pode tentar usar o windmove, que permite navegar até a janela de sua escolha com base na geometria. Eu tenho o seguinte em meu arquivo .emacs para alterar janelas usando a tecla de seta Cx.

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

11
Observe que chamar (windmove-default-keybindings)vincula essas funções a SHIFT + cima / baixo / esquerda / direita, o que eu acho mais conveniente do que seus C-xvínculos (que entram em conflito com os vínculos padrão também úteis para previous-buffere next-buffer. Lkahtz: a (kbd)função permite especificar chaves em notação de string na sintaxe mais legível que também é usada pelo Emacs quando você usa C-h kou C-h cpara descrever uma ligação.
phils

4
Eu não aprovo o uso de teclas de seta. Mas eu votei a favor da ajuda de qualquer maneira. : presunçoso:
Bjorn

2
@phils SHIFT + <keys> interfere na seleção de deslocamento que é habilitada por padrão no Emacs 23 (modo de seleção de deslocamento).
legends2k

2
legends2k: True; embora você também possa passar um argumento para windmove-default-keybindingspara especificar um modificador diferente para usar em conjunto com as teclas de seta; de modo que essa função ainda pode ser útil para pessoas que usam o modo de seleção de deslocamento.
phils

1
@phils Concordo, meta parece ser uma boa alternativa; como visto no Wiki do Emacs .
legends2k

30

Pessoalmente, prefiro usar window-number.el

Para selecionar uma janela diferente, use Ctrl- x, Ctrl- j n

Onde n é o número da janela, a modeline de cada janela mostra seu número, conforme mostrado na imagem.

Basta baixar window-number.el , colocá-lo em seu caminho de carregamento emacs e usar o seguinte em seu.emacs

 (autoload 'window-number-mode "window-number"
   "A global minor mode that enables selection of windows according to
 numbers with the C-x C-j prefix.  Another mode,
 `window-number-meta-mode' enables the use of the M- prefix."
   t)

Há outro modo semelhante chamado switch-window.elque fornece números grandes nas janelas ... (pressionar o número muda a janela e reverte a exibição.)


(fonte: tapoueh.org )


2
Bom, mas sugiro não vincular algo a C-x C-j, já que essa é a vinculação padrão para dired-jumpse você (require 'dired-x). (Veja M-x customize-group RET dired-keys RETse você deseja substituir isso.)
phils

1
Depois de postar isso resolvi dar switch-window.eluma chance, ele usa no C-x olugar, e quando há apenas duas janelas ativas, ele só seleciona a outra janela. Acho que é mais sensato religar C-x opara fazer o window-numbertruque, você tem toda a razão dired-jump. Pessoalmente, eu mesmo faço menos troca de janelas e uso C-x b, mas ter o aprimorado C-x oé bastante agradável.
ocodo

wow incrível tema Emacs na primeira imagem. Como posso conseguir?
semente

@semente na minha página relacionada ao Emacs jasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
ocodo

1
@petrux emacsfodder.github.io/blog/two-new-emacs24-themes Acho que este é provavelmente um dos dois temas. - btw. Para uma linha de modo legal, tente gist.github.com/jasonm23/8554119
ocodo

13

Se você trabalha muito com várias janelas emacs (> 3) e deseja salvar algumas teclas, adicione isso ao seu arquivo init e ficará melhor:

(defun frame-bck()
  (interactive)
  (other-window-or-frame -1)
)
(define-key (current-global-map) (kbd "M-o") 'other-window-or-frame)
(define-key (current-global-map) (kbd "M-O") 'frame-bck)

Agora, basta circular rapidamente pelas janelas com Mo


1
Esta é exatamente a solução de que eu precisava. Tudo o que eu queria era que o comando de mudança de janela fosse um único pressionamento de tecla repetido. Obrigado! Eu tive que mudar other-window-or-frame para other-window para fazer funcionar, FYI. Estou no Emacs 24.2.1.
Geoff

Acho essas ligações muito boas (especialmente quando você tem 2 ou mais janelas), obrigado. Como disse também chapéu para mudar other-windowpara fazê-lo funcionar.
dolzenko

11

Existem algumas respostas muito boas e completas aqui, mas para responder à pergunta de uma forma minimalista:

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

 (define-key global-map (kbd "C-x p") 'prev-window)

2
Não sei desde quando, mas agora o emacs está previous-windowintegrado.
Arne

@Arne Não é uma função M-xque pode ser chamada, portanto, deve servir a um propósito diferente.
Ivan Huang

4

Baseia-se na ideia de @Nate, mas ligeiramente modificado para suportar o ciclo reverso entre janelas

;; Windows Cycling
(defun windmove-up-cycle()
  (interactive)
  (condition-case nil (windmove-up)
    (error (condition-case nil (windmove-down)
         (error (condition-case nil (windmove-right) (error (condition-case nil (windmove-left) (error (windmove-up))))))))))

(defun windmove-down-cycle()
  (interactive)
  (condition-case nil (windmove-down)
    (error (condition-case nil (windmove-up)
         (error (condition-case nil (windmove-left) (error (condition-case nil (windmove-right) (error (windmove-down))))))))))

(defun windmove-right-cycle()
  (interactive)
  (condition-case nil (windmove-right)
    (error (condition-case nil (windmove-left)
         (error (condition-case nil (windmove-up) (error (condition-case nil (windmove-down) (error (windmove-right))))))))))

(defun windmove-left-cycle()
  (interactive)
  (condition-case nil (windmove-left)
    (error (condition-case nil (windmove-right)
         (error (condition-case nil (windmove-down) (error (condition-case nil (windmove-up) (error (windmove-left))))))))))

(global-set-key (kbd "C-x <up>") 'windmove-up-cycle)
(global-set-key (kbd "C-x <down>") 'windmove-down-cycle)
(global-set-key (kbd "C-x <right>") 'windmove-right-cycle)
(global-set-key (kbd "C-x <left>") 'windmove-left-cycle)

4

Apenas para adicionar a @Nate, a resposta de @aspirin e @Troydm, considero esta uma adição muito útil se você decidir vincular os comandos windmove a qualquer combinação de teclas que você escolher:

(setq windmove-wrap-around t)

Com a configuração padrão, você obterá um erro ao tentar mover para uma janela que não existe, o que se torna meio chato depois de um tempo. No entanto, quando windmove-wrap-around é definido, tentar mover para fora da parte inferior do quadro, por exemplo, selecionará a janela superior do quadro. Este pode ser um comportamento mais intuitivo para você.


4

M-ne M-pfaz mais sentido para mim, uma vez que são análogos a C-n( linha seguinte ) e C-p( linha anterior ):

(define-key global-map (kbd "M-p") 'previous-multiframe-window)
(define-key global-map (kbd "M-n") 'other-window)

(inspirado por isso e aquilo )


Eu votei e usei esta configuração. O problema é que M-ne M-pjá são usados ​​em terminais (gdb, python, ielm, etc.), então você terá que voltar para outro método para pular do buffer do terminal.
mihai

Para que são usados ​​nesses ambientes?
tshepang de

Esse é o melhor que vi no momento, não vai contra outras coisas e funciona como um encanto! Obrigado!
aurelien

2

Em referência à resposta de Nate, substituí o arrow keyspara usar o tradicional ppara ir up, npara ir down, fpara ir righte bpara ir left. Eu também substituiu o Ctrlcom Superchave como C-p, C-n, C-f and C-bsão as chaves do movimento padrão. Esta combinação com Mpermite que você pule caracteres e linhas em vez de passar apenas um por um após cada pressionamento de tecla. Assim, Superkey sentiu a melhor escolha para mantê-la uma fácil encadernação. Além disso, agora você não precisa mais tirar a mão da linha inicial!

(global-set-key (kbd "s-p") `windmove-up)
(global-set-key (kbd "s-n") `windmove-down)
(global-set-key (kbd "s-f") `windmove-right)
(global-set-key (kbd "s-b") `windmove-left)

Espero que ajude!


2
(global-unset-key (kbd "M-j"))
(global-unset-key (kbd "M-k"))
(global-set-key (kbd "M-j") (lambda () (interactive) (other-window 1)))
(global-set-key (kbd "M-k") (lambda () (interactive) (other-window -1)))

altje altkpercorrerá seus buffers visíveis. Para a frente e para trás, para ser exato.


Mk é um atalho meio útil. alguma outra alternativa?
A_P

1

Já existe um pacote que permite alternar entre janelas usando M-. verifique este site . Adicione isso ao seu arquivo init:

(require 'windmove)
(windmove-default-keybindings 'meta) ;; or use 'super to use windows key instead alt

0
(global-set-key (kbd "C-x a") 'ace-swap-window)  
(global-set-key (kbd "C-x q") 'ace-select-window)

download ace-window from the melpa repo if you don't know how to do that
put this in your .emacs file if you don't have one create it 

(package-initialize)                                                                                                                                                                     

(require 'package)                                                                                                                                                                       
(add-to-list 'package-archives '("melpa" , "http://melpa.org/packages/"))                                                                                                                

(package-initialize) 

then "m-x list-packages"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.