Chia cửa sổ ở viền ngoài cùng


8

Tôi đang tìm cách để thêm một phân chia cửa sổ toàn bộ chiều cao mới vào cấu hình cửa sổ (tách) hiện có. Bởi vì tôi không biết làm thế nào để giải thích nó một cách chính xác, tôi sẽ chỉ đăng một số đồ họa ASCII hiển thị hành vi mong muốn cho hai cấu hình cửa sổ mẫu:

             from                              to  

  +-------------------------+      +---------------------+---+  
  |                         |      |                     |   |  
  |                         |      |                     |   |  
  |            A            |  =>  |           A         | E |  
  |                         |      |                     |   |  
  |                         |      |                     |   |  
  +-------------------------+      +---------------------+---+  

  +------------+------------+      +----------+----------+---+  
  |            |     B      |      |          |   B      |   |
  |     A      +------------+      |     A    +----------+   |
  |            |     C      |  =>  |          |   C      | E | 
  +------------+------------+      +----------+----------+   |
  |            D            |      |          D          |   |
  +-------------------------+      +---------------------+---+  

nơi chức năng chấp nhận chiều rộng mong muốn của cửa sổ mới Evà co lại độ rộng của A, B, C, và Dphù hợp. Edit2 : Lưu ý rằng hai bản vẽ trên là ví dụ về hành vi dự kiến ​​cho trường hợp cụ thể. Tôi đang tìm kiếm một chức năng chung thực hiện điều này một cách độc lập với cấu hình trong cột từ (tức là số lượng cửa sổ [chia tách] trong cột từ nên tùy ý).

Tôi cũng đang tìm kiếm chức năng này ở bên trái và trên cùng và dưới cùng của khung.

Chỉnh sửa: Từ nhận xét của @ Nsukami_ tôi nhận ra rằng chức năng tôi đang tìm kiếm là một trường hợp đặc biệt của một vấn đề trừu tượng hơn. Vì vậy, tôi sẽ giải quyết vấn đề đó:

Làm thế nào để bạn lưu trữ một cấu hình cửa sổ (bao gồm bất kỳ số lượng cửa sổ và bộ đệm) và "dán" cấu hình được lưu trữ vào một cửa sổ hiện có?

Các "dán" thì nên duy trì kích thước cửa sổ tương đối và tách; tự nhiên cấu hình dán kết quả là một bản sao tỷ lệ.


Hành vi đầu tiên có thể thu được bằng cách chuyển đối số kích thước thành split-window-rightas C-u -width C-x 3. Thay đổi widththành bất cứ điều gì bạn muốn và lưu ý dấu hiệu tiêu cực.
Vamsi

Tôi đang suy nghĩ về việc xác định trước một số bố cục, nhưng không chắc chắn.
Nsukami _

@Nsukami_ Có thể lưu trữ một cách bố trí cửa sổ (ví dụ như cách bố trí của A, B, C, và D) và sau đó chèn bố trí này vào một cửa sổ mới? Sau đó, vấn đề của tôi có thể được giải quyết bằng cách 1) lưu trữ cấu hình cửa sổ hiện tại, 2) thay đổi bố cục để chỉ hiển thị một cửa sổ sau đó được chia theo chiều ngang [về cơ bản hình thành cửa sổ cho Evà cửa sổ giữ chỗ cho những người khác, hãy gọi nó Z], 3 ) cuối cùng chèn bố cục ban đầu vào cửa sổ bên trái ( Z)
elemakil

Bạn sẽ phải điều chỉnh bố cục trước khi chèn vì chúng cũng chứa kích thước cửa sổ. Ngoài ra, không thể chèn bố cục vào một cửa sổ cụ thể nếu không có tùy chỉnh elisp AFAIK
Vamsi

Câu trả lời:


5

Các chức năng sau đây nên làm những gì bạn muốn. Bí quyết là chia cửa sổ gốc của khung hiện tại.

