Как заставить Emacs не отображать буфер в определенном окне?

Моя конфигурация Windows выглядит так:

          +----------+-----------+
      |          |           |
      |          |           |
      |          |           |
      |          |           |
      |          |           |
      |          +-----------+
      |          |           |
      +----------+-----------+

И я использую нижнее правое окно для специальных отображений (таких как справка, завершение и т. д.), но emacs настаивает на использовании этого окна, когда я вызываю команды (find-file-other-window и т. д.), которые используют display-buffer, а также изменяю размер этого окна. Это раздражает... Есть ли способ заставить emacs НЕ использовать эти окна? Я думал посоветовать display-buffer, но это функция в c. Есть мысли по этому поводу?

ИЗМЕНИТЬ:

Основываясь на ответе Трея, это то, что работает для меня до сих пор:

(setq special-display-function 'my-display-buffer)
(setq special-display-regexps '(".*"))

(defun display-special-buffer (buf)
  "put the special buffers in the right spot (bottom rigt)"
    (let ((target-window (window-at (- (frame-width) 4) (- (frame-height) 4)))
          (pop-up-windows t))
      (set-window-buffer target-window buf)
      target-window))

(defun my-display-buffer (buf)
  "put all buffers in a window other than the one in the bottom right"
  (message (buffer-name  buf))
  (if (member (buffer-name buf) special-display-buffer-names)
      (display-special-buffer buf)
      (progn
        (let ((pop-up-windows t)
              (windows (delete (window-at (- (frame-width) 4) (- (frame-height) 4))
                         (delete (minibuffer-window) (window-list)))))
          (message (buffer-name (window-buffer (car windows))))
          (set-window-buffer (car (cdr windows)) buf)
          (car (cdr windows))))))

person polyglot    schedule 16.06.2009    source источник


Ответы (4)


Ну, кто-то уже задал тот же вопрос для завершения . И я написал ответ это сработало очень хорошо.

Похоже, вы могли бы использовать то же самое решение, за исключением того, что вместо добавления к special-display-buffer-names вы можете использовать переменную special-display-regexps. Итак, что-то вроде:

(add-to-list 'special-display-regexps '(".*" my-display-buffers))

(defun my-display-buffers (buf)
  "put all buffers in a window other than the one in the bottom right"
  (let ((windows (delete (window-at (- (frame-width) 2) (- (frame-height) 4))
                         (delete (minibuffer-window) (window-list))))
    (if (<= 2 (length windows))
        (progn 
          (select-window (cadr windows))
          (split-window-vertically)))
    (let ((pop-up-windows t))
      (set-window-buffer (car windows) buf)
      (car windows)))))

Очевидно, вам придется изменить регулярное выражение, чтобы оно не соответствовало *Help* и другим буферам, которые вам действительно нужны в правом нижнем окне.

Что касается совета display-buffer, это сработает. Вы можете посоветовать функции, написанные на c, совет работает почти во всех случаях, когда вы захотите, за исключением случаев, когда функции вызываются из c, или советовать макросы (что не работает, потому что макросы обычно уже расширены везде, где они используются).

person Trey Jackson    schedule 16.06.2009
comment
Я видел другой вопрос и действительно использовал ваше решение; но мой вопрос не тот. Я прошу не о том, чтобы заставить emacs использовать окно, а о том, чтобы emacs НЕ использовал конкретное окно. - person polyglot; 16.06.2009
comment
Правильно, я не думаю, что Emacs имеет возможность исключать окна, поэтому вам придется использовать модифицированную версию, чтобы исключить нижнее правое окно из списка окон. Я заметил, что забыл сделать это в спешке вырезания / вставки, дайте мне обновить это. - person Trey Jackson; 16.06.2009
comment
Когда вы делаете (автомобильные окна), он фактически возвращает текущие окна. Но (автомобиль (cdr windows)) будет работать отлично. Также (- (frame-height) 2) иногда вместо него находит мини-буфер (поскольку он иногда расширяется до 2 строк), поэтому я использую 4 вместо 2. - person polyglot; 20.06.2009
comment
Я задаю здесь тот же вопрос Это решение. Спасибо! - person swdev; 09.02.2011
comment
if: привязки `let' могут иметь только одну форму значения: if, (‹= 2 (длинные окна)), (progn (выбрать-окно (кадровые окна)) (разделить-окно-по вертикали)) - person lawlist; 29.08.2013

Возможно, что-то вроде этого могло бы работать:

(defun display-buffer-avoiding-lr-corner (buffer &optional not-this-window)
  (save-selected-window
    (when (buffer-file-name buffer)
      (select-window (window-at (- (frame-width) 1)
                                (- (frame-height) 2))))
    (let ((display-buffer-function nil))
      (display-buffer buffer not-this-window))))

(setq display-buffer-function 'display-buffer-avoiding-lr-corner)
person huaiyuan    schedule 16.06.2009

Думал посоветовать display-buffer, но это функция в c.

"display-buffer is an interactive Lisp function in `window.el'."

Кроме того, вы все равно можете посоветовать функции C.

person jrockway    schedule 16.06.2009
comment
Мой emacs говорит, что display-buffer - это интерактивная встроенная функция в "исходном коде C". Различия версий, может быть? - person polyglot; 17.06.2009

Возможно, вам имеет смысл сделать это нижнее правое окно посвященным set-window-dedicated-p. Тогда это окно будет игнорироваться в операциях типа find-file-other-window как хотите.

person V_V    schedule 24.04.2012