Emacs, passa alla finestra precedente


93

In Emacs, C-x omi porta alla finestra successiva.

Quale macro della tastiera mi porta alla finestra precedente in Emacs?

Risposte:


88

Sarebbe C-- C-x o

In altre parole, C-x ocon un argomento di -1. È possibile specificare quante finestre spostare inserendo un argomento numerico tra C-ue il comando, come in C-u 2 C-x o. ( C--è una scorciatoia per C-u - 1)


E puoi usare C-x zper ripetere l'ultimo comando per cambiare rapidamente le finestre.
Ivan Huang

105

Potresti anche provare a utilizzare Windmove che ti consente di navigare nella finestra di tua scelta in base alla geometria. Ho quanto segue nel mio file .emacs per cambiare Windows usando il tasto freccia 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
Nota che la chiamata (windmove-default-keybindings)lega queste funzioni a SHIFT + su / giù / sinistra / destra, che penso sia più conveniente delle tue C-xassociazioni (che sono in conflitto con le associazioni predefinite anche utili per previous-buffere next-buffer. Lkahtz: la (kbd)funzione ti consente di specificare le chiavi nella notazione di stringa nella sintassi più leggibile che è anche usata da Emacs quando usi C-h ko C-h cper descrivere un binding.
phils

4
Non approvo l'utilizzo dei tasti freccia. Ma ho votato ugualmente per la disponibilità. : compiaciuto:
Bjorn

2
@phils SHIFT + <keys> interferisce con la selezione dello shift che è abilitata di default da Emacs 23 (shift-selection-mode).
legends2k

2
legends2k: True; anche se puoi anche passare un argomento a windmove-default-keybindingsper specificare un modificatore diverso da usare insieme ai tasti freccia; quindi quella funzione può ancora essere utile per le persone che usano la modalità di selezione dei turni.
phils

1
@phils Concordato, meta sembra essere una buona alternativa; come si vede in Emacs Wiki .
legends2k

30

Personalmente preferisco usare window-number.el

Per selezionare una finestra diversa, utilizzare Ctrl- x, Ctrl- j n

Dove n è il numero della finestra, la modeline di ogni finestra mostra il suo numero, come mostrato nello screenshot.

Basta scaricare window-number.el , posizionarlo nel percorso di caricamento di emacs e utilizzare quanto segue nel file.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)

C'è un'altra modalità simile chiamata switch-window.elche ti dà grandi numeri nelle finestre ... (premendo il numero si cambia la finestra e si ripristina la visualizzazione.)


(fonte: tapoueh.org )


2
Bello, ma suggerirei di non associare qualcosa a C-x C-j, poiché è l'associazione predefinita per dired-jumpif you (require 'dired-x). (Vedi M-x customize-group RET dired-keys RETse vuoi sovrascriverlo.)
phil

1
Dopo aver pubblicato questo, ho deciso di provare switch-window.el, utilizza C-x oinvece e quando ci sono solo due finestre attive, seleziona semplicemente l'altra finestra. Penso che sia più saggio rilegare C-x oper fare il window-numbertrucco, hai perfettamente ragione dired-jump. Personalmente faccio meno cambi di finestra e uso C-x bme stesso, ma avere il potenziato C-x oè abbastanza piacevole.
ocodo

wow fantastico tema Emacs nel primo screenshot. come posso averlo?
semente

@semente sulla mia pagina relativa a Emacs jasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
ocodo

1
@petrux emacsfodder.github.io/blog/two-new-emacs24-themes Penso che questo sia probabilmente uno dei due temi. - btw. Per una linea cool mode prova gist.github.com/jasonm23/8554119
ottobre

13

Se lavori molto con più finestre di emacs (> 3) e vorrai salvare alcune battute, aggiungilo al tuo file init e starai meglio:

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

Ora pedala velocemente attraverso le finestre con Mo


1
Questa è esattamente la soluzione di cui avevo bisogno. Tutto quello che volevo era che il comando di commutazione della finestra fosse una singola sequenza di tasti ripetuta. Grazie! Ho dovuto cambiare altra finestra o cornice in altra finestra per farlo funzionare, FYI. Sono su Emacs 24.2.1.
Geoff

Penso che queste siano associazioni molto buone (specialmente quando hai 2 o più finestre), grazie. Come detto anche cappello da cambiare other-windowper farlo funzionare.
dolzenko

11

Ci sono alcune risposte molto buone e complete qui, ma per rispondere alla domanda in modo minimalista:

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

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

2
Non so da quando, ma emacs è ora previous-windowintegrato.
Arne

@Arne Non è una funzione richiamabile, M-xquindi dovrebbe servire a uno scopo diverso.
Ivan Huang

4

Basato sull'idea di @Nate ma leggermente modificato per supportare il ciclismo all'indietro tra le finestre

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

Solo per aggiungere alla risposta di @Nate, @aspirin e @ Troydm, trovo che questa sia un'aggiunta molto utile se decidi di associare i comandi windmove a qualsiasi combinazione di tasti tu scelga:

(setq windmove-wrap-around t)

Con la configurazione predefinita riceverai un errore quando tenterai di spostarti in una finestra che non esiste, il che diventa un po 'fastidioso dopo un po'. Tuttavia, quando è impostato windmove-wrap-around, il tentativo di spostarsi dalla parte inferiore del frame, ad esempio, selezionerà invece la finestra più in alto nel frame. Questo potrebbe essere un comportamento più intuitivo per te.


4

M-ne M-pha più senso per me, poiché sono analoghi a C-n( riga successiva ) e C-p( riga precedente ):

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

(ispirato da questo e quello )


Ho votato in alto e ho usato questa configurazione. Il problema è che M-ne M-psono già utilizzati nei terminali (gdb, python, ielm, ecc.) Quindi dovrai tornare a un altro metodo per saltare fuori dal buffer del terminale.
mihai

A cosa servono in quegli ambienti?
tshepang

Questo è il migliore che ho visto per il momento, non va contro altre cose e funziona a meraviglia! Grazie!
aurelien

2

In riferimento alla risposta di Nate, ho sostituito l' arrow keysuso del tradizionale pper andare up, nper andare down, fper andare righte bper andare left. Ho anche sostituito la chiave Ctrlcon Supercome C-p, C-n, C-f and C-bsono i tasti di movimento predefiniti. Questa combinazione con Mti consente di saltare i caratteri e le righe invece di passare solo uno alla volta dopo ogni pressione di tasto. Quindi la Superchiave si è sentita la scelta migliore per mantenerla una facile associazione di tasti. Inoltre, ora non devi più togliere la mano dalla fila di casa!

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

Spero che sia d'aiuto!


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 altkscorrerà i tuoi buffer visibili. Avanti e indietro, per essere precisi.


Mk è una scorciatoia utile. altre alternative?
A_P

1

Esiste già un pacchetto che ti consente di cambiare finestra utilizzando M-. controlla questo sito web . Aggiungi questo al tuo file 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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.