Đặt Emacs để tách bộ đệm song song


90

Rất nhiều chức năng Emacs tự động chia đôi màn hình. Tuy nhiên, tất cả chúng đều làm như vậy để các cửa sổ nằm chồng lên nhau. Có cách nào để làm cho chúng được phân chia sao cho chúng nằm cạnh nhau theo mặc định không?


12
Tôi sẽ hoán đổi việc sử dụng ngang và dọc trong câu hỏi này - tôi muốn nói rằng hành vi mặc định là chia theo chiều ngang (phân chia là một đường ngang trên màn hình).
Skilldrick

22
Cx 3 chạy lệnh chia cửa sổ theo chiều ngang, đối với lệnh cung cấp các cửa sổ cạnh nhau, vì vậy tôi đang sử dụng tương tự.
Nikwin

@Skilldrick "Dọc" và "ngang" không rõ ràng và có thể được hiểu khác nhau; họ có thể mô tả cách phân chia được định hướng hoặc cách các phân vùng được định hướng. Xu hướng bình thường của tôi là đồng ý với cách diễn đạt của câu hỏi ban đầu (nghĩa là, tôi thường giải thích "chia theo chiều dọc" là "chia không gian theo chiều dọc").
jamesdlin

Câu trả lời:


92
(setq split-height-threshold nil)
(setq split-width-threshold 0)

Sách hướng dẫn tham khảo GNU Emacs Lisp: Chọn tùy chọn cửa sổ


8
Lưu ý rằng những điều này hoạt động vì chúng ảnh hưởng như thế nào đến chức năng chia cửa sổ-ưu tiên-và chức năng phân tách cửa sổ-hợp lý được đặt thành - nếu bạn đọc tài liệu cho điều đó, bạn có thể tìm hiểu cách các biến này đang được đặt ảnh hưởng đến mọi thứ. Đối với những người trong chúng ta, những người thích chia nhỏ theo chiều dọc theo mặc định, chúng ta chỉ có thể sử dụng (setq split-width -reshold nil) không cho phép hệ thống chia các cửa sổ theo chiều ngang.
Kendall Helmstetter Gelner

5
Sau khi đọc tài liệu và xem xét một chút, tôi đã đặt ngưỡng phân tách-chiều cao thành không và ngưỡng phân tách-chiều rộng thành 80 để trước tiên nó sẽ xem liệu nó có thể phân chia theo chiều ngang hay không và sau đó thử theo chiều dọc. Việc nó chỉ chia theo chiều dọc thường chỉ trở nên xấu xí khi các cửa sổ trở nên thu hẹp.
Nikwin,

Điều này nghe rất hợp lý. Tuy nhiên, điều này không hoạt động đối với tích hợp GDB / GUD trong emac. Nếu tôi có một cửa sổ duy nhất khi khởi động trình gỡ lỗi, các emac luôn phân chia theo chiều dọc. Có bất kỳ cài đặt GUD / GDB cụ thể nào cho điều đó không?
mefiX

@Nikwin: Trong trường hợp của tôi, giải pháp này giới hạn "Cx 4 b" ở hai cửa sổ 80 cột cạnh nhau (bất động sản màn hình hiện tại của tôi chỉ có thể phù hợp với chừng đó). Gọi "Cx 4 b" lần thứ hai không mở ra cửa sổ "khác" được chia theo chiều dọc. Thay vào đó, nó mở ra bộ đệm trên cửa sổ "khác" hiện có sẵn. Làm cách nào tôi có thể làm cho nó hoạt động (thử theo chiều ngang rồi theo chiều dọc) như bạn đã mô tả?
avendael

Đây không phải là định dạng Cx quen thuộc mà tôi biết. Làm cách nào để thực hiện các lệnh này?
dùng1552512

6

Hai giải pháp ở đây, hãy sử dụng bất kỳ giải pháp nào bạn thích:

A: Theo chiều dọc (trái / phải) theo mặc định:

(setq split-height-threshold nil)
(setq split-width-threshold 0)

B: Tự động chia cửa sổ theo chiều dọc (trái / phải) nếu cửa sổ hiện tại đủ rộng

(defun display-new-buffer (buffer force-other-window)
  "If BUFFER is visible, select it.
If it's not visible and there's only one window, split the
current window and select BUFFER in the new window. If the
current window (before the split) is more than 100 columns wide,
split horizontally(left/right), else split vertically(up/down).
If the current buffer contains more than one window, select
BUFFER in the least recently used window.
This function returns the window which holds BUFFER.
FORCE-OTHER-WINDOW is ignored."
  (or (get-buffer-window buffer)
    (if (one-window-p)
        (let ((new-win
               (if (> (window-width) 100)
                   (split-window-horizontally)
                 (split-window-vertically))))
          (set-window-buffer new-win buffer)
          new-win)
      (let ((new-win (get-lru-window)))
        (set-window-buffer new-win buffer)
        new-win))))
