Как заставить 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))))))
Ответы
Ответ 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
, как вы хотите.