Встановлення Emacs розділених буферів поруч


90

Багато функцій Emacs автоматично розділяють екран. Однак усі вони роблять це так, щоб вікна стояли одне над одним. Чи є спосіб змусити їх розділити так, щоб вони замість цього стояли поруч?


12
Я б поміняв місцями використання горизонтального та вертикального в цьому питанні - я б сказав, що поведінка за замовчуванням полягає в горизонтальному розділенні (розділення - це горизонтальна лінія на екрані).
Skilldrick

22
Cx 3 запускає команду split-window-horizontally, для команди, яка дає паралельні вікна, тому я використовую те саме.
Ніквін,

@Skilldrick "Вертикальний" та "Горизонтальний" неоднозначні і можуть трактуватися по-різному; вони могли б описати, як орієнтований дільник або як орієнтовані перегородки. Моя звичайна схильність полягає в тому, щоб погодитися з формулюванням вихідного запитання (тобто я б зазвичай тлумачив "розбити вертикально" як "розбиття вертикального простору").
jamesdlin

Відповіді:


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

Довідковий посібник GNU Emacs Lisp: Вибір параметрів вікна


8
Зверніть увагу, що вони працюють через те, як вони впливають на функцію роздільного вікна, яку надають перевагу, та функцію роздільного вікна, розумно налаштовану на - якщо ви прочитаєте для цього документи, ви зможете дізнатися, як ці змінні, що встановлюються, впливають на речі. Для тих з нас, хто віддає перевагу вертикальному розбиттю за замовчуванням, ми можемо просто використовувати (setq split-width -reshold nil), який не дозволяє системі розбивати вікна по горизонталі.
Kendall Helmstetter Gelner

5
Прочитавши документи та трохи погравши, я встановив поріг split-height-zero на нуль, а порог split-width-80 на 80, так що він спочатку побачить, чи може він розділитися горизонтально, а вже потім спробує вертикально. Маючи його лише вертикальний розкол, часто стає некрасивим, коли вікна стають звужуватися.
Ніквін,

Це звучить дуже правдоподібно. Однак це не працює для інтеграції GDB / GUD в emacs. Якщо у мене є одне вікно, яке запускає налагоджувач, emacs завжди розбивається вертикально. Чи існує якась специфікація GUD / GDB для цього?
mefiX

@Nikwin: У моєму випадку це рішення обмежує "Cx 4 b" двома вікнами із 80 стовпців поряд (моє поточне нерухоме майно може вмістити лише стільки). Виклик "Cx 4 b" вдруге не відкриває нового вертикально розділеного "іншого" вікна. Натомість він відкриває буфер у "іншому" доступному на даний момент вікні. Як я можу змусити його поводитися (спробувати горизонтально, а потім вертикально), як ви описали?
avendael

Це не у звичному для мене форматі Cx, про який я знаю. Як мені виконати ці команди?
user1552512

6

Тут є два рішення, використовуйте будь-яке, яке вам подобається:

В: Вертикально (ліворуч / праворуч) за замовчуванням:

(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для перемикання макета ваших вікон.


З точки зору вирішення , коли я з допомогою undo-treeнатискання qНЕ Cluse буфер
Alper

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

це те, що мені довелося використовувати для отримання бажаної поведінки (без горизонтального розбиття)


4

Іноді нам потрібна зміна між Горизонтальним та Вертикальним відповідно до поточного відображення та нашої вимоги (більше рядків або більше стовпців).

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

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


1
Або транспонуйте рамку , яка є більш елегантною.
xuhdev

1

проста відповідь встановлення 2 змінних на нуль та 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)
          )
        )
      )

а потім, щоб використовувати вертикальний, я переходжу до * scratch * ( C-x b *scratch* RET, C-x 1), введіть (grid-files-h 3 20 "file.")then C-x C-e, або якщо ви хочете протестувати квадратний qrid C-x 1, введіть, (grid-files-sq 2 15 3 20 "f.")а потімC-x C-e і ви побачите щось на зразок Сітка 2х3

Можливо, це можна зробити краще / ефективніше, але це початок, і він робить те, що мені потрібно (відображати купу послідовно названих невеликих файлів). Не соромтеся вдосконалювати або використовувати повторно.


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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.