Chuyển đổi giữa các bố trí cửa sổ


24

Khi tôi định cấu hình bố cục tùy chỉnh và sau đó chỉ cần xem tạm thời một tệp toàn màn hình và một khi tôi muốn bố cục đó trở lại - tôi cần thủ công để chỉnh lại nó.

Tôi muốn một plugin / mã elisp để lưu bố cục của tôi và để có thể chuyển đổi giữa các bố cục đã lưu.

CẬP NHẬT

Cảm ơn tất cả.

abo-abo đề xuất sử dụng chế độ người chiến thắng thực sự rất hay và tôi đã làm cho nó hoạt động trong thời gian không.

wasamasa đề xuất một loạt các plugin tuyệt vời mà tôi chưa từng nghe và cung cấp thông tin về cách sử dụng các thanh ghi.

Jordon Biondo giải thích cho tôi cách sử dụng các thanh ghi và công cụ này thực sự là những gì tôi muốn theo cách đơn giản nhất.

Cảm ơn tất cả.

Câu trả lời:


23

Cách xây dựng để làm điều này là với các thanh ghi.

Ví dụ sử dụng C-xrwađể lưu cấu hình cửa sổ hiện tại để đăng ký a.

Sau đó, bạn có thể sử dụng ràng buộc tích hợp C-x1để chạydelete-other-windows

sau khi bạn xem xong tệp đơn, sử dụng C-xrjađể bật lại cấu hình cửa sổ đã lưu trong đăng ký a.

Nói ngắn gọn:

C-xrwa (lưu cấu hình vào đăng ký)

C-x1 (xóa các cửa sổ khác)

C-xrja (áp dụng lại cấu hình cửa sổ đã lưu)


Mặc dù vậy, tôi thấy các thanh ghi khó sử dụng, tôi sử dụng ngăn xếp cấu hình cửa sổ tùy chỉnh để quản lý các cấu hình của mình.

Tôi có hai ràng buộc đẩy cấu hình hiện tại lên ngăn xếp, và bật và áp dụng cấu hình hàng đầu.

Vì vậy, trong phối cảnh của bạn, tôi sẽ thực hiện liên kết đẩy của mình, sau đó là Cx 1, sau đó thực hiện liên kết bật của tôi.

Đây là mã:

