Come scorrere tra due finestre quando ne ho più di due aperte?


8

Scenario: ho diverse (più di 2) finestre aperte. Lavoro attivamente con due di loro. Come posso saltare da una finestra all'altra e viceversa con un comando?

Uso asso-finestra; è fantastico ma non voglio premere il numero della finestra ogni volta. Conosco next-window/ prev-window, ma questi sono due comandi diversi.

Quello che sto cercando è qualcosa che ricordi quale era la finestra precedente quando seleziono un'altra finestra e torno su di essa. Richiamato ripetutamente, sarebbe passare tra le ultime due finestre, Alt- Tab-style.

Dove guardo?


Uso fnpiù uno dei tasti freccia per andare in qualsiasi direzione, incluso dentro e fuori il minibuffer (se è attivo) - vedere la libreria integrata windmove.
elenco delle leggi

@lawlist: so di windmove. Quello che sto cercando è un modo per non pensare alla direzione richiesta, specialmente se le finestre hanno qualche altra finestra tra di loro.
9000

Risposte:


6

Un modo per scrivere il tuo comando è usare la get-mru-windowfunzione integrata.

Per esempio:

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window nil nil t)))
    (when win (select-window win))))

Cerca la finestra utilizzata più di recente nel frame corrente che non è la finestra attualmente selezionata.

Ecco una variante che funziona attraverso i frame visibili:

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible nil t)))
    (when win
      (select-frame-set-input-focus (window-frame win))
      (select-window win))))

Come accennato nei commenti, ecco una variante che funziona quando c'è solo una finestra (passando al buffer più recente):

(defun flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible t t)))
    (if win
        (progn
          (select-frame-set-input-focus (window-frame win))
          (select-window win))
      (mode-line-other-buffer))))

1
Azzeccato! Questo è molto meglio di quello che ho messo insieme. Bello trovare su get-mru-window.
Dan

1
Ho finito per aggiungere questo alla mia configurazione con una variazione aggiuntiva: quando c'è solo un frame / window (get-mru-window restituisce zero), quindi chiama mode-line-other-buffer. In questo modo ho una chiave che gira avanti e indietro tra due buffer in qualsiasi configurazione di finestra.
Glucas,

Grande. Adoro l'ultima variante @glucas. Grazie. Ecco come l'ho scritto e funziona. È questo il modo migliore per farlo? (defun my-switch-to-previous-window () (interattivo) (let ((win (get-mru-window nil nil nil t))) (if win (select-window win) (mode-line-other-buffer ))))
prosoitos

6

Se stai già utilizzando ace-window, puoi utilizzare il comando aw-flip-windowper passare da una finestra all'altra. Per impostazione predefinita, questo è associato nnella finestra dell'asso aw-dispatch-alist.

Ciò significa che puoi richiamare asso-finestra e premere ninvece di un numero di finestra per tornare alla finestra precedente. Potresti anche associare aw-flip-windowqualche altra chiave.

Nota che questo tornerà solo a una finestra che era stata precedentemente selezionata da asso-finestra. Se cambi spesso Windows con altri comandi, potresti voler una soluzione più generale.


4

Ecco un semplice comando, leggermente testato, che passerà alla finestra visitata più di recente:

(defvar recent-window nil
  "The most recently visited window.")

(defun switch-to-recent-window ()
  "Switch to the most recently visited window, as stored in
`recent-window'."
  (interactive)
  (let ((current (car (window-list))))
    (if recent-window
        (select-window recent-window)
      (message (concat "No recent window selected, "
                       "so I'm setting this window "
                       "as the most recent.")))
    (setq recent-window current)))

Grazie! Funziona. Ti dispiace se ne ricavo un pacchetto, con attribuzione?
9000

Prego. Certo, sentiti libero di usarlo in un pacchetto, ma tieni presente che il codice non è (ancora) molto intelligente. Se passi ad altre finestre con comandi come next-windowo other-window, la modifica non verrà rilevata nella recent-windowvariabile. Non c'è un hook ovvio da usare, quindi correggere questa parte può comportare la definizione di consigli per un sacco di altre funzioni.
Dan

1
Penso che potresti usare buffer-list-update-hook, che viene chiamato quando cambia la finestra attiva (dopo select-window). Tale hook viene chiamato in altri casi ma potrebbe essere utilizzato per tenere traccia dell'ultima finestra.
Glucas,
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.