Pop Pop Một cửa sổ vào một khung


13

Thông thường, các cửa sổ của tôi sẽ tự động bị phân tách cho đến khi tôi tùy ý quyết định rằng khung hiện tại không có đủ bất động sản cho tất cả chúng. Khi điều này xảy ra, tôi xóa thủ công một cửa sổ, tạo khung và chuyển sang cửa sổ đã xóa đó. Làm thế nào tôi có thể viết một chức năng elisp làm điều này?

Tôi đã thử:

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

Nhưng vì một số lý do, điều này không làm những gì tôi nghĩ nó nên làm.

Câu trả lời:


15

Hãy thử điều này thay thế:

(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
Một điều nữa tôi không biết tôi muốn cho đến khi người khác viết nó. Mát mẻ.
glucas

Đẹp! +1 cho ngắn gọn.
PythonNut

Xét về tác động hiệu suất (tối thiểu) - nó sẽ tạo ra sự khác biệt nếu cho phép và trừ khi các hình thức được hoán đổi?
Matthias

@Matthias Tôi không chắc liệu đảo ngược có ý nghĩa vào thời điểm này hay không, lý do tôi ràng buộc bộ đệm hiện tại là vì xóa cửa sổ có thể thay đổi khái niệm về bộ đệm hiện tại. Cách duy nhất tôi thấy xung quanh nó sẽ làm cho mã phức tạp hơn bằng cách kiểm tra xem chỉ có một cửa sổ hay không, nếu có, hãy ràng buộc bộ đệm hiện tại, xóa và bật nó, nếu không chỉ hiển thị bộ đệm hiện tại trong một khung mới. Mất sự rõ ràng không đáng để thay đổi hiệu suất rất nhỏ IMHO.
wasamasa

@wasamasa xin lỗi vì không nuôi ong chính xác. Tôi đã có ý nghĩ (trừ khi (một cửa sổ-p) (hãy ...
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)))))

Lệnh này, cũng như sau đây, không làm gì nếu cửa sổ được chọn chỉ có một mình trong khung của nó, có sẵn trong thư viện 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)))

Điều này đã không tập trung vào khung mới ở đây (gnome3.28). Thêm (select-frame-set-input-focus fr)vào cuối làm việc.
olejorgenb

@olejorgenb: Có, việc một khung hình mới được tạo có lấy tiêu điểm đầu vào hay không có thể phụ thuộc vào trình quản lý cửa sổ của bạn. Vì vậy, có, bạn có thể cần phải thêm select-frame-set-input-focus. Ví dụ, trong MS Windows, nó lấy được trọng tâm, vì vậy điều đó không cần thiết. Ngoài ra, mô tả lệnh không nói rằng khung trở nên tập trung. Nếu đó là muốn thì một lệnh khác có thể được tạo để gọi lệnh này và sau đó tập trung khung.
Drew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.