Credo che ci siano due modi per risolvere questo problema.
Il primo è quello di utilizzare il gancio ` 'compilazione-rivestimento-funzioni', che è :
[Un elenco di f] unzioni chiamare quando un processo di compilazione termina. Ogni funzione viene chiamata con due argomenti: il buffer di compilazione, e una stringa che descrive come è terminato il processo.
che porta ad una soluzione del genere:
(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))))
L'unico problema che ho con questa soluzione è che esso presuppone che il successo può essere determinato trovando la stringa "finito" nella stringa di risultato.
L'altra alternativa è quella di avvisare 'compilation-handle-exit
- che ottiene esplicitamente lo stato di uscita. Ho scritto questo consiglio che riduce la finestra quando lo stato di uscita è diverso da zero.
(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: se la finestra *compilation*
è ancora visibile quando fate la vostra seconda fase di compilazione, non verrà ridimensionata più grande in caso di errore. Se desideri ridimensionarlo, dovrai specificare un'altezza anziché nil
. Forse questo potrebbe essere di vostro gradimento (cambiando il primo esempio):
(if (string-match-p "finished" resstring) 5 (/ (frame-height) 2))
Il nil
è stato sostituito con (/ (frame-height) 2)
fonte
2010-02-05 06:39:43