Emacs, passer à la fenêtre précédente

93

Dans Emacs, C-x om'amène à la fenêtre suivante.

Quelle macro de clavier me ramène à la fenêtre précédente d'Emacs?

Roger CS Wernersson
la source

Réponses:

88

Ce serait C-- C-x o

En d'autres termes, C-x oavec un argument de -1. Vous pouvez spécifier le nombre de fenêtres à déplacer en insérant un argument numérique entre C-uet la commande, comme dans C-u 2 C-x o. ( C--est un raccourci pour C-u - 1)

JB.
la source
Et vous pouvez utiliser C-x zpour répéter la dernière commande pour changer rapidement de fenêtre.
Ivan Huang
105

Vous pouvez également essayer d'utiliser windmove qui vous permet de naviguer vers la fenêtre de votre choix en fonction de la géométrie. J'ai ce qui suit dans mon fichier .emacs pour changer de fenêtre à l'aide de la touche fléchée 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)
Nate
la source
11
Notez que l'appel (windmove-default-keybindings)lie ces fonctions à SHIFT + haut / bas / gauche / droite, ce qui, à mon avis, est plus pratique que vos C-xliaisons (qui sont en conflit avec les liaisons par défaut également utiles pour previous-bufferet next-buffer. Lkahtz: la (kbd)fonction vous permet de spécifier des clés en notation de chaîne dans la syntaxe plus lisible qui est également utilisée par Emacs lorsque vous utilisez C-h kou C-h cpour décrire une liaison.
phils
4
Je n'approuve pas l'utilisation des touches fléchées. Mais j'ai quand même voté pour l'utilité. : smug:
Bjorn
2
@phils SHIFT + <keys> se mêle de la sélection de décalage qui est activée par défaut à partir d'Emacs 23 (shift-selection-mode).
legends2k
2
legends2k: Vrai; bien que vous puissiez également passer un argument à windmove-default-keybindingspour spécifier un modificateur différent à utiliser conjointement avec les touches fléchées; de sorte que cette fonction peut toujours être pratique pour les personnes qui utilisent le mode de sélection de décalage.
phils
1
@phils D'accord, meta semble être une bonne alternative; comme vu dans Emacs Wiki .
legends2k
30

Personnellement je préfère utiliser window-number.el

Pour sélectionner une autre fenêtre, utilisez Ctrl- x, Ctrl- j n

n est le numéro de la fenêtre, la modeline de chaque fenêtre montre son numéro, comme indiqué sur la capture d'écran.

Téléchargez simplement window-number.el , placez-le dans votre chemin de chargement emacs et utilisez ce qui suit dans votre.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)

Il y a un autre mode similaire appelé switch-window.elqui vous donne de grands nombres dans les fenêtres ... (appuyer sur le nombre change la fenêtre et fait revenir l'affichage.)


(source: tapoueh.org )

ocodo
la source
2
Bien, mais je suggérerais de ne pas lier quelque chose à C-x C-j, car c'est la liaison par défaut pour dired-jumpsi vous (require 'dired-x). (Voyez M-x customize-group RET dired-keys RETsi vous voulez remplacer cela.)
phils
1
Après avoir posté ceci, j'ai décidé d'essayer switch-window.el, il utilise à la C-x oplace, et quand il n'y a que deux fenêtres actives, il sélectionne simplement l'autre fenêtre. Je pense qu'il est plus sage de se rebeller C-x opour faire l' window-numberaffaire, vous avez tout à fait raison dired-jump. Personnellement, je fais moins de changement de fenêtre et C-x bje m'utilise moi-même, mais avoir l'amélioration C-x oest assez agréable.
ocodo
wow thème Emacs étonnant dans la première capture d'écran. comment puis-je l'avoir?
semente
@semente sur ma page relative à Emacs jasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
ocodo
1
@petrux emacsfodder.github.io/blog/two-new-emacs24-themes Je pense que c'est probablement l'un des deux thèmes. - btw. Pour une ligne en mode cool, essayez gist.github.com/jasonm23/8554119
ocodo
13

