2009-06-16 8 views
18

Mi configuración de las ventanas se ve así:¿Cómo forzar a Emacs a no mostrar el búfer en una ventana específica?

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

Y uso la ventana inferior derecha para pantallas especiales (como ayuda, terminación, etc.), pero emacs insiste en usar esa ventana cuando llamo comandos (find-file-other-window, etc. .) que usan display-buffer, y cambiar el tamaño de esa ventana también. Es molesto ... ¿Hay alguna manera de forzar a emacs a NO usar esa ventana? Estaba pensando en avisar display-buffer, pero es una función en c. Tiene alguna idea sobre esto?

EDIT:

Basado en gran medida de la respuesta de Trey, esto es lo que funciona para mí 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)))))) 

Respuesta

18

Bueno, alguien ya hizo la same question for completion. Y escribí un answer que parecía funcionar bastante bien.

Parece que podría usar esa misma solución, excepto que en lugar de agregar a 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 que tendrá que modificar la expresión regular para no coincidir con las *Help* y otros tampones que en realidad se desea en la ventana inferior derecha.

Con respecto al asesoramiento display-buffer, eso funcionaría. Puede aconsejar funciones escritas en c, el asesoramiento funciona en casi todos los casos que desee, excepto cuando las funciones son llamadas de c, o asesorar macros (que no funciona b/c, las macros generalmente ya están expandidas en todas partes). re usado).

+0

Vi la otra pregunta y de hecho usé su solución; pero mi pregunta no es la misma No estoy pidiendo forzar a emacs a usar una ventana, sino a emacs para NO usar una ventana específica. – polyglot

+0

Correcto, no creo que Emacs tenga la capacidad de excluir ventanas, por lo que tendrá que usar una versión modificada para excluir la ventana inferior derecha de la lista de ventanas. Noté que olvidé hacer eso en mi apuración de cortar/pegar, déjame actualizar eso. –

+0

Cuando lo hace (ventanas del automóvil), en realidad devuelve las ventanas actuales. Pero (car (cdr windows)) funcionará perfectamente. También (- (frame-height) 2) a veces encuentra el mini-buffer en su lugar (ya que a veces se expande a 2 líneas), así que uso 4 en vez de 2. – polyglot

3

Tal vez 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) 
2

Estaba pensando en asesorar display-buffer, pero es una función de c.

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

Además, se puede aconsejar a funciones C de todos modos.

+0

Mi emacs dice "display-buffer es una función incorporada interactiva en el 'código fuente C'". Diferencias de versión, tal vez? – polyglot

2

Quizás tenga sentido que hagas esta ventana inferior derecha dedicada por set-window-dedicated-p. Entonces esta ventana será ignorada en operaciones como find-file-other-window como lo desee.

Cuestiones relacionadas