"Поп" вікно в кадр


13

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

Я намагався:

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

Але чомусь це не робить те, що я думаю, що повинно.

Відповіді:


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

1
Інша річ, я не знав, що хочу, поки хтось не напише цього. Класно.
глюкас

Приємно! +1 за те, що є лаконічним.
PythonNut

Що стосується (мінімального) впливу на продуктивність - чи змінить це зміна, якщо дозволити та, якщо не замінити форми?
Маттіас

@Matthias Я не впевнений, чи має сенс інверсія в цей момент, тому що я зв'язую поточний буфер, тому що видалення вікна може змінити поняття поточного буфера. Єдиний спосіб, який я бачу навколо, ускладнив би код, перевіривши, чи є лише одне вікно, якщо так, дозвольте прив’язати поточний буфер, видаливши та вискочивши його, якщо немає просто відображення поточного буфера в новому кадрі. Втрата чіткості не варто для мінливої ​​зміни продуктивності IMHO.
wasamasa

@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 він фокусується, тому це не потрібно. Також опис команди не говорить про те, що кадр стає сфокусованим. Якщо цього потрібно, то може бути створена інша команда, яка викликає це, а потім фокусує кадр.
Дрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.