#emacs #split #grep #buffer
#emacs #разделить #grep #буфер
Вопрос:
С тех пор, как я установил emacs на новую машину, я наблюдаю уродливое поведение. К сожалению, мои старые файлы .emacs довольно фрагментированы, и я не могу определить, был ли у меня elisp, который позаботился об этом.
Проблема заключается в следующем: раньше, когда я выполнял команду, которая открывала новый буфер, такой как grep-ing, или щелчок по имени файла в результатах поиска, происходило одно из двух:
- Если отображается только один буфер, экран разделится один раз
- Если отображается более одного буфера, окно буфера после текущего окна буфера откроет нужный файл
Я хочу вернуть это поведение. Сейчас я получаю следующее:
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
), помогает, если у вас уже есть файл, открытый в буфере.