emacs lisp elisp advising-functions

¿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.