Emacs, przejdź do poprzedniego okna

93

W Emacsie C-x oprzenosi mnie do następnego okna.

Jakie makro klawiatury przenosi mnie do poprzedniego okna w Emacsie?

Roger CS Wernersson
źródło

Odpowiedzi:

88

Tak by było C-- C-x o

Innymi słowy, C-x oz argumentem -1. Możesz określić, ile okien ma zostać przeniesionych, wstawiając argument numeryczny między C-ua poleceniem, jak w C-u 2 C-x o. ( C--jest skrótem do C-u - 1)

JB.
źródło
Możesz użyć, C-x zaby powtórzyć ostatnie polecenie, aby szybko przełączyć okna.
Ivan Huang
105

Możesz także spróbować użyć funkcji windmove, która umożliwia nawigację do wybranego okna na podstawie geometrii. W moim pliku .emacs mam następujące możliwości zmiany okien za pomocą klawisza strzałki 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
źródło
11
Zauważ, że wywołanie (windmove-default-keybindings)wiąże te funkcje z SHIFT + góra / dół / lewo / prawo, co moim zdaniem jest wygodniejsze niż twoje C-xpowiązania (które kolidują z również użytecznymi domyślnymi powiązaniami dla previous-bufferi next-buffer. Lkahtz: (kbd)funkcja pozwala określić klawisze w notacji łańcuchowej w bardziej czytelnej składni, która jest również używana przez Emacsa, gdy używasz C-h klub C-h c
opisujesz
4
Nie zgadzam się na używanie klawiszy strzałek. Ale i tak zagłosowałem za pomocą. : zadowolony:
Bjorn
2
@phils SHIFT + <klucze> wtrąca się z zaznaczeniem Shift, które jest domyślnie włączone w Emacs 23 (tryb shift-selection-mode).
legends2k
2
legends2k: True; chociaż można również przekazać argument, aby windmove-default-keybindingsokreślić inny modyfikator do użycia w połączeniu z klawiszami strzałek; więc ta funkcja może być nadal przydatna dla ludzi, którzy używają trybu wyboru zmiany.
phils
1
@phils Zgoda, meta wydaje się być dobrą alternatywą; jak widać na Wiki Emacsa .
legends2k
30

Osobiście wolę używać window-number.el

Aby wybrać inne okno, użyj Ctrl- x, Ctrl- j n

Gdzie n to numer okna, modeline każdego okna pokazuje jego numer, jak pokazano na zrzucie ekranu.

Po prostu pobierz window-number.el , umieść go w swojej ścieżce ładowania emacsa i użyj następującego w swoim.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)

Jest inny podobny tryb o nazwie, switch-window.elktóry daje duże liczby w oknach ... (naciśnięcie numeru przełącza okno i przywraca wyświetlanie.)


(źródło: tapoueh.org )

