การตั้งค่า Emacs เป็น Split Buffers แบบเคียงข้างกัน


92

ฟังก์ชัน Emacs จำนวนมากแบ่งหน้าจอโดยอัตโนมัติ อย่างไรก็ตามพวกเขาทั้งหมดทำเช่นนั้นโดยหน้าต่างจะอยู่ด้านบนของหน้าต่างอื่น ๆ มีวิธีใดบ้างที่จะทำให้พวกมันแยกออกเป็นแบบเคียงข้างกันโดยปริยายแทน?


12
ฉันจะสลับการใช้งานแนวนอนและแนวตั้งในคำถามนี้ - ฉันจะบอกว่าพฤติกรรมเริ่มต้นคือการแบ่งตามแนวนอน (การแบ่งเป็นเส้นแนวนอนบนหน้าจอ)
Skilldrick

22
Cx 3 รันคำสั่งแบ่งหน้าต่างตามแนวนอนสำหรับคำสั่งที่ให้หน้าต่างเคียงข้างกันดังนั้นฉันจึงใช้แบบเดียวกัน
Nikwin

@Skilldrick "แนวตั้ง" และ "แนวนอน" มีความคลุมเครือและอาจตีความได้แตกต่างกัน พวกเขาสามารถอธิบายว่าตัวแบ่งมีทิศทางอย่างไรหรือพาร์ติชันมีทิศทางอย่างไร ความชอบปกติของฉันคือเห็นด้วยกับถ้อยคำของคำถามเดิม (นั่นคือโดยปกติฉันจะตีความ "แบ่งในแนวตั้ง" เป็น "การแบ่งช่องว่างแนวตั้ง")
jamesdlin

คำตอบ:


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

คู่มืออ้างอิง GNU Emacs Lisp: การเลือกตัวเลือกหน้าต่าง


8
โปรดทราบว่าสิ่งเหล่านี้ทำงานได้เนื่องจากวิธีที่ส่งผลต่อฟังก์ชันแบ่งหน้าต่างที่ต้องการและฟังก์ชันแบ่งหน้าต่างอย่างสมเหตุสมผลที่ตั้งค่าเป็น - หากคุณอ่านเอกสารเพื่อดูว่าตัวแปรที่ตั้งค่าเหล่านี้ส่งผลต่อสิ่งต่างๆอย่างไร สำหรับพวกเราที่ชอบการแบ่งแนวตั้งโดยค่าเริ่มต้นเราสามารถใช้ (setq split-width-threshold nil) ซึ่งไม่อนุญาตให้ระบบแบ่งหน้าต่างในแนวนอน
Kendall Helmstetter Gelner

5
หลังจากอ่านเอกสารและเล่นไปเรื่อย ๆ ฉันได้ตั้งค่าการแบ่งความสูง - ธรณีประตูเป็นศูนย์และเกณฑ์การแบ่งความกว้างเป็น 80 เพื่อที่ก่อนอื่นจะดูว่าเอกสารสามารถแบ่งตามแนวนอนได้หรือไม่จากนั้นจึงลองในแนวตั้งเท่านั้น การแบ่งตามแนวตั้งเพียงอย่างเดียวมักจะน่าเกลียดเมื่อหน้าต่างแคบลง
Nikwin

ฟังดูน่าเชื่อถือมาก อย่างไรก็ตามสิ่งนี้ใช้ไม่ได้กับการรวม GDB / GUD ใน emacs ถ้าฉันมีหน้าต่างเดียวเพื่อเริ่มการดีบักเกอร์ emacs จะแยกในแนวตั้งเสมอ มีการตั้งค่าเฉพาะ GUD / GDB สำหรับสิ่งนั้นหรือไม่
mefiX

@Nikwin: ในกรณีของฉันโซลูชันนี้ จำกัด "Cx 4 b" ไว้ที่หน้าต่าง 80 คอลัมน์สองบานเคียงข้างกัน (อสังหาริมทรัพย์หน้าจอปัจจุบันของฉันสามารถใส่ได้มากเท่านั้น) การเรียกใช้ "Cx 4 b" เป็นครั้งที่สองจะไม่เปิดหน้าต่าง "อื่น ๆ " ในแนวตั้งใหม่ แต่จะเปิดบัฟเฟอร์ในหน้าต่าง "อื่น ๆ " ที่มีอยู่ในปัจจุบัน ฉันจะทำให้มันทำงานได้อย่างไร (ลองในแนวนอนแล้วก็แนวตั้ง) ตามที่คุณอธิบายไว้
avendael