;; use display-buffer-alist instead of display-buffer-function if the following line won't work
(setq display-buffer-function 'display-new-buffer)

Đặt bất kỳ cái nào trong .emacs/init.eltệp của bạn . Bạn có thể thay đổi "100" thành giá trị bạn thích, tùy thuộc vào màn hình của bạn.

Nếu bạn có hai cửa sổ trong một khung và bạn muốn thay đổi bố cục từ dọc sang ngang hoặc ngược lại, đây là một giải pháp:

(defun toggle-window-split ()
  (interactive)
    (if (= (count-windows) 2)
      (let* ((this-win-buffer (window-buffer))
            (next-win-buffer (window-buffer (next-window)))
            (this-win-edges (window-edges (selected-window)))
            (next-win-edges (window-edges (next-window)))
            (this-win-2nd
             (not (and (<= (car this-win-edges)
                        (car next-win-edges))
                    (<= (cadr this-win-edges)
                        (cadr next-win-edges)))))
         (splitter
          (if (= (car this-win-edges)
                 (car (window-edges (next-window))))
              'split-window-horizontally
            'split-window-vertically)))
    (delete-other-windows)
    (let ((first-win (selected-window)))
      (funcall splitter)
      (if this-win-2nd (other-window 1))
      (set-window-buffer (selected-window) this-win-buffer)
      (set-window-buffer (next-window) next-win-buffer)
      (select-window first-win)
      (if this-win-2nd (other-window 1))))))
;; C-x 4 t 'toggle-window-split
(define-key ctl-x-4-map "t" 'toggle-window-split)

Đặt nó vào .emacs/init.eltệp của bạn , Sử dụng C-x 4 tđể chuyển đổi bố cục của các cửa sổ của bạn.


Trên chế độ xem giải pháp khi tôi đang sử dụng undo-treecách nhấn qkhông sử dụng bộ đệm
alper

4
(setq split-height-threshold 0) (setq split-width-threshold 0)

là những gì tôi phải sử dụng để có được hành vi mong muốn (không chia tách theo chiều ngang)



1

câu trả lời đơn giản của việc đặt 2 biến thành nil và 0 không phù hợp với tôi, vì vậy tôi đã viết 2 hàm đơn giản: một hàm chỉ tách cửa sổ thành bộ đệm dọc NX và mở tệp có tên (ví dụ) tệp.1 tệp.2 .. . file.NX trong mỗi cái và một cái khác cũng nghĩ như vậy, ngoại trừ nó ở dạng 2D (NY các hàng bởi các cột NX để mở tệp f.1 f.2 ... f. [NX * NY]). Để cài đặt, hãy thêm mã này vào .emacs:

    (defun grid-files-h (nx wx pfx)
  "Using dotimes, split the window into NX side-by-side buffers of width WX and load files starting with prefix PFX and ending in numbers 1 through NX"
  (let (ox fn k)  ; ox is not used, but fn is used to store the filename, and k to store the index string
    (dotimes (x (- nx 1) ox) ; go through buffers, x goes from 0 to nx-2 and ox is not used here
;     (print x)
      (setq k (number-to-string (+ x 1) ) )  ; k is a string that goes from "1" to "nx-1"
;     (print k)
      (setq fn (concat pfx k) ) ; fn is filename - concatenate prefix with k
;     (print fn)
      (find-file fn) ; open the filename in current buffer
      (split-window-horizontally wx) ; split window (current buffer gets wx-columns)
      (other-window 1) ; switch to the next (right) buffer
      )
    (setq k (number-to-string nx )) ; last (rightmost) buffer gets the "nx" file
    (setq fn (concat pfx k) ) ; fn = "pfx"+"nx"
    (find-file fn ) ; open fn
    (other-window 1) ; go back to the first buffer
    )  
  )

   (defun grid-files-sq (ny wy nx wx pfx)
      "Using dotimes, split the window into NX columns of width WX and NY rows of height WY and load files starting with prefix PFX and ending in numbers 1 through NX*NY"
      (let (oy ox fn k)  
        (dotimes (y ny oy) ; go through rows, y goes from 0 to ny-1 and oy is not used here
          (split-window-vertically wy) ; create this row
          (dotimes (x (- nx 1) ox) ; go through columns, x goes from 0 to nx-2 and ox is not used here
        (setq k (number-to-string (+ 1 (+ x (* y nx) ) ) ) ) ; k must convert 2 indecies (x,y) into one linear one (like sub2ind in matlab)
        (setq fn (concat pfx k) ) ; filename
        (find-file fn ) ; open
        (split-window-horizontally wx) ; create this column in this row (this "cell")
        (other-window 1) ; go to the next buffer on the right 
        )
          (setq k (number-to-string (+ nx (* y nx) ) ) ) ; rightmost buffer in this row needs a file too
          (setq fn (concat pfx k) ) ; filename
          (find-file fn ) ; open
          (other-window 1) ; go to next row (one buffer down)
          )
        )
      )

và sau đó để sử dụng phương dọc, tôi đi tới * xước * ( C-x b *scratch* RET, C-x 1), nhập vào (grid-files-h 3 20 "file.")sau đó C-x C-e, hoặc nếu bạn muốn kiểm tra lưới vuông, C-x 1hãy nhập (grid-files-sq 2 15 3 20 "f.")và sau đó C-x C-ebạn sẽ thấy một cái gì đó như Lưới 2x3

Điều này có thể được thực hiện tốt hơn / hiệu quả hơn, nhưng đó là một bước khởi đầu và nó thực hiện những gì tôi cần làm (hiển thị một loạt các tệp nhỏ được đặt tên tuần tự). Hãy cải thiện hoặc sử dụng lại.


1

Tôi thường xuyên sử dụng nhiều khung (cửa sổ OSX) trong emac cho các dự án khác nhau. Đây là cách tôi thiết lập một vài khung hình ban đầu được chia thành cửa sổ bên trái và bên phải.

  (defun make-maximized-split-frame (name)
    (let (( f (make-frame (list (cons 'name  name))) ))
      (maximize-frame f)
      (split-window (frame-root-window f) nil t)
      ))

  (make-maximized-split-frame "DocRaptor")
  (make-maximized-split-frame "Gauges")
  (make-maximized-split-frame "Instrumental")
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.