2010-01-17 32 views
83

Rất nhiều chức năng Emacs sẽ tự động chia màn hình. Tuy nhiên, tất cả đều làm như vậy theo chiều dọc, (tức là, chúng tạo ra hai cửa sổ, một cửa sổ trên đầu kia). Có cách nào để làm cho họ tất cả chia theo chiều ngang (side-by-side) theo mặc định để thay thế?Đặt Emacs Split thành Horizontal

+12

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

+21

C-x 3 chạy lệnh chia cửa sổ theo chiều ngang, cho lệnh cung cấp các cửa sổ cạnh nhau, vì vậy tôi đang sử dụng giống nhau. – Nikwin

+0

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

Trả lời

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

GNU Emacs Lisp Reference Manual: Choosing Window Options

+7

Lưu ý rằng những tác phẩm này vì chúng ảnh hưởng đến chức năng chia đôi cửa sổ ưa thích và chức năng tách cửa sổ được đặt thành - nếu bạn đọc tài liệu, bạn có thể tìm hiểu cách các biến này đượ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 tách dọc theo mặc định, chúng tôi chỉ có thể sử dụng (setq split-width-threshold nil) không cho phép hệ thống chia cửa sổ theo chiều ngang. –

+5

Sau khi đọc lên các tài liệu và chơi xung quanh một chút, tôi đã thiết lập chiều cao-split-ngưỡng thành nil và chiều rộng-split-threshold thành 80 để nó đầu tiên sẽ nhìn thấy nếu nó có thể chia theo chiều ngang và chỉ sau đó thử theo chiều dọc. Có nó chỉ chia theo chiều dọc thường chỉ xấu xí khi cửa sổ trở nên hẹp. – Nikwin

+0

Điều này nghe có vẻ hợp lý. Tuy nhiên, điều này không làm việc cho sự tích hợp GDB/GUD trong các emacs. Nếu tôi có một cửa sổ đơn thì bắt đầu trình gỡ rối, các emac luôn tách nhau theo chiều dọc. Có bất kỳ cài đặt cụ thể GUD/GDB nào cho điều đó không? – mefiX

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

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

1

câu trả lời đơn giản của thiết 2 biến để nil và 0 không làm việc cho tôi, vì vậy tôi đã viết 2 chức năng đơn giản: chỉ chia nhỏ 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 ... tệp.NX trong từng tệp và một tệp khác không suy nghĩ tương tự, ngoại trừ nó trong 2D (NY hàng bởi NX cột f hoặc mở tập tin f.1 f.2 ... f. [NX * NY]). Để cài đặt, 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 một dọc, tôi đi đến * cào * (C-x b *scratch* RET, C-x 1), gõ vào (grid-files-h 3 20 "file.") sau đó C-x C-e, hoặc nếu bạn muốn kiểm tra quảng trường qrid một, C-x 1, gõ (grid-files-sq 2 15 3 20 "f.") và sau đó C-x C-e và bạn sẽ thấy một cái gì đó giống như 2x3 grid

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

3

Đôi khi chúng ta cần thay đổi giữa Ngang và Dọc theo hiển thị hiện tại và yêu cầu của chúng tôi (nhiều dòng hoặc nhiều cột hơn).

Tôi recommand vĩ đại ToggleWindowSplit, Và tôi gắn chìa khóa để "Cc y"

http://www.emacswiki.org/emacs/ToggleWindowSplit

+1

Hoặc [transpose-frame] (https://www.emacswiki.org/emacs/transpose-frame.el), thanh lịch hơn. – xuhdev

4

Hai giải pháp ở đây, sử dụng bất kỳ một trong những bạn thích:

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

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

B: cửa sổ Tự động phân chia theo chiều dọc (trái/phải) nếu cửa sổ hiện tại là 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 bạn .emacs/init.el tệp. 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 hình, và bạn muốn thay đổi cách bố trí từ dọc sang câu ngang hoặc ngược, đâ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ó trong tập tin .emacs/init.el của bạn, Sử dụng C-x 4 t để chuyển đổi bố cục cửa sổ của bạn.

1

Tôi sử dụng nhiều khung (cửa sổ OSX) trong các emacs thường xuyên cho các dự án khác nhau. Dưới đâ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")