В Emacs открывается слишком много разделенных экранов!

С тех пор, как я установил emacs на новую машину, я заметил уродливое поведение. К сожалению, мои старые файлы .emacs довольно фрагментированы, и я не могу определить, был ли у меня elisp, который позаботился об этом.

Проблема в следующем: раньше, когда я выполнял команду, которая открывала новый буфер, например grep'ing, или щелкала имя файла в результатах поиска, происходило одно из двух:

  1. Если отображается только один буфер, экран разделится один раз.
  2. Если отображается более одного буфера, окно буфера после текущего окна буфера откроет желаемый файл.

Я хочу вернуть это поведение. Теперь я получаю следующее:

Emacs будет разделять окно до тех пор, пока не откроются четыре буферных окна. Если я постоянно щелкаю несколько результатов grep, окно буфера, в котором они открываются, циклически проходит через три других (не относящихся к grep-results) окна буфера. Я бы хотел, чтобы они просто продолжали открываться в одном и том же месте: «следующее» буферное окно рядом с / под результатами - одно и то же буферное окно каждый раз.

Есть мысли о том, как добиться такого поведения?


person user168811    schedule 04.09.2009    source источник
comment
Я тоже этого хочу, новое поведение сводит меня с ума.   -  person Pär Bohrarper    schedule 13.01.2011


Ответы (3)


Рассмотрите возможность установки для split-height-threshold большего значения, чем высота кадра; это предотвратит нежелательное вертикальное разделение.

(setq split-height-threshold 999)

Если вы предпочитаете вертикальное разделение горизонтальному разделению, настройте вместо этого split-width-threshold.

Для более детального управления отображением нового буфера настройте display-buffer-function; это позволит вам полностью заменить функцию display-buffer по умолчанию, которая определяет политику отображения буфера.

person huaiyuan    schedule 05.09.2009
comment
Фактически, установка его в nil - это предписанный способ отключения вертикального разделения ... Если это ноль, "с разумным разделением окна" не разрешается разделять окно по вертикали. Спасибо за указатель! - person blalor; 05.12.2011
comment
+1 за критическое улучшение этого ответа. - person Christopher Smith; 17.09.2014

Вот что я использую некоторое время:

;;;---------------------------------------------------------------------
;;; 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)
person Lindydancer    schedule 07.03.2011
comment
Работает на меня. Одно предостережение заключается в том, что он не обращает внимания на фреймы режима компиляции и держит их открытыми, закрывая другие, более важные. - person jupp0r; 26.08.2014

Я столкнулся с этим при переходе с emacs 22 на 23.

Я обнаружил, что установка display-buffer-reuse-frames на ненулевое значение (как было предложено в справке для display-buffer) помогла, если у вас уже есть файл, открытый в буфере.

person powellrb    schedule 07.03.2011