Jawaban:
tahun lalu di saluran IRC #emacs saya mendapatkan sedikit kode yang telah saya gunakan selamanya. Nilai "2 detik" menetapkan jumlah waktu jendela kompilasi yang berhasil tetap terlihat.
; 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!")))))
Melihat cepat pada kode (di pustaka compile.el
), Anda seharusnya bisa membunuh atau menyembunyikan buffer yang ditampilkan dengan menggunakan fungsi pada hook compilation-finish-functions
. Untuk melakukannya, gunakan sesuatu seperti ini:
(add-hook 'compilation-finish-functions (lambda (buf strg) (kill-buffer buf))
Jika Anda tidak ingin membunuh buffer, gunakan sesuatu seperti ini:
(add-hook 'compilation-finish-functions
(lambda (buf strg)
(let ((win (get-buffer-window buf 'visible)))
(when win (delete-window win)))))
Secara umum, Anda dapat membayangkan bahwa untuk sesuatu seperti ini mungkin ada pengait yang sudah disediakan, sehingga Anda dapat dengan mudah melampirkan kode di tempat yang signifikan dalam pemrosesan. Penjelajahan kecil kode atau penggunaan M-x apropos
biasanya akan memberi tahu Anda dengan cepat. Nama kait biasanya diakhiri dengan -hook
atau -functions
.
Utas ini juga relevan, jika seseorang tertarik:
/programming/11043004/emacs-compile-buffer-auto-close
Penghargaan jatuh ke jpkotta penulis asli . Ini jawabannya:
Saya menggunakan yang berikut ini untuk kompilasi. Itu membuat buffer kompilasi jika ada peringatan atau kesalahan, dan menguburnya jika tidak (setelah 1 detik).
(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)
Saya memiliki cuplikan ini di .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))))))