2

Я хочу добиться следующего, когда в GNU Emacs отображается буфер:

  1. это никогда не должно разбивать мои окна;

  2. если буфер уже открыт в окне, он должен использовать его повторно, в противном случае он должен использовать текущее окно.


Частичное решение

  • установка pop-up-windows на nil решит пункт 1 ;

  • установка same-window-regexps в '("^\*") решит вторую часть пункта 2 , но это в отличие от первого.

2 ответа2

3

Я обнаружил, что можно настроить поведение функции display-buffer , установив переменную display-buffer-function .

Эта функция, кажется, делает то, что я хочу (конечно, она нуждается в некоторой очистке, но она работает):

(defun my-display-buffer (BUFFER-OR-NAME &optional NOT-THIS-WINDOW)
  (catch 'return
    ;; search the buffer in the existing windows
    (let ((windows (window-list)))
      (while (first windows)
        ;; found
        (if (eq (window-buffer (first windows)) BUFFER-OR-NAME)
            (throw 'return
                   ;; if minibuffer doesn't select the window
                   (if (eq (selected-window) (minibuffer-window))
                       (first windows)
                     (select-window (first windows)))))
        ;; next window
        (setq windows (rest windows))))
    ;; otherwise use current
    (if (eq (selected-window) (minibuffer-window))
        ;; if minubuffer
        (progn
          (select-window (minibuffer-selected-window))
          (switch-to-buffer BUFFER-OR-NAME)
          (select-window (minibuffer-window)))
      ;; if regular window
      (progn
        (switch-to-buffer BUFFER-OR-NAME)
        (selected-window)))))
1
  1. (setq pop-up-windows nil) кажется, делает то, что вы хотите.
  2. Я не думаю, что вам нужно много здесь делать. По крайней мере, команды помощи уже демонстрируют это поведение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .