2010-02-05 13 views
6

Me gustaría implementar el colapso automático del búfer de compilación a un tamaño pequeño (pero no cerrar en una ventana de eliminación), de modo que al compilar correctamente la ventana se reduzca al tamaño mínimo.emacs cambiar el tamaño de la ventana por programación

get-buffer-create devuelve un búfer. ¿Cómo puedo shrink-window en la ventana asociada con ese buffer? Además, ¿hay alguna manera de almacenar el tamaño de ventana anterior?

Es mi primera incursión en la programación de emacs lisp, gracias por su ayuda.

Respuesta

8

Creo que hay dos formas de resolver este problema.

La primera es utilizar el gancho ` 'de compilación-FINISH-funciones', que es:

[A lista de f] unciones a llamar cuando un proceso de compilación termina. Cada función se invoca con dos argumentos: el búfer de compilación, y una cadena que describe cómo finalizó el proceso.

que conduce a una solución como esta:

(add-hook 'compilation-finish-functions 'my-compilation-finish-function) 
(defun my-compilation-finish-function (buffer resstring) 
    "Shrink the window if the process finished successfully." 
    (let ((compilation-window-height (if (string-match-p "finished" resstring) 5 nil))) 
    (compilation-set-window-height (get-buffer-window buffer 0)))) 

El único problema que tengo con esta solución es que asume que el éxito se puede determinar mediante la búsqueda de la cadena "terminado" en la cadena de resultados.

La otra alternativa es avisar 'compilation-handle-exit - que se pasa explícitamente el estado de salida. Escribí este consejo que encoge la ventana cuando el estado de salida no es cero.

(defadvice compilation-handle-exit (around my-compilation-handle-exit-shrink-height activate) 
    (let ((compilation-window-height (if (zerop (car (ad-get-args 1))) 5 nil))) 
    (compilation-set-window-height (get-buffer-window (current-buffer) 0)) 
    ad-do-it)) 

Nota: si la ventana *compilation* es aún visible cuando usted hace su segunda compilación, no se cambiará el tamaño más grande en caso de fallo. Si desea que se redimensione, deberá especificar una altura en lugar de nil. Tal vez esto sería a su gusto (cambiar el primer ejemplo):

(if (string-match-p "finished" resstring) 5 (/ (frame-height) 2)) 

El nil se reemplazó con (/ (frame-height) 2)

Cuestiones relacionadas