"Pop" uma janela em um quadro

13

Freqüentemente, minhas janelas são divididas automaticamente até que eu decida arbitrariamente que o quadro atual não tenha espaço suficiente para todas elas. Quando isso ocorre, excluo manualmente uma janela, crio um quadro e alterno para essa janela excluída. Como posso escrever uma função elisp que faz isso?

Eu tentei:

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

Mas, por alguma razão, isso não faz o que eu acho que deveria.

PythonNut
fonte

Respostas:

15

Tente isso:

(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
fonte
1
Outra coisa que eu não sabia que queria até que alguém a escrevesse. Legal.
glucas
Agradável! +1 por ser conciso.
precisa saber é o seguinte
Em termos de (mínimo) impacto no desempenho - faria diferença se o let e a menos que os formulários fossem trocados?
Matthias
@ Matthias Não tenho certeza se a inversão faria sentido neste momento, a razão pela qual estou ligando o buffer atual é porque excluir a janela pode mudar a noção do buffer atual. A única maneira que vejo ao redor dele tornaria o código mais complicado, verificando se há apenas uma janela, se sim, ligando o buffer atual, excluindo-o e abrindo-o, se não apenas exibindo o buffer atual em um novo quadro. A perda de clareza não vale a pena para a minúscula mudança de desempenho IMHO.
wasamasa
@wasamasa desculpe por não ser preciso. Eu tinha em mente (a menos que (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)))))

Este comando, assim como o seguinte, que não faz nada se a janela selecionada estiver sozinha em seu quadro, está disponível na 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)))
Desenhou
fonte
Isso não deu foco ao novo quadro aqui (gnome3.28). Adicionando (select-frame-set-input-focus fr)no final funcionou.
Olejorgenb
@olejorgenb: Sim, se um quadro recém-criado recebe o foco de entrada pode depender do seu gerenciador de janelas. Então, sim, você pode precisar adicionar select-frame-set-input-focus. No MS Windows, por exemplo, ele obtém o foco, portanto não é necessário. Além disso, a descrição do comando não diz que o quadro fica focado. Se isso for desejado, pode ser criado um comando diferente que chama isso e depois focaliza o quadro.
Tirou