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

92

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

Никвин
источник
12
Я бы поменял местами использование горизонтального и вертикального в этом вопросе - я бы сказал, что поведение по умолчанию - разделение по горизонтали (разделение - это горизонтальная линия на экране).
Skilldrick
22
Cx 3 запускает команду split-window-Horizontally для команды, которая выдает окна бок о бок, поэтому я использую то же самое.
Nikwin
@Skilldrick "Вертикальный" и "горизонтальный" неоднозначны и могут интерпретироваться по-разному; они могли бы описать, как ориентирован разделитель или как ориентированы перегородки. Обычно я склоняюсь к тому, чтобы согласиться с формулировкой исходного вопроса (то есть я обычно интерпретирую «разделить по вертикали» как «разделение вертикального пространства»).
jamesdlin 03

Ответы:

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

Справочное руководство GNU Emacs Lisp: Выбор параметров окна

offby1
источник
8
Обратите внимание, что они работают из-за того, как они влияют на функцию split-window-preferred-function и функцию split-window-senseled, для которой установлено значение - если вы прочитаете документацию по этому поводу, вы можете узнать, как эти устанавливаемые переменные влияют на вещи. Для тех из нас, кто предпочитает вертикальное разделение по умолчанию, мы можем просто использовать (setq split-width-threshold nil), который не позволяет системе разделять окна по горизонтали.
Кендалл Хельмштеттер Гельнер
5
Прочитав документы и немного поигравшись, я установил split-height-threshold равным nil, а split-width-threshold равным 80, чтобы он сначала увидел, может ли он разделиться по горизонтали, и только затем попробовал по вертикали. Разделение только по вертикали часто становится уродливым, поскольку окна становятся суженными.
Nikwin
Это звучит очень правдоподобно. Однако это не работает для интеграции GDB / GUD в emacs. Если у меня есть одно окно для запуска отладчика, emacs всегда разделяется по вертикали. Есть ли для этого какие-нибудь настройки, специфичные для GUD / GDB?
mefiX
@Nikwin: В моем случае это решение ограничивает "Cx 4 b" двумя окнами по 80 столбцов бок о бок (моя текущая площадь экрана может вместить только это количество). Повторный вызов «Cx 4 b» не открывает новое вертикально разделенное окно «другое». Вместо этого он открывает буфер в «другом» доступном в данный момент окне. Как я могу заставить его вести себя (попробуйте горизонтально, а затем вертикально), как вы описали?
Avendael 05
Это не в знакомом мне формате Cx something. Как мне выполнить эти команды?
user1552512 04
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для переключения макета ваших окон.

CodyChan
источник
В представлении решения, когда я использовал undo-treeнажатие q, не указывает на буфер
Альпер
4
(setq split-height-threshold 0) (setq split-width-threshold 0)

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

эой
источник
4

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

Я рекомендую отличный ToggleWindowSplit , и привязываю ключ к "Cc y"

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

Whunmr
источник
1
Или транспонировать рамку , что более элегантно.
xuhdev
1

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

а затем, чтобы использовать вертикальный, я перехожу к * царапинам * ( 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) в 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")
Джейсон
источник