Si vous travaillez beaucoup avec plusieurs fenêtres emacs (> 3) et que vous voudrez enregistrer quelques frappes, ajoutez ceci à votre fichier init et vous serez mieux:

(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)

Maintenant, il suffit de parcourir rapidement les fenêtres avec Mo

octi
la source
1
C'est exactement la solution dont j'avais besoin. Tout ce que je voulais, c'était que la commande de changement de fenêtre soit une seule touche répétitive. Merci! J'ai dû changer other-window-or-frame en other-window pour que cela fonctionne, FYI. Je suis sur Emacs 24.2.1.
Geoff
Je pense que ce sont de très bonnes liaisons (surtout lorsque vous avez plus de 2 fenêtres), merci. Comme dit également chapeau à changer other-windowpour que cela fonctionne.
dolzenko
11

Il y a ici de très bonnes réponses complètes, mais pour répondre à la question de manière minimaliste:

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

 (define-key global-map (kbd "C-x p") 'prev-window)
bnzmnzhnz
la source
2
Je ne sais pas depuis quand, mais emacs a maintenant previous-windowintégré.
Arne
@Arne Ce n'est pas une fonction appelable avec M-xdonc devrait servir un but différent.
Ivan Huang
4

Basé sur l'idée de @Nate mais légèrement modifié pour prendre en charge le cycle arrière entre les fenêtres

;; 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)
Troydm
la source
4

Juste pour ajouter à la réponse de @Nate, @aspirin et @ Troydm, je trouve que c'est un ajout très utile si vous décidez de lier les commandes windmove à la combinaison de touches que vous choisissez:

(setq windmove-wrap-around t)

Avec la configuration par défaut, vous obtiendrez une erreur lorsque vous tenterez de vous déplacer vers une fenêtre qui n'existe pas, ce qui devient un peu ennuyeux après un certain temps. Cependant, lorsque windmove-wrap-around est défini, une tentative de déplacement du bas du cadre, par exemple, sélectionnera à la place la fenêtre la plus haute du cadre. Cela peut être un comportement plus intuitif pour vous.

Hal
la source
4

M-net M-pcela a le plus de sens pour moi, car ils sont analogues à C-n( next-line ) et C-p( previous-line ):

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

(inspiré par ceci et cela )

tshepang
la source
J'ai voté et utilisé cette configuration. Le problème est que M-net M-psont déjà utilisés dans les terminaux (gdb, python, ielm, etc.), vous devrez donc revenir à une autre méthode pour sortir du tampon du terminal.
mihai
À quoi servent-ils dans ces environnements?
tshepang
C'est le meilleur que j'ai vu pour le moment, il ne va pas à l'encontre des autres trucs et fonctionne comme du charme! Merci!
aurelien
2

En référence à la réponse de Nate, j'ai remplacé le arrow keyspour utiliser le traditionnel ppour aller up, npour aller down, fpour aller rightet bpour aller left. J'ai également remplacé le Ctrlavec Superclé comme C-p, C-n, C-f and C-bsont les touches de déplacement par défaut. Cette combinaison avec Mvous permet de sauter des caractères et des lignes au lieu de les parcourir un par un après chaque frappe. SuperKey s'est donc senti le meilleur choix pour garder une reliure de clé facile. De plus, vous n'avez plus besoin de retirer votre main de la ligne de départ!

(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)

J'espère que ça aide!

Indradhanush Gupta
la source
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)))

altjet altkparcourra vos tampons visibles. En avant et en arrière, pour être exact.

sjas
la source
Mk est un raccourci assez utile. d'autres alternatives?
A_P
1

Il existe déjà un package qui vous permet de changer de fenêtre en utilisant M-. consultez ce site Web . Ajoutez ceci à votre fichier init:

(require 'windmove)
(windmove-default-keybindings 'meta) ;; or use 'super to use windows key instead alt
aspirine
la source
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"
user9618991
la source