"Pop" una ventana en un marco

13

A menudo, mis ventanas se dividen automáticamente hasta que decido arbitrariamente que el marco actual no tiene suficiente espacio para todos. Cuando esto ocurre, elimino manualmente una ventana, creo un marco y cambio a esa ventana eliminada. ¿Cómo puedo escribir una función elisp que haga esto?

Lo intenté:

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

Pero por alguna razón, esto no hace lo que creo que debería.

PythonNut
fuente

Respuestas:

15

Intenta esto en su lugar:

(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
fuente
1
Otra cosa que no sabía que quería hasta que alguien más lo escribió. Frio.
glucas
¡Agradable! +1 por ser conciso.
PythonNut
En términos de impacto (mínimo) en el rendimiento, ¿marcaría la diferencia si se intercambian los formularios let ya menos que se intercambien?
Matthias
@Matthias No estoy seguro de si la inversión tendría sentido en este momento, la razón por la que estoy vinculando el búfer actual es porque eliminar la ventana podría cambiar la noción del búfer actual. La única forma en que lo veo a su alrededor haría que el código sea más complicado al verificar si solo hay una ventana, en caso afirmativo, deje de vincular el búfer actual, elimínelo y revístalo, si no solo muestra el búfer actual en un nuevo marco. La pérdida de claridad no vale la pena por el minúsculo cambio de rendimiento en mi humilde opinión.
wasamasa
@wasamasa lo siento por no ser precisa. Tenía en mente (a menos que (one-window-p) (vamos ...
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)))))

Este comando, así como el siguiente, que no hace nada si la ventana seleccionada está sola en su marco, están disponibles en la biblioteca 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)))
Dibujó
fuente
Esto no dio foco al nuevo marco aquí (gnome3.28). Agregar (select-frame-set-input-focus fr)al final funcionó.
olejorgenb 29/0318
@olejorgenb: Sí, si un marco recién creado obtiene el foco de entrada puede depender de su administrador de ventanas. Entonces sí, es posible que deba agregar select-frame-set-input-focus. En MS Windows, por ejemplo, obtiene el foco, por lo que no es necesario. Además, la descripción del comando no dice que el marco se enfoca. Si se desea, se puede crear un comando diferente que llame a esto y luego enfoque el marco.
Drew