"Pop" une fenêtre dans un cadre

13

Souvent, mes fenêtres sont automatiquement divisées jusqu'à ce que je décide arbitrairement que le cadre actuel n'a pas assez de biens immobiliers pour toutes. Lorsque cela se produit, je supprime manuellement une fenêtre, crée un cadre et bascule vers cette fenêtre supprimée. Comment puis-je écrire une fonction elisp qui fait cela?

J'ai essayé:

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

Mais pour une raison quelconque, cela ne fait pas ce que je pense qu'il devrait.

PythonNut
la source

Réponses:

15

Essayez plutôt ceci:

(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)))
wasamasa
la source
1
Une autre chose que je ne savais pas vouloir avant que quelqu'un d'autre ne l'écrive. Cool.
glucas
Agréable! +1 pour être concis.
PythonNut
En termes d'impact (minimal) sur les performances - cela ferait-il une différence si le let et à moins que les formulaires soient échangés?
Matthias
@Matthias Je ne sais pas si l'inversion aurait un sens à ce stade, la raison pour laquelle je lie le tampon actuel est parce que la suppression de la fenêtre peut changer la notion de tampon actuel. La seule façon que je vois autour de lui rendrait le code plus compliqué en vérifiant s'il n'y a qu'une seule fenêtre, si oui, liez le tampon actuel, supprimez-le et sautez-le, sinon affichez simplement le tampon actuel dans un nouveau cadre. La perte de clarté n'en vaut pas la peine pour le changement de performance minuscule à mon humble avis.
wasamasa
@wasamasa désolé de ne pas être précis. J'avais en tête (à moins que (one-window-p) (laissez ...
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)))))

Cette commande, ainsi que la suivante, qui ne fait rien si la fenêtre sélectionnée est seule dans son cadre, sont disponibles dans la bibliothèque 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)))
A dessiné
la source
Cela n'a pas donné de focus au nouveau cadre ici (gnome3.28). L'ajout (select-frame-set-input-focus fr)à la fin a fonctionné.
olejorgenb
@olejorgenb: Oui, si un cadre nouvellement créé obtient le focus d'entrée peut dépendre de votre gestionnaire de fenêtres. Alors oui, vous devrez peut-être ajouter select-frame-set-input-focus. Dans MS Windows, par exemple, il obtient le focus, donc ce n'est pas nécessaire. De plus, la description de la commande ne dit pas que le cadre devient focalisé. Si vous le souhaitez, une commande différente peut être créée qui appelle cela et concentre ensuite le cadre.
Drew