Настройка Emacs для разделения буферов бок о бок

Многие функции Emacs автоматически разделяют экран. Однако все они делают так, чтобы окна находились друг над другом. Есть ли способ разделить их так, чтобы они по умолчанию были рядом?

Ответ 2

Два решения здесь, используйте любой, который вам нравится:

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 not visible and there 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

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

- это то, что я должен был использовать для получения желаемого поведения (без горизонтального разбиения)

Ответ 4

Иногда нам нужно изменить горизонтальный и вертикальный по текущему дисплею и нашему требованию (больше строк или больше столбцов).

Я рекомендую большой ToggleWindowSplit, и я привязываю ключ к "C-c y"

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

Ответ 5

простой ответ на установку 2 переменных на nil и 0 не работал у меня, поэтому я написал две простые функции: один просто разбил окно на вертикальные буферы 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 grid

Это, вероятно, может быть сделано лучше/эффективнее, но это начало, и он делает то, что мне нужно для этого (отображает кучу последовательно названных небольших файлов). Не стесняйтесь улучшать или повторно использовать.

Ответ 6

Я использую несколько фреймов (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")