ocodo
źródło
2
Fajnie, ale radziłbym nie wiązać czegoś z tym C-x C-j, ponieważ jest to domyślne wiązanie dla dired-jumpciebie (require 'dired-x). (Sprawdź, M-x customize-group RET dired-keys RETczy chcesz to zmienić.)
phils
1
Po opublikowaniu tego postanowiłem spróbować switch-window.el, używa C-x ozamiast tego, a gdy są tylko dwa aktywne okna, po prostu wybiera drugie okno. Myślę, że najrozsądniej jest ponownie związać się C-x oz tym window-numbertrikiem, masz co do tego rację dired-jump. Osobiście wykonuję mniej przełączania okien i używam C-x bsamodzielnie, ale posiadanie ulepszonego C-x ojest całkiem przyjemne.
ocodo
wow niesamowity motyw Emacsa na pierwszym zrzucie ekranu. jak mogę to dostać?
semente
@semente na mojej stronie związanej z Emacsem jasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
ocodo
1
@petrux emacsfodder.github.io/blog/two-new-emacs24-themes Myślę, że jest to prawdopodobnie jeden z dwóch tematów. - przy okazji. Aby uzyskać fajną linię trybu, wypróbuj gist.github.com/jasonm23/8554119
ocodo
13

Jeśli dużo pracujesz z wieloma oknami emacsa (> 3) i będziesz chciał zapisać niektóre naciśnięcia klawiszy, dodaj to do swojego pliku init, a będziesz lepiej:

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

Teraz wystarczy szybko przejść przez okna za pomocą Mo

octi
źródło
1
To jest dokładnie to rozwiązanie, którego potrzebowałem. Chciałem tylko, aby polecenie przełączania okna było pojedynczym powtarzającym się naciśnięciem klawisza. Dzięki! Musiałem zmienić inne okno lub ramę na inne okno, aby to działało, FYI. Jestem na Emacs 24.2.1.
Geoff,
Myślę, że są to bardzo dobre wiązania (zwłaszcza gdy masz 2+ okna), dzięki. Jak już powiedziano, należy również zmienić kapelusz, aby other-windowdziałał.
dolzenko
11

Jest tu kilka bardzo dobrych i kompletnych odpowiedzi, ale aby odpowiedzieć na pytanie w sposób minimalistyczny:

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

 (define-key global-map (kbd "C-x p") 'prev-window)
bnzmnzhnz
źródło
2
Nie wiem od kiedy, ale emacs jest teraz previous-windowwbudowany.
Arne
@Arne Nie jest to funkcja wywoływalna, M-xwięc powinna służyć innemu celowi.
Ivan Huang
4

Oparty na pomyśle @Nate, ale nieznacznie zmodyfikowany, aby obsługiwać wsteczną zmianę między oknami

;; 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
źródło
4

Aby dodać do odpowiedzi @Nate, @aspirin i @ Troydm, uważam to za bardzo pomocne, jeśli zdecydujesz się powiązać polecenia windmove z dowolną wybraną kombinacją klawiszy:

(setq windmove-wrap-around t)

Przy domyślnej konfiguracji pojawi się błąd, gdy spróbujesz przejść do nieistniejącego okna, co po pewnym czasie staje się denerwujące. Jednakże, gdy ustawione jest windmove-wrap-around, wówczas próba przesunięcia się na przykład poza dolną część ramy spowoduje wybranie okna znajdującego się najwyżej w ramie. Może to być dla Ciebie bardziej intuicyjne zachowanie.

Hal
źródło
4

M-ni M-pmają dla mnie największy sens, ponieważ są analogiczne do C-n( next-line ) i C-p( previous-line ):

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

(inspirowane tym i owym )

tshepang
źródło
Głosowałem za i użyłem tej konfiguracji. Problemem jest to, że M-ni M-psą już stosowane w terminalach (gdb, Python, ielm itp), więc będziesz musiał wrócić do innej metody, aby wyskoczyć z bufora terminala.
mihai
Do czego są używane w tych środowiskach?
tshepang
To najlepsze, jakie w tej chwili widziałem, nie jest sprzeczne z innymi rzeczami i działa jak urok! Dzięki!
aurelien
2

Nawiązując do odpowiedzi Nate'a, zastąpiłem arrow keystradycyjne, paby jechać up, njechać down, fjechać righti bjechać left. Ja również otrzymuje Ctrlsię Superklucz jak C-p, C-n, C-f and C-bto klucze ruchowe domyślne. Ta kombinacja z Mpozwala na przeskakiwanie znaków i linii zamiast przechodzenia przez jeden po drugim po każdym naciśnięciu klawisza. Dlatego Superklucz wydawał się najlepszym wyborem, aby utrzymać go jako łatwe wiązanie klucza. Ponadto, teraz nie musisz już odrywać ręki od głównego rzędu!

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

Mam nadzieję, że to pomoże!

Indradhanush Gupta
źródło
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)))

altji altkprzejdzie przez Twoje widoczne bufory. Dokładnie do przodu i do tyłu.

sjas
źródło
Mk to przydatny skrót. jakieś inne alternatywy?
A_P
1

Istnieje już pakiet umożliwiający przełączanie okien za pomocą M-. sprawdź tę stronę internetową . Dodaj to do swojego pliku init:

(require 'windmove)
(windmove-default-keybindings 'meta) ;; or use 'super to use windows key instead alt
aspiryna
źródło
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
źródło
0

Najszybszą metodą przełączania się do poprzedniego okna, jaką znalazłem, jest zgniecenie kilku klawiszy razem jako „akord klawiszowy” . Poniższe opcje umożliwiają jednoczesne użycie lewego małego palca + serdecznego palca, aby przejść do poprzedniego okna:

(key-chord-define-global "qw" 'prev-window)
(key-chord-define-global "'y" 'other-window) ; bonus for my colemak, adjust otherwise
(key-chord-define-global ";'" 'other-window) ; probably normal

(Jest to możliwe, ponieważ akordy klawiszowe Emacsa są niezależne od kolejności, co qwoznacza to samo wq).

Micah Elliott
źródło