(defvar winstack-stack '()
  "A Stack holding window configurations.
Use `winstack-push' and
`winstack-pop' to modify it.")

(defun winstack-push()
  "Push the current window configuration onto `winstack-stack'."
  (interactive)
  (if (and (window-configuration-p (first winstack-stack))
         (compare-window-configurations (first winstack-stack) (current-window-configuration)))
      (message "Current config already pushed")
    (progn (push (current-window-configuration) winstack-stack)
           (message (concat "pushed " (number-to-string
                                       (length (window-list (selected-frame)))) " frame config")))))

(defun winstack-pop()
  "Pop the last window configuration off `winstack-stack' and apply it."
  (interactive)
  (if (first winstack-stack)
      (progn (set-window-configuration (pop winstack-stack))
             (message "popped"))
    (message "End of window stack")))

Sau đó bạn có thể liên kết winstack-pushđến một cái gì đó giống như C-cC-u, và winstack-popđể C-cC-odễ dàng nhảy xung quanh.


Điều này là rất rất rất rất tốt đẹp!
lukas.pukenis

20

Tôi sử dụng winner-mode. Đây là thiết lập của tôi:

(winner-mode)
(global-set-key [f7] 'winner-undo)
(global-set-key [C-f7] 'winner-redo)
(global-set-key [f9] 'delete-other-windows)
(global-set-key [C-f9] 'delete-window)

Tôi không biết có cách nào để đánh dấu bố cục hay thứ gì đó không, nhưng có thể liên tục chuyển về bố cục trước đó là đủ cho tôi.


wow, chỉ có thể chuyển trở lại bố cục trước đó rất nhiều cho tôi. Cảm ơn!
lukas.pukenis

11

Emacs cung cấp các thanh ghi để lưu và áp dụng dữ liệu như cấu hình cửa sổ hiện tại của bạn, điều này có thể được thực hiện với C-x r wC-x r j. Tuy nhiên, cách tiếp cận này trở nên khó sử dụng vì bạn cần phải nhớ các thanh ghi cửa sổ.

Có một vài gói để cải thiện điều này. iregister làm cho tính năng cơ bản này dễ kiểm tra và tương tác hơn. Những cái khác tôi biết sử dụng nó mà không ảnh hưởng đến các thanh ghi, chẳng hạn như elscreenescreen sử dụng thanh tiêu đề để hiển thị các tab. nhóm làm việcnhóm làm việc2 là hai cách tiếp cận mới hơn và sâu rộng hơn cho vấn đề này. Cá nhân tôi cũng không thích và do đó đã viết riêng của mình ở đâu đó ở giữa và hy vọng sẽ ít lỗi và phức tạp hơn.


Đó là thứ tuyệt vời về thanh ghi nhưng tôi nên sử dụng chúng như thế nào trong trường hợp này? Tôi sẽ kiểm tra các plugin bạn đã liệt kê để xem có thành công nào cho tôi không :)
lukas.pukenis

Bạn lưu bố cục hiện tại của mình vào một thanh ghi, thực hiện một số thay đổi, sau đó khi bạn muốn chuyển sang trạng thái cũ, hãy khôi phục bố cục từ thanh ghi. Các gói tôi đã liệt kê nâng bạn khỏi gánh nặng tinh thần khi làm điều này mỗi khi bạn muốn chuyển đổi bố cục.
wasamasa

có thể tạo một cấu hình cửa sổ nhất định trong khi khởi động (trong tệp .emacs của tôi) và sau đó lưu nó vào một thanh ghi không? Tôi đã thử (window-configuration-to-register "1")làm một lệnh trong .emacs của mình, nhưng nó không hoạt động
chiều

Hãy thử sử dụng desktop.el để biết rằng nó đã được kết hợp thành công với lông mày trước đó.
wasamasa

2

Bạn có thể lưu bố cục cửa sổ hiện tại vào một thanh ghi và sau đó khôi phục nó bằng cách sử dụng jump-to-register. Lệnh window-configuration-to-registerđược ràng buộc C-x r wtheo mặc định.

Ví dụ: khi bạn sắp xếp các cửa sổ của mình theo cách hữu ích, bạn có thể lưu chúng để đăng ký ibằng cách sử dụng: C-x r w ivà khôi phục bố cục sau bằng cách sử dụng C-x r j i.


1
Ha, ba chúng tôi trả lời về sổ đăng ký cùng một lúc.
glucas

1

Zygospore cung cấp một bản sửa lỗi nhanh cho tình huống bạn mở nhiều cửa sổ và muốn tạm thời tối đa hóa một trong số chúng. Nó sửa đổi hành vi của C-x 1. Khi bạn mở nhiều cửa sổ, nó sẽ hoạt động như mặc định delete-other-windowsvà xóa tất cả các cửa sổ ngoại trừ cửa sổ bạn đang xem. Khi bạn nhấn nó một lần nữa, nó sẽ khôi phục các cửa sổ khác.

Chế độ người chiến thắng cung cấp một giải pháp tổng quát hơn, nhưng zygospore là tuyệt vời để phóng to tạm thời trên một cửa sổ duy nhất trong một khung. Điều tốt nhất là nó không sử dụng bất kỳ tổ hợp phím mới nào - nó định nghĩa lại C-x 1theo cách rất trực quan, do đó không có ràng buộc mới để tìm hiểu.


1

Đây là một câu hỏi thú vị. Vài năm trước tôi đã điều tra tất cả các giải pháp. Chỉ nhóm làm việc2.el là trọng lượng đủ lớn để bao gồm tất cả các trường hợp góc.

Nhưng UI nhóm làm việc2 là một thảm họa. Ví dụ: nếu bạn bật chế độ nhóm làm việc (như README đã đề xuất), bố cục trước đó sẽ được tự động tải trong khi khởi động emacs. Điều đó làm cho khởi động cực kỳ chậm MERYI thời gian.

Giải pháp của tôi là coi workgroups2 như một bộ sưu tập API thay vì một công cụ có thể sử dụng được. Vì vậy, tôi thay đổi tương tác UI mặc định của nó bằng cách sử dụng chế độ ivy ( https://github.com/abo-abo/swiper ) từ @ abo-abo

nhập mô tả hình ảnh ở đây

Chuyển đổi toàn bộ cửa sổ rất dễ dàng, sử dụng API từ chế độ người chiến thắng là đủ.

Đây là mã hoàn chỉnh (tôi chỉ sử dụng M-x toggle-full-window, M-x wg-create-workgroupM-x my-wg-switch-workgroup, bạn cũng cần cài đặt swiper, như tôi đã đề cập ở trên),

(defun toggle-full-window()
  "Toggle the full view of selected window"
  (interactive)
  ;; @see http://www.gnu.org/software/emacs/manual/html_node/elisp/Splitting-Windows.html
  (if (window-parent)
      (delete-other-windows)
    (winner-undo)))

(setq wg-use-default-session-file nil)
;; don't open last workgroup automatically in `wg-open-session',
;; I only want to check available workgroups! Nothing more.
(setq wg-load-last-workgroup nil)
(setq wg-open-this-wg nil)

;(workgroups-mode 1) ; put this one at the bottom of .emacs
;; by default, the sessions are saved in "~/.emacs_workgroups"
(autoload 'wg-create-workgroup "workgroups2" nil t)

(defun my-wg-switch-workgroup ()
  (interactive)
  (let (group-names selected-group)
    (unless (featurep 'workgroups2)
      (require 'workgroups2))
    (setq group-names
          (mapcar (lambda (group)
                    ;; re-shape list for the ivy-read
                    (cons (wg-workgroup-name group) group))
                  (wg-session-workgroup-list (read (f-read-text (file-truename wg-session-file))))))
    (ivy-read "work groups" group-names
              :action (lambda (group)
                        (wg-find-session-file wg-default-session-file)
                        (wg-switch-to-workgroup group)))))

(eval-after-load 'workgroups2
  '(progn
     ;; make sure wg-create-workgroup always success
     (defadvice wg-create-workgroup (around wg-create-workgroup-hack activate)
       (unless (file-exists-p (wg-get-session-file))
         (wg-reset t)
         (wg-save-session t))

       (unless wg-current-session
         ;; code extracted from `wg-open-session'.
         ;; open session but do NOT load any workgroup.
         (let ((session (read (f-read-text (file-truename wg-session-file)))))
           (setf (wg-session-file-name session) wg-session-file)
           (wg-reset-internal (wg-unpickel-session-parameters session))))
       ad-do-it
       ;; save the session file in real time
       (wg-save-session t))

     (defadvice wg-reset (after wg-reset-hack activate)
       (wg-save-session t))

     ;; I'm fine to to override the original workgroup
     (defadvice wg-unique-workgroup-name-p (around wg-unique-workgroup-name-p-hack activate)
       (setq ad-return-value t))))
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.