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

#emacs #split #grep #buffer

#emacs #разделить #grep #буфер

Вопрос:

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

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

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

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

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

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

Комментарии:

1. Я тоже этого хочу, новое поведение сводит меня с ума.

Ответ №1:

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

 (setq split-height-threshold 999)
  

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

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

Комментарии:

1. На самом деле, установка этого значения в nil — это предписанный способ отключить вертикальное разделение… » Если это значение равно нулю, `split-window-разумно’ не разрешается разделять окно по вертикали. » Спасибо за подсказку!

2. 1 за критическое улучшение blalor в этом ответе.

Ответ №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)
  

Комментарии:

1. У меня работает. Одно предостережение заключается в том, что он не обращает внимания на фреймы в режиме компиляции и сохраняет их открытыми, закрывая другие, более важные.

Ответ №3:

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

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