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?
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?
Câu trả lời:
(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ổ
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.el
tệ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.el
tệ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.
undo-tree
cách nhấn q
không sử dụng bộ đệm
Đôi khi chúng ta cần thay đổi giữa Ngang và Dọc theo màn hình hiện tại và yêu cầu của chúng tôi (nhiều dòng hơn hoặc nhiều cột hơn).
Tôi khuyến khích ToggleWindowSplit tuyệt vời và tôi liên kết khóa với "Cc y"
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 1
hãy nhập (grid-files-sq 2 15 3 20 "f.")
và sau đó C-x C-e
bạn sẽ thấy một cái gì đó như
Đ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.
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")