«Поп» окно в рамку

13

Часто мои окна автоматически разделяются, пока я не решу, что в текущем кадре недостаточно места для них всех. Когда это происходит, я вручную удаляю окно, создаю фрейм и переключаюсь на это удаленное окно. Как я могу написать функцию elisp, которая делает это?

Я старался:

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

Но по некоторым причинам это не делает то, что я думаю, что должно.

PythonNut
источник

Ответы:

15

Попробуйте это вместо этого:

(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
источник
1
Еще одна вещь, которую я не знал, я хотел, пока кто-то другой не написал это. Здорово.
glucas
Ницца! +1 за краткость.
PythonNut
С точки зрения (минимального) влияния на производительность - будет ли это иметь значение, если поменять местами пусть и разве что формы?
Матиас
@Matthias Я не уверен, что инверсия будет иметь смысл на этом этапе, потому что я привязываю текущий буфер, потому что удаление окна может изменить представление о текущем буфере. Единственный способ обойти это - сделать код более сложным, проверив, существует ли только одно окно, если да, разрешить привязку текущего буфера, удалить и вытолкнуть его, если нет, просто отобразить текущий буфер в новом кадре. Потеря ясности не стоит этого для незначительного изменения производительности ИМХО.
Васамаса
@wasamasa извините за не быть точным. Я имел в виду (разве что (одно окно-р) (пусть ...
Матиас
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)))))

Эта команда, а также следующая, которая ничего не делает, если выбранное окно находится в кадре в одиночку, доступны в библиотеке 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)))
Нарисовалась
источник
Это не дало сосредоточиться на новом кадре здесь (gnome3.28). Добавление (select-frame-set-input-focus fr)в конце сработало.
olejorgenb
@olejorgenb: Да, от того, будет ли фокус на вводе, только что созданный кадр, зависит от вашего оконного менеджера. Так что да, вам может понадобиться добавить select-frame-set-input-focus. В MS Windows, например, он получает фокус, так что в этом нет необходимости. Кроме того, описание команды не говорит о том, что кадр становится сфокусированным. Если это необходимо, то можно создать другую команду, которая вызывает это, а затем фокусирует кадр.
Дрю