"Pop" jendela menjadi bingkai

13

Seringkali, saya windows saya secara otomatis terpecah sampai saya secara sewenang-wenang memutuskan bahwa frame saat ini tidak memiliki cukup real-estate untuk semuanya. Ketika ini terjadi, saya secara manual menghapus jendela, membuat bingkai, dan beralih ke jendela yang dihapus itu. Bagaimana saya bisa menulis fungsi elisp yang melakukan ini?

Saya mencoba:

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

Tetapi untuk beberapa alasan ini tidak melakukan apa yang saya pikir seharusnya.

PythonNut
sumber

Jawaban:

15

Coba ini sebagai gantinya:

(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
sumber
1
Hal lain yang saya tidak tahu saya inginkan sampai orang lain menulisnya. Keren.
glucas
Bagus! +1 untuk ringkas.
PythonNut
Dalam hal dampak kinerja (minimal) - apakah akan membuat perbedaan jika formulir membiarkan dan kecuali ditukar?
Matthias
@ Matthias Saya tidak yakin apakah inversi masuk akal pada titik ini, alasan saya mengikat buffer saat ini adalah karena menghapus jendela mungkin mengubah gagasan buffer saat ini. Satu-satunya cara saya melihat di sekitarnya akan membuat kode lebih rumit dengan memeriksa apakah hanya ada satu jendela, jika ya mari kita ikat buffer saat ini, menghapus dan muncul, jika tidak hanya menampilkan buffer saat ini dalam bingkai baru. Hilangnya kejelasan tidak layak untuk perubahan kinerja miniscule IMHO.
wasamasa
@Adamasa maaf karena tidak tepat. Saya ada dalam pikiran (kecuali (satu-jendela-p) (biarkan ...
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)))))

Perintah ini, serta yang berikut, yang tidak melakukan apa-apa jika jendela yang dipilih sendirian dalam bingkai, tersedia di pustaka 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
sumber
Ini tidak memberikan fokus ke bingkai baru di sini (gnome3.28). Menambahkan (select-frame-set-input-focus fr)pada akhirnya berhasil.
olejorgenb
@olejorgenb: Ya, apakah frame yang baru dibuat mendapatkan fokus input dapat bergantung pada window manager Anda. Jadi ya, Anda mungkin perlu menambahkan select-frame-set-input-focus. Dalam MS Windows, misalnya, ia mendapatkan fokus, jadi itu tidak diperlukan. Juga, deskripsi perintah tidak mengatakan bahwa frame menjadi fokus. Jika itu diinginkan maka perintah yang berbeda dapat dibuat yang memanggil ini dan kemudian memfokuskan frame.
Drew