Antworten:
Vor Jahren habe ich auf dem IRC-Kanal #emacs diesen Code bekommen, den ich schon immer verwendet habe. Der Wert "2 sec" legt fest, wie lange das erfolgreiche Zusammenstellungsfenster sichtbar bleibt.
; 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!")))))
Wenn Sie sich den Code (in der Bibliothek compile.el
) schnell ansehen , sollten Sie in der Lage sein, den angezeigten Puffer mit einer Funktion aufgelegt zu löschen oder zu verbergen compilation-finish-functions
. Verwenden Sie dazu etwa Folgendes:
(add-hook 'compilation-finish-functions (lambda (buf strg) (kill-buffer buf))
Wenn Sie den Puffer nicht löschen möchten, verwenden Sie Folgendes:
(add-hook 'compilation-finish-functions
(lambda (buf strg)
(let ((win (get-buffer-window buf 'visible)))
(when win (delete-window win)))))
Im Allgemeinen können Sie sich vorstellen, dass für so etwas wahrscheinlich bereits ein Haken vorhanden ist, sodass Sie Code problemlos an einer so wichtigen Stelle in der Verarbeitung anhängen können. Wenn Sie den Code ein wenig durchstöbern oder verwenden, M-x apropos
werden Sie in der Regel schnell informiert. Die Namen von Hooks enden normalerweise mit -hook
oder -functions
.
Dieser Thread ist auch relevant, falls jemand interessiert ist:
/programming/11043004/emacs-compile-buffer-auto-close
Der Kredit geht an den Originalautor jpkotta . Hier ist seine Antwort:
Ich benutze die folgenden für die Kompilierung. Es behält den Kompilierungspuffer bei, wenn Warnungen oder Fehler vorliegen, und vergräbt ihn anderweitig (nach 1 Sekunde).
(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)
Ich habe diesen Ausschnitt in meinem .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))))))