Risposte:
anni fa sul canale IRC #emacs ho ricevuto questo codice che uso da sempre. Il valore "2 sec" imposta la quantità di tempo in cui la finestra della compilation eseguita correttamente rimane visibile.
; from enberg on #emacs
(setq compilation-finish-function
(lambda (buf str)
(if (null (string-match ".*exited abnormally.*" str))
;;no errors, make the compilation window go away in a few seconds
(progn
(run-at-time
"2 sec" nil 'delete-windows-on
(get-buffer-create "*compilation*"))
(message "No Compilation Errors!")))))
Guardando rapidamente il codice (nella libreria compile.el
), dovresti essere in grado di uccidere o nascondere il buffer visualizzato usando una funzione agganciata compilation-finish-functions
. Per farlo, usa qualcosa del genere:
(add-hook 'compilation-finish-functions (lambda (buf strg) (kill-buffer buf))
Se non vuoi uccidere il buffer, usa qualcosa del genere:
(add-hook 'compilation-finish-functions
(lambda (buf strg)
(let ((win (get-buffer-window buf 'visible)))
(when win (delete-window win)))))
In generale, puoi immaginare che per qualcosa del genere sia probabilmente già presente un hook, quindi puoi facilmente collegare il codice in un punto così significativo dell'elaborazione. Un po 'di navigazione del codice o l'utilizzo M-x apropos
in genere ti farà sapere rapidamente. I nomi degli hook in genere terminano con -hook
o -functions
.
Questo thread è anche rilevante, nel caso qualcuno fosse interessato:
/programming/11043004/emacs-compile-buffer-auto-close
Il merito va all'autore originale jpkotta . Ecco la sua risposta:
Uso quanto segue per la compilazione. Mantiene il buffer di compilazione se ci sono avvisi o errori e lo seppellisce altrimenti (dopo 1 secondo).
(defun bury-compile-buffer-if-successful (buffer string) "Bury a compilation buffer if succeeded without warnings " (if (and (string-match "compilation" (buffer-name buffer)) (string-match "finished" string) (not (with-current-buffer buffer (search-forward "warning" nil t)))) (run-with-timer 1 nil (lambda (buf) (bury-buffer buf) (switch-to-prev-buffer (get-buffer-window buf) 'kill)) buffer))) (add-hook 'compilation-finish-functions 'bury-compile-buffer-if-successful)
Ho questo frammento nel mio .emacs.d
:
(defcustom compilation-auto-quit-window-delay 1
"Time in seconds before auto closing the window."
:group 'compilation
:type 'number)
(defun compilation-auto-quit-window-finish-function (buffer status)
"Quit the *compilation* window if it went well."
(let ((window (get-buffer-window buffer)))
(when (and (equal status "finished\n")
(compilation-went-super-p))
(run-with-timer
(or compilation-auto-quit-window-delay 0) nil
(lambda nil
(when (and (window-live-p window)
(eq (window-buffer window)
buffer)
(not (eq (selected-window)
window)))
(save-selected-window
(quit-window nil window))))))))
(define-minor-mode compilation-auto-quit-window
"Automatically close the *compilation* window if it went well."
:global t
(cond (compilation-auto-quit-window
(add-hook 'compilation-finish-functions
'compilation-auto-quit-window-finish-function))
(t
(remove-hook 'compilation-finish-functions
'compilation-auto-quit-window-finish-function))))
(defun compilation-went-super-p (&optional buffer)
"Return t, if no gotoable output appeared."
(with-current-buffer (or buffer (current-buffer))
(save-excursion
(goto-char (point-min))
(let (;; (compilation-skip-threshold 1)
)
(not (ignore-errors
(compilation-next-error 1)
t))))))