Как заставить Emacs не отображать буфер в определенном окне? - PullRequest
18 голосов
/ 16 июня 2009

Моя конфигурация Windows выглядит следующим образом:

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

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

EDIT:

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

(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))))))

Ответы [ 4 ]

18 голосов
/ 16 июня 2009

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

Похоже, вы могли бы использовать то же решение, за исключением того, что вместо добавления к 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, advice работает практически во всех случаях, которые вам нужны, за исключением случаев, когда функции называются из c, или рекомендации макросов (которые не работают, поскольку макросы обычно уже расширяется везде, где они используются).

3 голосов
/ 16 июня 2009

Возможно, что-то подобное может сработать:

(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)
2 голосов
/ 24 апреля 2012

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

2 голосов
/ 17 июня 2009

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

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

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

...