"Pop" una finestra in una cornice


13

Spesso, le mie finestre si dividono automaticamente fino a quando decido arbitrariamente che il frame corrente non ha abbastanza proprietà immobiliari per tutti. In questo caso, cancello manualmente una finestra, creo una cornice e passo a quella finestra eliminata. Come posso scrivere una funzione elisp che fa questo?

Provai:

(defun pop-window-into-frame ()
  (interactive)
  (delete-window)
  (make-frame-command)
  (switch-to-prev-buffer))

Ma per qualche ragione questo non fa quello che penso dovrebbe.

Risposte:


15

Prova questo invece:

(defun my-turn-current-window-into-frame ()
  (interactive)
  (let ((buffer (current-buffer)))
    (unless (one-window-p)
      (delete-window))
    (display-buffer-pop-up-frame buffer nil)))

1
Un'altra cosa che non sapevo di volere finché non è stata scritta da qualcun altro. Freddo.
Glucas,

Bello! +1 per essere conciso.
PythonNut

In termini di impatto (minimo) sulle prestazioni, farebbe differenza se let e a meno che i moduli non vengano scambiati?
Matthias,

@Matthias Non sono sicuro se l'inversione avrebbe senso a questo punto, il motivo per cui sto vincolando il buffer corrente è perché l'eliminazione della finestra potrebbe cambiare la nozione del buffer corrente. L'unico modo in cui lo vedo renderebbe il codice più complicato controllando se esiste una sola finestra, in caso affermativo, rilegare il buffer corrente, eliminarlo e visualizzarlo, se non semplicemente visualizzare il buffer corrente in un nuovo frame. La perdita di chiarezza non vale la pena per il minuscolo cambiamento di prestazioni IMHO.
Wasamasa,

@wasamasa scusa per non essere preciso. Avevo in mente (a meno che (one-window-p) (let ...
Matthias,

4
;; Inspired from `mouse-tear-off-window'.
(defun tear-off-window ()
  "Create a new frame displaying buffer of selected window.
    If window is not the only one in frame, then delete it.
    Otherwise, this command effectively clones the frame and window."
  (interactive)
  (let ((owin  (selected-window))
        (buf   (window-buffer))
        (fr    (make-frame)))
    (select-frame fr)
    (switch-to-buffer buf)
    (save-window-excursion 
      (select-window owin)
      (unless (one-window-p) (delete-window owin)))))

Questo comando, così come il seguente, che non fa nulla se la finestra selezionata è sola nel suo frame, sono disponibili in libreria frame-cmds.el.

(defun tear-off-window-if-not-alone ()
  "Move selected window to a new frame, unless it is alone in its frame.
If it is alone, do nothing.  Otherwise, delete it and create a new
frame showing the same buffer."
  (interactive)
  (if (one-window-p 'NOMINI)
      (message "Sole window in frame")
    (tear-off-window)))

Questo non ha messo a fuoco il nuovo frame qui (gnome3.28). Aggiunta (select-frame-set-input-focus fr)alla fine ha funzionato.
olejorgenb

@olejorgenb: Sì, se un frame appena creato ottiene lo stato attivo di input può dipendere dal tuo gestore di finestre. Quindi sì, potrebbe essere necessario aggiungere select-frame-set-input-focus. In MS Windows, ad esempio, ottiene lo stato attivo, quindi non è necessario. Inoltre, la descrizione del comando non dice che il frame si focalizzi. Se lo si desidera, è possibile creare un comando diverso che lo chiama e quindi focalizza il frame.
Estratto il
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.