Emacs, wechseln Sie zum vorherigen Fenster


93

Bringt C-x omich in Emacs zum nächsten Fenster.

Welches Tastaturmakro bringt mich zum vorherigen Fenster in Emacs?

Antworten:


88

Das wäre C-- C-x o

Mit anderen Worten, C-x omit einem Argument von -1. Sie können angeben, wie viele Fenster verschoben werden sollen, indem Sie ein numerisches Argument zwischen C-uund den Befehl einfügen , wie in C-u 2 C-x o. ( C--ist eine Abkürzung für C-u - 1)


Und Sie können C-x zden letzten Befehl wiederholen, um die Fenster schnell zu wechseln.
Ivan Huang

105

Möglicherweise möchten Sie auch Windmove verwenden, mit dem Sie basierend auf der Geometrie zum Fenster Ihrer Wahl navigieren können. Ich habe Folgendes in meiner .emacs-Datei, um Fenster mit der Cx-Pfeiltaste zu ändern.

(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
Beachten Sie, dass der Aufruf (windmove-default-keybindings)diese Funktionen an UMSCHALT + Auf / Ab / Links / Rechts bindet, was meiner Meinung nach bequemer ist als Ihre C-xBindungen (die im Widerspruch zu den ebenfalls nützlichen Standardbindungen für previous-bufferund stehen next-buffer. Lkahtz: Mit dieser (kbd)Funktion können Sie Schlüssel in Zeichenfolgennotation angeben in der besser lesbaren Syntax, die auch von Emacs verwendet wird, wenn Sie eine Bindung verwenden C-h koder C-h cbeschreiben.
Phils

4
Ich bin mit der Verwendung von Pfeiltasten nicht einverstanden. Aber ich habe mich trotzdem für die Hilfsbereitschaft ausgesprochen. : selbstgefällig:
Björn

2
@phils SHIFT + <keys> mischt sich in die Schichtauswahl ein, die standardmäßig in Emacs 23 aktiviert ist (Schichtauswahlmodus).
Legends2k

2
legends2k: Richtig; Sie können jedoch auch ein Argument übergeben, windmove-default-keybindingsum einen anderen Modifikator anzugeben, der in Verbindung mit den Pfeiltasten verwendet werden soll. Damit kann diese Funktion auch für Personen nützlich sein, die den Schichtauswahlmodus verwenden.
Phils

1
@phils Einverstanden, Meta scheint eine gute Alternative zu sein; wie im Emacs Wiki zu sehen .
Legends2k

30

Persönlich bevorzuge ich zu verwenden window-number.el

Verwenden Sie Ctrl- x, Ctrl- n, um ein anderes Fenster auszuwählenj

Wobei n die Nummer des Fensters ist, zeigt das Modell jedes Fensters seine Nummer an, wie im Screenshot gezeigt.

Laden Sie einfach window-number.el herunter , platzieren Sie es in Ihrem Emacs -Ladepfad und verwenden Sie Folgendes in Ihrem.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)

Es gibt einen anderen ähnlichen Modus, switch-window.elder große Zahlen in den Fenstern anzeigt ... (Durch Drücken der Zahl wird das Fenster umgeschaltet und die Anzeige zurückgesetzt.)


(Quelle: tapoueh.org )


2
Schön, aber ich würde vorschlagen, nichts daran zu binden C-x C-j, da dies die Standardbindung für dired-jumpSie ist (require 'dired-x). (Sehen M-x customize-group RET dired-keys RETSie, ob Sie das überschreiben möchten.)
Phils

1
Nachdem ich dies gepostet habe, habe ich beschlossen switch-window.el, es auszuprobieren. C-x oStattdessen wird es verwendet. Wenn nur zwei Fenster aktiv sind, wird nur das andere Fenster ausgewählt. Ich denke, es ist am klügsten, sich wieder zu binden C-x o, um den window-numberTrick zu machen. Da haben Sie ganz recht dired-jump. Persönlich mache ich weniger Fensterwechsel und benutze C-x bmich selbst, aber die Verbesserung C-x oist sehr erfreulich.
ocodo

Wow, tolles Emacs-Thema im ersten Screenshot. Wie kann ich es bekommen?
Semente

@semente auf meiner Emacs verwandten Seite jasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
ocodo

1
@petrux emacsfodder.github.io/blog/two-new-emacs24-themes Ich denke, dies ist wahrscheinlich eines der beiden Themen. - Übrigens. Für eine coole Moduslinie
ocodo

13

Wenn Sie häufig mit mehreren Emacs-Fenstern (> 3) arbeiten und einige Tastenanschläge speichern möchten, fügen Sie diese Ihrer Init-Datei hinzu, und Sie sind besser dran:

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

Jetzt einfach mit Mo schnell durch die Fenster radeln


1
Dies ist genau die Lösung, die ich brauchte. Ich wollte nur, dass der Befehl zum Umschalten des Fensters ein einziger sich wiederholender Tastendruck ist. Vielen Dank! Ich musste ein anderes Fenster oder einen anderen Rahmen in ein anderes Fenster ändern, damit es funktioniert, FYI. Ich bin auf Emacs 24.2.1.
Geoff

Ich denke, das sind sehr gute Bindungen (besonders wenn Sie 2+ Fenster haben), danke. Wie gesagt auch Hut zu ändern other-window, damit es funktioniert.
Dolzenko

11

Hier gibt es einige sehr gute und vollständige Antworten, aber um die Frage minimalistisch zu beantworten:

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

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

2
Ich weiß nicht seit wann, aber Emacs hat jetzt previous-windoweingebaut.
Arne

@Arne Es ist keine aufrufbare Funktion mit M-xsollte also einem anderen Zweck dienen.
Ivan Huang

4

Basierend auf der Idee von @Nate, aber leicht modifiziert, um das Rückwärtswechseln zwischen Fenstern zu unterstützen

;; 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

Nur um die Antwort von @Nate, @aspirin und @ Troydm zu ergänzen, finde ich dies eine sehr hilfreiche Ergänzung, wenn Sie die Windmove-Befehle an eine beliebige Tastenkombination binden möchten:

(setq windmove-wrap-around t)

Bei der Standardkonfiguration wird eine Fehlermeldung angezeigt, wenn Sie versuchen, in ein nicht vorhandenes Fenster zu wechseln, was nach einer Weile ärgerlich wird. Wenn jedoch Windmove-Wrap-Around eingestellt ist, wird beim Versuch, sich beispielsweise vom unteren Rand des Rahmens zu entfernen, stattdessen das oberste Fenster im Rahmen ausgewählt. Dies kann für Sie ein intuitiveres Verhalten sein.


4

M-nund M-pmacht für mich am meisten Sinn, da sie analog zu C-n( nächste Zeile ) und C-p( vorherige Zeile ) sind:

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

(inspiriert von diesem und jenem )


Ich habe diese Konfiguration aktualisiert und verwendet. Das Problem ist, dass M-nund M-pbereits in Terminals (gdb, python, ielm usw.) verwendet werden, sodass Sie zu einer anderen Methode zurückkehren müssen, um aus dem Terminalpuffer zu springen.
Mihai

Wofür werden sie in diesen Umgebungen verwendet?
Tshepang

Das ist das Beste, was ich im Moment gesehen habe, es geht nicht gegen andere Dinge und funktioniert wie Charme! Vielen Dank!
Aurelien

2

In Bezug auf Nates Antwort ersetzte ich das arrow keys, um das Traditionelle pzum Gehen up, nzum Gehen down, fzum Gehen rightund bzum Gehen zu verwenden left. Ich habe auch die Ctrlmit SuperTaste ersetzt, ebenso C-p, C-n, C-f and C-bwie die Standardbewegungstasten. Mit dieser Kombination mit Mkönnen Sie Zeichen und Zeilen überspringen, anstatt nach jedem Tastendruck einzeln durchzugehen. Daher war der SuperSchlüssel die beste Wahl, um eine einfache Schlüsselbindung zu gewährleisten. Außerdem müssen Sie jetzt Ihre Hand nicht mehr von der Startreihe nehmen!

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

Ich hoffe es hilft!


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

altjund altkwird durch Ihre sichtbaren Puffer radeln. Vorwärts und rückwärts, um genau zu sein.


Mk ist eine nützliche Abkürzung. irgendwelche anderen Alternativen?
A_P

1

Es gibt bereits ein Paket, mit dem Sie mithilfe von M- die Fenster wechseln können. Überprüfen Sie diese Website . Fügen Sie dies Ihrer Init-Datei hinzu:

(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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.