(defun my-split-main-window (direction size)
  "Split the main window in the DIRECTION where DIRECTION is a symbol with
possible values of right, left, above or below and SIZE is the final size of the
windows, if the window is split horizontally (i.e. in DIRECTION below or above)
SIZE is assumed to be the target height otherwise SIZE is assumed to be the
target width"
  (let* ((new-window (split-window (frame-root-window) nil direction))
         (horizontal (member direction '(right left))))
    (save-excursion 
      (select-window new-window)
      (enlarge-window (- size (if horizontal
                                  (window-width)
                                (window-height)))
                      horizontal))
    new-window))

Gọi hàm với hướng mà bạn chia cửa sổ và kích thước của cửa sổ mới. Ở trên trả về cửa sổ vừa tạo. Khái niệm và các cửa sổ và khung được giải thích rất tốt trong Hướng dẫn tham khảo GNU Emacs Lisp .


Hoàn hảo! Đây chỉ là những gì tôi muốn.
elemakil

0

Không chắc chắn nếu giải pháp tốt nhất, vì chưa đủ trừu tượng, tôi thực sự chỉ giải quyết một trường hợp sử dụng. Thủ thuật là viết một hàm để chuyển từ layoutX sang layoutY và một chức năng khác để chuyển từ layoutY sang layoutX

(defun from-x-to-y ()
 (interactive)
 (delete-other-windows)
 (split-window-vertically) ;;
 (let ((current-prefix-arg 10)) ;; emulate C-u
   (call-interactively 'enlarge-window) ;; resize
   )
 (split-window-horizontally) ;; -> |
 (next-multiframe-window)
 (split-window-vertically) ;;  -> --
 (previous-multiframe-window)
)

(defun from-y-to-x ()
  (interactive)
  (delete-other-windows)
  (split-window-horizontally) ;; -> |
  (let ((current-prefix-arg -60)) ;; emulate C-u
    (call-interactively 'shrink-window-horizontally) ;; resize
    )
  (split-window-vertically) ;; -> --
  (let ((current-prefix-arg 10)) ;;
    (call-interactively 'enlarge-window) ;;
    )
  (split-window-horizontally) ;;
  (next-multiframe-window)
  (split-window-vertically) 
  (previous-multiframe-window)
)

Tôi hy vọng giải pháp đó sẽ giúp

Làm thế nào để bạn lưu trữ một cấu hình cửa sổ (bao gồm bất kỳ số lượng cửa sổ và bộ đệm) và "dán" cấu hình được lưu trữ vào một cửa sổ hiện có?

Chỉ cần tìm thấy một gói có tên layout.el , tôi chưa bao giờ sử dụng nó nhưng dường như đó là những gì bạn đang tìm kiếm, bạn sẽ cho chúng tôi biết nếu ok.

BIÊN TẬP:

Cố gắng tìm một giải pháp chung chung hơn, có vẻ như bạn có thể sử dụng M-x switch-to-buffer-other-frameđể đi từ bộ đệm trong khung, giả sử với bố cục X, đến bộ đệm khác trong khung khác có bố cục Y.

Bạn cũng có thể ở trong bố cục X, lưu trữ bố cục này trong một thanh ghi C-x r f(cấu hình khung để đăng ký), chuyển sang bố cục khác và khi cần thiết, hãy quay lại vị trí trước đó, gọi những gì bên trong thanh ghi với C-x r j (jump- đăng ký)


Theo như tôi có thể nói layout.elthì thực hiện một điều tương tự như winner: (re) lưu trữ cấu hình cửa sổ của khung hoàn chỉnh, không lưu cấu hình hoàn chỉnh và khôi phục nó vào một cửa sổ hiện có. Mặt khác, chức năng bạn viết không phải là giải pháp chung mà tôi đang tìm kiếm. Họ giải quyết ví dụ thứ hai của tôi, đây không phải là vấn đề cụ thể mà chỉ là một ví dụ. Tôi đang tìm kiếm một giải pháp hoạt động trong trường hợp chung.
elemakil

Vẫn đang đào và tôi nghĩ giải pháp chung có thể là switch-to-buffer-other-framenếu 'từ' là một khung và 'đến' là một khung khác
Nsukami _
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.