นี่ไม่ได้อยู่ในรูปแบบ Cx ที่ฉันคุ้นเคย ฉันจะรันคำสั่งเหล่านี้ได้อย่างไร?
user1552512

8

สองวิธีที่นี่ใช้วิธีใดก็ได้ที่คุณต้องการ:

A: ในแนวตั้ง (ซ้าย / ขวา) โดยค่าเริ่มต้น:

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

B: แบ่งหน้าต่างตามแนวตั้งโดยอัตโนมัติ (ซ้าย / ขวา) หากหน้าต่างปัจจุบันกว้างพอ

(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)

ใส่.emacs/init.elไฟล์ใดก็ได้ในไฟล์ของคุณ คุณสามารถเปลี่ยน "100" เป็นค่าที่คุณต้องการได้ขึ้นอยู่กับหน้าจอของคุณ

หากคุณมีสองหน้าต่างในเฟรมเดียวและคุณต้องการเปลี่ยนเลย์เอาต์จากแนวตั้งเป็นแนวนอนหรือรองนี่คือวิธีแก้ปัญหา:

(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)

วางไว้ใน.emacs/init.elไฟล์ของคุณใช้C-x 4 tเพื่อสลับเค้าโครงของหน้าต่างของคุณ


เกี่ยวกับมุมมองการแก้ปัญหาเมื่อผมใช้undo-treeกดqไม่ Cluse บัฟเฟอร์
Alper

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

คือสิ่งที่ฉันต้องใช้เพื่อให้ได้พฤติกรรมที่ต้องการ (ไม่มีการแยกแนวนอน)


4

บางครั้งเราต้องการการเปลี่ยนแปลงระหว่างแนวนอนและแนวตั้งตามการแสดงผลปัจจุบันและความต้องการของเรา (บรรทัดเพิ่มเติมหรือคอลัมน์มากขึ้น)

ฉันแนะนำToggleWindowSplitที่ยอดเยี่ยมและฉันผูกคีย์กับ "Cc y"

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


1
หรือทรานสโพสเฟรมซึ่งมีความหรูหรามากขึ้น
xuhdev

1

คำตอบง่ายๆของการตั้งค่าตัวแปร 2 ตัวเป็นศูนย์และ 0 ไม่ได้ผลสำหรับฉันดังนั้นฉันจึงเขียน 2 ฟังก์ชันง่ายๆ: หนึ่งเพียงแค่แบ่งหน้าต่างออกเป็นบัฟเฟอร์แนวตั้ง NX และเปิดไฟล์ที่ชื่อ (ตัวอย่าง) file.1 ไฟล์ 2 .. . file.NX ในแต่ละอันคิดเหมือนกันยกเว้นทำใน 2D (แถว NY โดยคอลัมน์ NX สำหรับเปิดไฟล์ f.1 f.2 ... f. [NX * NY]) ในการติดตั้งให้เพิ่มรหัสนี้ใน. 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)
          )
        )
      )

จากนั้นใช้แนวตั้งฉันไปที่ * scratch * ( C-x b *scratch* RET, C-x 1) พิมพ์(grid-files-h 3 20 "file.")จากนั้นC-x C-eหรือถ้าคุณต้องการทดสอบ qrid สี่เหลี่ยมจัตุรัสC-x 1พิมพ์(grid-files-sq 2 15 3 20 "f.")แล้วC-x C-eคุณจะเห็นสิ่งที่ต้องการ 2x3 ตาราง

สิ่งนี้อาจทำได้ดีขึ้น / มีประสิทธิภาพมากขึ้น แต่เป็นการเริ่มต้นและทำในสิ่งที่ฉันต้องทำ (แสดงไฟล์ขนาดเล็กที่มีชื่อตามลำดับจำนวนมาก) อย่าลังเลที่จะปรับปรุงหรือนำกลับมาใช้ใหม่


1

ฉันใช้หลายเฟรม (OSX windows) ใน emacs เป็นประจำสำหรับโปรเจ็กต์ต่างๆ นี่คือวิธีที่ฉันตั้งค่าเฟรมสองสามเฟรมในตอนแรกโดยแบ่งเป็นหน้าต่างซ้ายและขวา

  (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")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.