Слишком много разделенных экранов в Emacs!
С тех пор, как я установил emacs на новую машину, я увидел уродливое поведение. К сожалению, мои старые файлы .emacs довольно фрагментированы, и я не могу определить, имел ли у меня elisp, который позаботился об этом.
Проблема заключается в следующем: когда я выполнял команду, которая открывала новый буфер, такой как grep'ing, или щелкнув имя файла в результатах поиска, произошла одна из двух вещей:
- Если отображается только один буфер, экран будет разбиваться один раз
- Если отображается более одного буфера, окно буфера после текущего окна буфера откроет нужный файл
Я хочу вернуть это поведение. Теперь я получаю следующее:
Emacs будет продолжать разбивать окно, пока не откроются четыре окна буфера. Если я постоянно нажимаю несколько результатов grep, окно буфера, в котором они открываются, циклически проходит через три других (не-grep-results) окна буфера. Я бы хотел, чтобы они просто открывались в том же месте: "следующее" окно буфера рядом/под результатами - одно и то же окно буфера каждый раз.
Любые мысли о том, как добиться такого поведения?
Ответы
Ответ 1
Рассмотрим настройку split-height-threshold
на большее значение, чем высота кадра; что предотвратит нежелательный вертикальный раскол.
(setq split-height-threshold 999)
Если вы предпочитаете вертикальное разделение по горизонтальному расколу, настройте split-width-threshold
вместо этого.
Для более тонкого управления отображением нового буфера настройте display-buffer-function
; что позволит полностью заменить стандартную функцию display-buffer
, которая определяет политику отображения буфера.
Ответ 2
Это то, что я использовал некоторое время:
;;;---------------------------------------------------------------------
;;; display-buffer
;; The default behaviour of `display-buffer' is to always create a new
;; window. As I normally use a large display sporting a number of
;; side-by-side windows, this is a bit obnoxious.
;;
;; The code below will make Emacs reuse existing windows, with the
;; exception that if have a single window open in a large display, it
;; will be split horisontally.
(setq pop-up-windows nil)
(defun my-display-buffer-function (buf not-this-window)
(if (and (not pop-up-frames)
(one-window-p)
(or not-this-window
(not (eq (window-buffer (selected-window)) buf)))
(> (frame-width) 162))
(split-window-horizontally))
;; Note: Some modules sets `pop-up-windows' to t before calling
;; `display-buffer' -- Why, oh, why!
(let ((display-buffer-function nil)
(pop-up-windows nil))
(display-buffer buf not-this-window)))
(setq display-buffer-function 'my-display-buffer-function)
Ответ 3
Я столкнулся с этим при переключении с emacs 22 на 23.
Я обнаружил, что настройка display-buffer-reuse-frames
на non-nil (как предложено справкой для display-buffer
) помогла, если у вас уже открыт файл в буфере.