代码之家  ›  专栏  ›  技术社区  ›  Nikwin

将Emacs设置为并排拆分缓冲区

  •  88
  • Nikwin  · 技术社区  · 16 年前

    6 回复  |  直到 7 年前
        1
  •  96
  •   Eric Drechsel    10 年前
    (setq split-height-threshold nil)
    (setq split-width-threshold 0)
    

    GNU Emacs Lisp参考手册: Choosing Window Options

        2
  •  8
  •   CodyChan    12 年前

    这里有两种解决方案,您可以使用任意一种:

    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 切换窗口的布局。

        3
  •  4
  •   CoolBeans Jake    14 年前
    (setq split-height-threshold 0) (setq split-width-threshold 0)
    

    是我必须使用的,以获得所需的行为(无水平分割)

        4
  •  4
  •   whunmr    13 年前

    有时,我们需要根据当前显示和我们的要求(更多行或更多列)在水平和垂直之间进行更改。

    我推荐伟大的 ToggleWindowSplit

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

        5
  •  1
  •   alexey    14 年前

    将2个变量设置为nil和0的简单答案对我来说不起作用,因此我编写了2个简单的函数:一个函数将窗口拆分为NX垂直缓冲区,并打开名为file.1 file.2的文件(例如)。。。每个文件中的file.NX和另一个文件中的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)
              )
            )
          )
    

    然后要使用垂直的,我去“刮擦”( C-x b *scratch* RET C-x 1 ),输入 (grid-files-h 3 20 "file.") 然后 C-x C-e ,或者如果要测试方形qrid, ,输入 (grid-files-sq 2 15 3 20 "f.") 然后 C-x C-e 你应该看到类似的东西 2x3 grid

    这可能可以做得更好/更有效,但这是一个开始,它做了我需要它做的事情(显示一组按顺序命名的小文件)。请随意改进或重用。

        6
  •  1
  •   Jason    11 年前

    我经常在emacs中为不同的项目使用多个框架(OSX窗口)。下面是我如何设置一些帧,最初将其拆分为左窗口和右窗口。

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