"Pop" ein Fenster in einen Rahmen

13

Häufig werden meine Fenster automatisch geteilt, bis ich willkürlich feststelle, dass der aktuelle Frame nicht über genügend Platz für alle verfügt. In diesem Fall lösche ich manuell ein Fenster, erstelle einen Rahmen und wechsle zu diesem gelöschten Fenster. Wie kann ich eine Elisp-Funktion schreiben, die dies tut?

Ich habe es versucht:

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

Aber aus irgendeinem Grund tut dies nicht das, was ich denke, dass es sollte.

PythonNut
quelle

Antworten:

15

Versuchen Sie dies stattdessen:

(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
quelle
1
Noch etwas, von dem ich nicht wusste, dass ich es wollte, bis es jemand anderes schrieb. Cool.
Glucas
Nett! +1 für prägnante.
PythonNut
In Bezug auf die (minimale) Auswirkung auf die Leistung - würde es einen Unterschied machen, wenn die Let- und If-Formulare ausgetauscht werden?
Matthias
@Matthias Ich bin mir nicht sicher, ob die Inversion an dieser Stelle Sinn macht. Der Grund, warum ich den aktuellen Puffer binde, ist, dass das Löschen des Fensters die Vorstellung des aktuellen Puffers ändern könnte. Die einzige Möglichkeit, die ich sehe, würde den Code komplizierter machen, indem ich überprüfe, ob es nur ein Fenster gibt, wenn ja, den aktuellen Puffer binden, löschen und platzieren, wenn nicht nur der aktuelle Puffer in einem neuen Frame angezeigt wird. Der Verlust an Klarheit lohnt sich meiner Meinung nach nicht für die winzige Leistungsänderung.
Wasamasa
@wasamasa Entschuldigung für die Ungenauigkeit. Ich hatte vor (es sei denn (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)))))

Dieser Befehl sowie die folgenden Befehle, die nichts bewirken, wenn sich das ausgewählte Fenster allein in seinem Rahmen befindet, sind in der Bibliothek verfügbar 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)))
Drew
quelle
Dies hat den neuen Frame hier nicht in den Fokus gerückt (gnome3.28). Hinzufügen (select-frame-set-input-focus fr)am Ende hat funktioniert.
Olejorgenb
@olejorgenb: Ja, ob ein neu erstellter Frame den Eingabefokus erhält, kann von Ihrem Fenstermanager abhängen. Also ja, müssen Sie möglicherweise hinzufügen select-frame-set-input-focus. In MS Windows beispielsweise erhält es den Fokus, so dass dies nicht erforderlich ist. Die Befehlsbeschreibung besagt auch nicht, dass der Rahmen fokussiert wird. Wenn dies gewünscht wird, kann ein anderer Befehl erstellt werden, der dies aufruft und dann den Rahmen fokussiert.
Drew