Подтвердить что ты не робот

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

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

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

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

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))))))
4b9b3361

Ответ 1

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

Похоже, вы можете использовать это же решение, но вместо добавления в 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)))))

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

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

Ответ 2

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

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

Ответ 3

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

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

Кроме того, вы можете в любом случае рекомендовать C-функции.

Ответ 4

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