¿Cómo forzar a Emacs a no mostrar el búfer en una ventana específica?
lisp elisp (4)
Estaba pensando en recomendar display-buffer, pero es una función en c.
"display-buffer is an interactive Lisp function in `window.el''."
Además, puedes aconsejar funciones C de todos modos.
Mi configuración de Windows se ve así:
+----------+-----------+
| | |
| | |
| | |
| | |
| | |
| +-----------+
| | |
+----------+-----------+
Y uso la ventana inferior derecha para pantallas especiales (como ayuda, finalización, etc.), pero emacs insiste en usar esa ventana cuando llamo comandos ( find-file-other-window
, etc.) que usan display-buffer
y cambian el tamaño Esa ventana también. Es molesto ... ¿Hay alguna manera de forzar a emacs a NO usar esas ventanas? Estaba pensando en recomendar display-buffer
, pero es una función en c. Tiene alguna idea sobre esto?
EDITAR:
Basado en gran medida en la respuesta de Trey, esto es lo que me funciona hasta ahora:
(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))))))
Bueno, alguien ya hizo la misma pregunta para completar . Y escribí una answer que parecía funcionar bastante bien.
Parece que podría usar esa misma solución, excepto que en lugar de agregar special-display-buffer-names
, puede usar la variable special-display-regexps
. Así que algo a lo largo de las líneas de:
(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)))))
Obviamente, tendrá que modificar la expresión regular para que no coincida con la *Help*
y otros buffers que realmente desea en la ventana inferior derecha.
En cuanto a aconsejar display-buffer
, eso funcionaría. Puede recomendar funciones escritas en c, las recomendaciones funcionan en casi todos los casos que desee, excepto cuando las funciones se llaman desde c, o avisar de macros (que no funciona porque las macros generalmente ya están expandidas en todos los lugares en que se usan ).
Quizás algo como esto podría funcionar:
(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)
Tal vez tenga sentido para usted hacer que esta ventana inferior derecha sea dedicada por set-window-dedicated-p
. Entonces esta ventana se ignorará en las operaciones como find-file-other-window
que desee.