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)