Emacs'i Tamponları Yan Yana Bölecek Şekilde Ayarlama


92

Birçok Emacs işlevi ekranı otomatik olarak böler. Ancak, hepsi pencereler üst üste gelecek şekilde yapar. Bunun yerine varsayılan olarak yan yana olacak şekilde onları bölmenin bir yolu var mı?


12
Bu soruda yatay ve dikey kullanımını değiştirirdim - varsayılan davranışın yatay olarak bölmek olduğunu söyleyebilirim (bölme, ekran boyunca yatay bir çizgidir).
Skilldrick

22
Cx 3, yan yana pencereler veren komut için pencereyi yatay olarak böl komutunu çalıştırır, yani ben de aynısını kullanıyorum.
Nikwin

@Skilldrick "Dikey" ve "yatay" belirsizdir ve farklı şekilde yorumlanabilir; bölenin nasıl yönlendirildiğini veya bölümlerin nasıl yönlendirildiğini açıklayabilirler. Benim normal eğilimim, orijinal sorunun ifadesine katılmaktır (yani, normal olarak "dikey olarak bölmeyi" "dikey alanı bölmek" olarak yorumlardım).
jamesdlin

Yanıtlar:


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

GNU Emacs Lisp Referans Kılavuzu: Pencere Seçeneklerini Seçme


8
Bunların, bölme-tercih edilen-pencere işlevini nasıl etkiledikleri ve pencere bölme mantıklı işlevi nedeniyle işe yaradığını unutmayın - bunun için belgeleri okursanız, ayarlanan bu değişkenlerin şeyleri nasıl etkilediğini öğrenebilirsiniz. Varsayılan olarak dikey bölmeyi tercih edenler için, sistemin pencereleri yatay olarak bölmesine izin vermeyen (setq split-width-eşiği nil) kullanabiliriz.
Kendall Helmstetter Gelner

5
Belgeleri okuduktan ve biraz oynadıktan sonra, split-height-eşiği sıfıra ve split-width-eşiği 80'e ayarladım, böylece önce yatay olarak bölünüp bölünemeyeceğini görecek ve sonra sadece dikey olarak deneyecek. Sadece dikey olarak bölünmesi, pencereler daraldıkça çirkinleşir.
Nikwin

Bu çok mantıklı geliyor. Ancak bu, emacs'deki GDB / GUD entegrasyonu için çalışmıyor. Tek bir pencerem varsa ve hata ayıklayıcıyı başlatırsam, emacs her zaman dikey olarak bölünür. Bunun için GUD / GDB'ye özgü herhangi bir ayar var mı?
mefiX

@Nikwin: Benim durumumda, bu çözüm "Cx 4 b" yi yan yana iki 80 sütunlu pencere ile sınırlandırıyor (mevcut ekran gayrimenkulüm ancak bu kadarına sığabilir). "Cx 4 b" yi ikinci kez çağırmak, dikey olarak bölünmüş yeni bir "diğer" pencere açmaz. Bunun yerine, mevcut "diğer" pencerede arabelleği açar. Tarif ettiğiniz gibi davranmasını nasıl sağlayabilirim (yatay olarak, sonra dikey olarak)?
avendael

Bu tanıdığım Cx formatında değil. Bu komutları nasıl çalıştırırım?
user1552512

8

Burada iki çözüm var, beğendiğiniz birini kullanın:

A: Varsayılan olarak dikey (sol / sağ):

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

B: Mevcut pencere yeterince genişse pencereyi otomatik olarak dikey olarak (sol / sağ) bölün

(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.elDosyanıza herhangi birini koyun . Ekranınıza bağlı olarak "100" değerini istediğiniz değere değiştirebilirsiniz.

Bir çerçevede iki pencereniz varsa ve düzeni dikeyden yataya veya tersine değiştirmek istiyorsanız, işte bir çözüm:

(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.elDosyanıza koyun C-x 4 t, pencerelerinizin düzenini değiştirmek için kullanın .


Baskı kullanırken çözüm görünümünde arabelleği undo-treesıkıştırmıyorq
alper

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

istenen davranışı elde etmek için kullanmam gereken şeydi (yatay bölme yok)



1

2 değişkeni sıfır ve 0 olarak ayarlamanın basit cevabı benim için işe yaramadı, bu yüzden 2 basit işlev yazdım: biri pencereyi NX dikey tamponlara böler ve (örneğin) file.1 dosya adlı dosyaları açar. 2 .. . file.NX her birinde ve diğerinde aynı şeyi düşünüyor, ancak 2D'de yapmıyor (NY, f.1 f.2 ... f. [NX * NY] dosyalarını açmak için NX sütunlarına göre NY satırları)). Yüklemek için bu kodu .emacs'e ekleyin:

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

ve sonra dikey olanı kullanmak için, * çizik * ( C-x b *scratch* RET, C-x 1) 'e gidiyorum , (grid-files-h 3 20 "file.")sonra C-x C-eyazıyorum ya da kare qrid olanı test etmek istiyorsanız C-x 1, yazın (grid-files-sq 2 15 3 20 "f.")ve sonra şöyle bir C-x C-eşey görmelisiniz: 2x3 ızgara

Bu muhtemelen daha iyi / daha verimli bir şekilde yapılabilir, ancak bu bir başlangıç ​​ve benim yapmam gerekeni yapıyor (sıralı olarak adlandırılmış küçük dosyaları görüntüleyin). İyileştirmekten veya yeniden kullanmaktan çekinmeyin.


1

Farklı projeler için düzenli olarak emacs'de birden çok çerçeve (OSX pencereleri) kullanıyorum. İşte başlangıçta sol ve sağ pencereye bölünmüş birkaç kareyi nasıl kurduğum.

  (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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.