Mengatur Emacs ke Split Buffer Berdampingan

92

Banyak fungsi Emacs yang secara otomatis membagi layar. Namun, mereka semua melakukannya sedemikian rupa sehingga jendelanya berada satu di atas yang lain. Apakah ada cara untuk membuatnya terpisah sedemikian rupa sehingga mereka berdampingan secara default?

Nikwin
sumber
12
Saya akan menukar penggunaan horizontal dan vertikal dalam pertanyaan ini - Saya akan mengatakan perilaku default adalah membagi secara horizontal (pemisahannya adalah garis horizontal di layar).
Skilldrick
22
Cx 3 menjalankan perintah split-window-horizontal, untuk perintah yang memberikan jendela berdampingan, jadi saya menggunakan yang sama.
Nikwin
@Skilldrick "Vertikal" dan "horizontal" bersifat ambigu dan dapat diartikan berbeda; mereka dapat mendeskripsikan bagaimana orientasi pembagi atau bagaimana orientasi partisi. Kecenderungan normal saya adalah setuju dengan kata-kata dari pertanyaan awal (yaitu, saya biasanya menafsirkan "terpisah secara vertikal" sebagai "memisahkan ruang vertikal").
jamesdlin

Jawaban:

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

GNU Emacs Lisp Reference Manual: Memilih Opsi Jendela

offby1
sumber
8
Perhatikan bahwa ini berfungsi karena bagaimana pengaruhnya terhadap fungsi pilihan-jendela-terpisah dan fungsi-fungsi-jendela-terpisah yang disetel ke - jika Anda membaca dokumen untuk itu, Anda dapat mengetahui bagaimana variabel-variabel ini disetel memengaruhi berbagai hal. Bagi kita yang lebih suka pemisahan vertikal secara default, kita bisa menggunakan (setq split-width-threshold nil) yang tidak memungkinkan sistem untuk membagi jendela secara horizontal.
Kendall Helmstetter Gelner
5
Setelah membaca dokumen dan bermain-main sedikit, saya telah menetapkan split-height-threshold menjadi nil dan split-width-threshold menjadi 80 sehingga pertama-tama akan melihat apakah itu dapat membagi secara horizontal dan baru kemudian mencoba secara vertikal. Hanya membelah secara vertikal seringkali hanya menjadi jelek karena jendela menjadi sempit.
Nikwin
Ini terdengar sangat masuk akal. Namun, ini tidak berfungsi untuk integrasi GDB / GUD di emacs. Jika saya memiliki satu jendela untuk memulai debugger, emacs selalu terpisah secara vertikal. Apakah ada pengaturan khusus GUD / GDB untuk itu?
mefiX
@ Nikwin: Dalam kasus saya, solusi ini membatasi "Cx 4 b" untuk dua jendela 80 kolom secara berdampingan (layar real estat saya saat ini hanya dapat memuat sebanyak itu). Memanggil "Cx 4 b" untuk kedua kalinya tidak akan membuka jendela "lainnya" yang terbelah secara vertikal. Sebaliknya, ini membuka buffer di jendela "lainnya" yang saat ini tersedia. Bagaimana saya bisa membuatnya berperilaku (coba horizontal lalu vertikal) seperti yang Anda jelaskan?
avendael
Ini tidak dalam format Cx sesuatu yang saya tahu. Bagaimana cara menjalankan perintah ini?
pengguna1552512
8

Dua solusi di sini, gunakan salah satu yang Anda suka:

J: Secara vertikal (kiri / kanan) secara default:

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

B: Secara otomatis membagi jendela secara vertikal (kiri / kanan) jika jendela saat ini cukup lebar

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

Taruh siapa pun di .emacs/init.elfile Anda . Anda dapat mengubah "100" ke nilai yang Anda suka, tergantung pada layar Anda.

Jika Anda memiliki dua jendela dalam satu bingkai, dan Anda ingin mengubah tata letak dari vertikal ke horizontal atau sebaliknya, berikut solusinya:

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

Taruh di .emacs/init.elfile Anda , Gunakan C-x 4 tuntuk mengubah tata letak jendela Anda.

CodyChan
sumber
Pada tampilan solusi ketika saya menggunakan undo-treemenekan qtidak menutup buffer
alper
4
(setq split-height-threshold 0) (setq split-width-threshold 0)

adalah apa yang harus saya gunakan untuk mendapatkan perilaku yang diinginkan (tidak ada pemisahan horizontal)

eoj
sumber
1

jawaban sederhana dari pengaturan 2 variabel menjadi nil dan 0 tidak berhasil untuk saya, jadi saya menulis 2 fungsi sederhana: satu hanya membagi jendela menjadi buffer vertikal NX dan membuka file bernama (misalnya) file.1 file.2 .. .file.NX satu sama lain melakukan hal yang sama, kecuali dalam 2D ​​(baris NY oleh kolom NX untuk membuka file f.1 f.2 ... f. [NX * NY]). Untuk menginstal, tambahkan kode ini ke .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)
          )
        )
      )

dan kemudian untuk menggunakan yang vertikal, saya pergi ke * scratch * ( C-x b *scratch* RET, C-x 1), ketik (grid-files-h 3 20 "file.")lalu C-x C-e, atau jika Anda ingin menguji qrid persegi,, C-x 1ketik (grid-files-sq 2 15 3 20 "f.")lalu C-x C-edan Anda akan melihat sesuatu seperti Kotak 2x3

Ini mungkin dapat dilakukan dengan lebih baik / lebih efisien, tetapi ini adalah permulaan dan melakukan apa yang saya perlukan (tampilkan banyak file kecil yang diberi nama secara berurutan). Jangan ragu untuk meningkatkan atau menggunakan kembali.

alexey
sumber
1

Saya menggunakan banyak frame (OSX windows) di emacs secara teratur untuk proyek yang berbeda. Inilah cara saya mengatur beberapa bingkai yang awalnya dibagi ke jendela kiri dan kanan.

  (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")
Jason
sumber