"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.

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.