Come passare rapidamente da una finestra all'altra?


90

Come posso passare rapidamente da una finestra all'altra?

Spesso ho più finestre aperte e devo passare da una all'altra. In questo momento, uso C-x oper arrivare a quello che voglio. È disponibile un flusso di lavoro più efficiente per questo?


Risposte:


62

Ovviamente preferisco la finestra dell'asso per questo. È possibile alternare tra finestre e cornici visibili. È in MELPA, puoi installarlo rapidamente. L'unica cosa che resta da fare è legarla:

(global-set-key (kbd "C-x o") 'ace-window)

O forse usare un accordo di chiave più breve, poiché il passaggio da una finestra all'altra è un'attività comune:

(global-set-key (kbd "M-p") 'ace-window)

Riassunto di ace-window

È un sostituto drop-in per other-window. A differenza di quest'ultimo, non è mai necessario chiamare ace-windowdue o più volte per selezionare una finestra: si seleziona una finestra desiderata in una chiamata (possibilmente su più frame).

Oltre a cambiare finestra, ace-windowpuoi fare di più (eliminare o scambiare finestre, ecc.), Vedi README .


2
Questo è interessante. Ho usato ace-windowe poi visto switch-windowche sembra fare più o meno la stessa cosa, tranne per il fatto che le lettere sono più pronunciate. sembra divertente che abbiamo entrambi i pacchetti.
milkypostman,

Hai ragione. Ci sono solo piccole differenze tra loro. Questo è un problema che dobbiamo affrontare quando abbiamo un repository con 2000 pacchetti. Non ne ero a conoscenza switch-windowfino a quando non mi sono presentato ace-windowal MELPA.
abo-ABO

1
grazie ace-window, ha più personalizzazioni rispetto ad altri pacchetti immagino. Tuttavia, in futuro si potrebbe essere di aiuto è un legame chiave con una funzione che sarebbe in un modo simile all'azione di scambio intelligente ma consumerebbe quella finestra risultante in una finestra più grande in corrispondenza di un punto e una finestra scelta di dimensioni più piccole (il mangiato finestra in alto). Il rapporto dovrebbe essere determinato in questo caso come può essere la metà, un quarto o un terzo.
dottorato

4
Si prega di considerare l'aggiunta di una descrizione. Dici solo che ti piace e ti colleghi ad esso. Ciò rende essenzialmente una risposta solo link.
Ha

4
Qual è il vantaggio di ace-window? Perché dovrei usarlo rispetto alle altre 14 soluzioni proposte in questa pagina?
Gilles,

103

Un modo è usare windmove. Con le sue combinazioni di tasti predefinite, consente di passare alla finestra accanto a quella attualmente attiva.

È incorporato in Emacs, quindi non è necessario installare nulla; basta attivarlo con la seguente configurazione minima nel file init:

(windmove-default-keybindings)

È quindi possibile passare a Windows limitrofi utilizzando i seguenti tasti (dove la freccia usata intuitivamente definisce la direzione in cui si muove): S-<left>, S-<right>, S-<up>, S-<down>.


Se preferisci utilizzare un altro modificatore anziché shift, puoi fornirlo come argomento a windmove-default-keybindings. Per esempio:

(windmove-default-keybindings 'meta)

o

(windmove-default-keybindings 'control)

Maggiori informazioni su Emacs Wiki .


16
Questa dovrebbe essere la risposta accettata!
Rowman,

OMG, perché nessun tutorial menziona maiusc + tasti freccia per spostarsi all'interno della finestra! È molto meglio quindi ctrl + o
Didier A.

Direi che alcune delle altre risposte qui contengono una configurazione ridondante di windmove. Forse vale la pena aggiornare la risposta per menzionare che la funzione accetta il tasto modificatore come argomento, ad esempio (windmove-default-keybindings 'meta)come suggerito su EmacsWiki.
metaturso

Questo crea molti conflitti con altri tasti (o con i gestori di finestre). Preferisco asso-finestra.
azzamsa,

Sto usando qualcosa di simile (mi sto muovendo con Shift-arrow) , ma quando hai un grande monitor con molte divisioni, un tale movimento diventa rapidamente ingombrante. Sarebbe più interessante enumerare in qualche modo windows / split. Come ace-window, ma con meno pressioni di tasti e un ovvio algoritmo per capire immediatamente il numero desiderato.
Hi-Angel,

21

È possibile associare other-windowuna sequenza di tasti più facile da digitare.

Ad esempio, mi sono C-.legato other-windowe sono C-,andato alla finestra precedente.

(global-set-key (kbd "C-.") #'other-window)
(global-set-key (kbd "C-,") #'prev-window)

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

Ciò è particolarmente utile per spostare più finestre; una volta premuto Control, è sufficiente premere un solo pulsante per passare alla finestra successiva. Questo è molto più semplice di tre pressioni di tasti per mossa.


2
+1 C-x oper other-windowè uno dei pochi contendenti solidi per il titolo di "peggior collegamento predefinito di emacs". La mia soluzione (simile a zck) è stata quella di ricollegarmi other windowa una sequenza di tasti (molto più semplice) - ce l'ho legato C-;(e il mio Caps-Lockviene scambiato con Ctrltutto ciò che serve è un rapido tocco dei mignoli). A proposito, sono totalmente dipendente da alcune caratteristiche di helme icicles(cioè, non sono "anti-pacchetti" o altro); Penso solo che una soluzione semplice funzioni meglio qui.
iceman

2
+1 Questa dovrebbe essere la risposta accettata E anche la risposta più semplice (purtroppo, non esiste ancora una cosa del genere su StEx). Funziona subito, scala perfettamente, semplice da memorizzare. Quest'ultimo l'ho trovato particolarmente importante nella giungla di Emacs. Dopo essere sopravvissuto lì per oltre 20 anni, a volte mi ritrovo in agguato ardentemente nel deserto del vi ...
Andreas Spindler

Semplice, facile da usare, facile da implementare. Ciò richiede più voti.
StewSquared,

1
Questo è anche quello che faccio. Io uso M-oper other-window. Alcune modalità già M-ovincolante, in particolare diff-mode, ggtag-modee ibuffer-mode. Devi separarlo manualmente in ciascuna mappa delle modalità. unbind-keyfornito da bind-key.elè molto utile.
Yasushi Shoji,

Anch'io lo uso M-oe mi sono M-Olegato a ace-windowquando ho bisogno della potenza aggiuntiva.
Glucas,

13

window-numbering.el!

Assegno il tasto di scelta rapida ", 1", ", 2", ", 3" per passare a una finestra specifica (si noti che utilizzo la modalità male)

inoltre, visualizzo il numero della finestra sulla riga della modalità in colore ROSA, sottolineato.

È un suggerimento visivo che non puoi mai ignorare,

Questo è il modo più veloce per cambiare finestra.

controllare https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.el e https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .el per la mia configurazione.

Sylvain Benner ha adottato la mia idea nei veicoli spaziali, ma le combinazioni di tasti sono diverse . Quindi, se usi spacemacs, ottieni la soluzione più veloce fuori dalla scatola.


2
Sì. Questo concetto è fantastico. Uso il pacchetto window-numbercon M-<num>per cambiare rapidamente le finestre b / n. Concetto simile a questo
unperson325680

1
Nota che window-numbering.el è deprecato a favore di winum , che è qui . FWIW la numerazione delle finestre per me non ha nemmeno funzionato.
Hi-Angel,

Potrei passare presto a winum. Ma la numerazione delle finestre funziona ancora bene su emacs24 / 25/26.
chen bin,

10

Senza utilizzare componenti aggiuntivi aggiuntivi, puoi continuare a utilizzare C-x ocon un prefisso opzionale per saltare molte finestre. Ad esempio: C-u 1 C-x oandrà alla finestra successiva nell'ordine (ad es. Cosa otterresti con la semplice C-x o), C-u 2 C-x opassa due finestre, C-u 3 C-x opassa tre finestre e così via.

Un estratto dal other-windowdocstring (la funzione chiamata da C-x o:

COUNT specifica il numero di finestre da saltare, a partire dalla finestra selezionata, prima di effettuare la selezione. Se COUNT è positivo, salta COUNT finestre in avanti. Se COUNT è negativo, salta indietro di -COUNT finestre. COUNT zero significa non saltare nessuna finestra, quindi seleziona la finestra selezionata. In una chiamata interattiva, COUNT è l'argomento prefisso numerico. Restituisce zero.


Quando hai più finestre quale ordine seguono?
stsquad,

L'ordine è la finestra ordine ciclico .
Dan

2
hmm "L'ordinamento è determinato da un attraversamento in profondità dell'albero della finestra della cornice, recuperando le finestre vive che sono i nodi foglia dell'albero" non è la descrizione più utile per il cervello umano che cerca di indovinare quale finestra è successiva o quanti saltare. Immagino sia per questo che utilizzo asso-finestra.
stsquad,

2
@stsquad: oh, sono d'accordo con te - mi fa girare anche la testa. Ho inserito questa risposta qui per completezza.
Dan

8

Alcune persone potrebbero ricordare l'editor Brief (abbastanza divertente prodotto da una società chiamata Underware).

Aveva un modo pulito per passare da una finestra all'altra. La freccia M sposta il cursore nella finestra direttamente in linea con la direzione del tasto freccia.

Così, ho mappato i winmove-left, winmove-right, winmove-upe le winmove-downfunzioni di M-left, M-right, M-upe M-downle chiavi come segue nel mio file .emacs -

(global-set-key [M-left] 'windmove-left)          ; move to left window
(global-set-key [M-right] 'windmove-right)        ; move to right window
(global-set-key [M-up] 'windmove-up)              ; move to upper window
(global-set-key [M-down] 'windmove-down)          ; move to lower window

Ora posso spostarmi facilmente tra le finestre, indipendentemente da quanto sia ingombra la configurazione ... E può diventare piuttosto ingombra con le dimensioni dei display al giorno d'oggi ...


Questa non è più o meno la risposta di Francesco?
Dan

Sono d'accordo. Non me ne sono accorto prima di aver pubblicato il mio.
user2542

2
Un modo molto più breve per ottenere queste combinazioni di tasti è (windmove-default-keybindings 'meta)!
Omar,

8

Se si utilizza Icicles quindi C-x oconsente di selezionare le finestre per nome (o di andare in bicicletta).

  • Senza prefisso arg, C-x oè uguale al solito, a other-windowmeno che il frame non abbia una sola finestra, nel qual caso lo è other-frame.

  • Con un prefisso arg, C-x oè un multi-comando che ti consente di navigare tra le finestre o i frame per nome (o in bicicletta). La navigazione tra le finestre utilizza multi-comando icicle-select-window; navigare tra gli usi dei frame icicle-select-frame.

La navigazione utilizzata dipende dal prefisso arg:

  • Zero prefix arg (es. C-0): Se il frame selezionato ha più finestre, allora è così icicle-select-window, con windows nello stesso frame dei candidati. Altrimenti (cornice a finestra singola), questo è icicle-select-frame.

  • C-u: Se il frame selezionato ha più finestre, allora è così icicle-select-window, con le finestre di tutti i frame visibili come candidati. Altrimenti, questo è icicle-select-frame.

  • C-u C-u: icicle-select-windowcon le finestre di tutti i frame come candidati (inclusi frame iconificati o nascosti).

Come sempre in Icicles , puoi combinare (a) il completamento , digitando il testo per restringere l'insieme dei candidati corrispondenti (nomi di finestre o frame, in questo caso), con (b) andare in bicicletta (tra i candidati corrispondenti).


4

Prendi in considerazione l'uso di un accordo chiave per saltare rapidamente tra le finestre. Lo trovo molto più veloce che cercare un tasto modificatore (e anche meno sforzo sulle mie mani).

La mia scelta del pacchetto da utilizzare è ace-window, che consente di navigare su più finestre più facilmente di un semplice other-window.

(require 'key-chord)
(key-chord-define-global "xo" 'ace-window)
(key-chord-mode +1)

Ovviamente per usare questo è necessario key-chorde ace-window, entrambi sono disponibili in melpa.


2
Questa non è più o meno la risposta di abo-abo?
Dan

1
@Il suo non usa l'accordo-chiave, nota la mancanza di meta o super chiavi nell'accordo. Se usi asso-finestra / qualcos'altro è un po 'irrilevante, il punto era dare una risposta che non usa i tasti modificatori per le operazioni così comunemente usate.
Zavior,

1
L'ho visto, ma ho sollevato la domanda perché ace-windowsta facendo il lavoro come nella risposta di @ abo-abo. Mi sembra che, in questo contesto, la specifica combinazione di tasti da utilizzare avrebbe più senso come commento piuttosto che come risposta. Solo i miei due centesimi.
Dan

@Dan, nel complesso la domanda riguardava il cambio rapido delle finestre e non credo che questa soluzione sia stata ancora sollevata. Chiarita la risposta un po 'a riguardo.
Zavior,

@Zavior solleva un punto importante. La domanda riguarda il cambio rapido di Windows, per il quale la forma dell'associazione è molto importante. Indipendentemente dalla libreria che preferisci, key-chordconsente di associare combinazioni di chiavi molto accessibili. L'esempio di associazione di xoè più veloce di C-x o(profondità di uno contro due). Questa risposta potrebbe essere riformulata per sottolineare che la risposta è ortogonale alle altre risposte sulla selezione della funzione (ed ace-windowè solo una delle molte scelte che potrebbero essere associate nel modo descritto). Mantieni questa risposta distinta!
ebpa,

3

Alcune buone risposte qui, sono anche un fan di WinMove, ma lo associo a C- perché org-mode usa M- per manipolare le intestazioni

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

Dove diventa davvero buono è se lo si combina con Hydra . Seguendo gli esempi sul loro wiki ho creato il mio mostro:

(defhydra hydra-windows ()
  "C-arrow = switch, S-arrow = size, M-arrow = move"
  ("C-<left>" windmove-left nil)
  ("C-<right>" windmove-right nil)
  ("C-<up>" windmove-up nil)
  ("C-<down>" windmove-down nil)
  ("S-<left>" hydra-move-splitter-left nil)
  ("S-<right>" hydra-move-splitter-right  nil)
  ("S-<up>" hydra-move-splitter-up nil)
  ("S-<down>" hydra-move-splitter-down nil)
  ("M-<left>" buf-move-left nil)
  ("M-<right>" buf-move-right nil)
  ("M-<up>" buf-move-up nil)
  ("M-<down>" buf-move-down nil)
  ("p" previous-buffer "prev-buf")
  ("n" next-buffer "next-buf")
  ("1" delete-other-windows "1")
  ("d" delete-window "del")
  ("k" kill-buffer "kill")
  ("s" save-buffer "save")
  ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
  ("r" winner-redo "redo")
  ("b" helm-mini "helm-mini" :exit t)
  ("f" helm-find-files "helm-find" :exit t)
  ("|" (lambda () (interactive) (split-window-right) (windmove-right)))
  ("_" (lambda () (interactive) (split-window-below) (windmove-down)))
  ("q" nil "cancel")
  )

(global-set-key (kbd "M-#") 'hydra-windows/body)

Questo mi permette di cambiare le finestre, ridimensionarle, spostare i buffer da una finestra all'altra, scorrere i buffer, eliminare i buffer e persino annullare le configurazioni delle finestre tramite la modalità vincitore e integra anche il timone. Per uscire dall'idra, basta premere la freccia o qualche altro tasto non presente nell'idra. Puoi trovare le funzioni di "spostamento dell'idra" negli esempi dell'idra. La cosa grandiosa dell'idra è che non devo ricordare tutte quelle combinazioni di tasti e la sua "modalità", quindi una volta che sei nell'idra tutto è disponibile come un singolo tasto stampa.


1
Un modo più breve per ottenere le combinazioni di tasti menzionate all'inizio è (windmove-default-keybindings 'control).
Omar,

1

Se lo usi evil-mode, puoi semplicemente usare un prefisso numerico con C-w C-w( evil-window-next) per selezionare la finestra desiderata. Quindi: 1 C-w C-wseleziona la prima finestra in ordine ciclico, 3 C-w C-wseleziona la terza finestra in ordine ciclico e così via.


Sembra che dovrebbe essere combinato con l'altra tua risposta : è la stessa cosa, solo con legami specifici del male.
npostavs

1

Ace Jump ti consente di spostare il puntatore su tutte le parole di uno schermo, indipendentemente dalla finestra o dalla cornice in cui si trovano, quindi non è così diverso dall'uso di Ace Window o Switch Window.

Un vantaggio potrebbe essere che mentre salti le finestre puoi anche posizionare il puntatore con una certa precisione.

Lo trovo ancora un po 'ingombrante o distratto, e trovo che ne sto usando di windmovepiù, perché è molto semplice, ma uso ancora Ace Jump quando ho letto in un'altra finestra o frame e voglio spostarmi in un punto lì.


1

Come al solito, ci sono centinaia di modi diversi per ottenere questo risultato. Il mio modo preferito è usare NumberedWindows . Ho quindi impostato la seguente combinazione di tasti usando Super e i tasti 1-9.

(global-set-key (kbd "s-1") (lambda() (interactive) (window-number-select 1)))

Vado un po 'più in dettaglio su questo argomento esatto con un mio recente post che puoi leggere su Afternoon Coder .


In cosa differisce dalla risposta di Chen Bin ?
Gilles,

Ha un esempio di configurazione.
Travis,

-1

Puoi anche decidere di usare switch-window come sostituto visivo diC-x o


1
Qual è il vantaggio di switch-window? Perché dovrei usarlo rispetto alle altre 14 soluzioni proposte in questa pagina?
Gilles,

Come dice che dovresti? Emacs si basa su alternative, personalizzazione e libertà di decisione.
csantosb,

2
Non è né qui né lì. Perché qualcuno dovrebbe scegliere questa particolare alternativa? Perché uno dovrebbe decidere di utilizzare switch-windowsu tutti gli altri?
Gilles,
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.