Câu trả lời:
Cách đây nhiều năm trên kênh IRC #emacs tôi đã nhận được đoạn mã này tôi đã sử dụng mãi mãi. Giá trị "2 giây" đặt lượng thời gian cửa sổ biên dịch thành công vẫn hiển thị.
; 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!")))))
Nhìn nhanh vào mã (trong thư viện compile.el
), bạn sẽ có thể chỉ cần giết hoặc ẩn bộ đệm được hiển thị bằng cách sử dụng một hàm trên hook compilation-finish-functions
. Để làm điều đó, sử dụng một cái gì đó như thế này:
(add-hook 'compilation-finish-functions (lambda (buf strg) (kill-buffer buf))
Nếu bạn không muốn giết bộ đệm, thì hãy sử dụng cái gì đó như thế này:
(add-hook 'compilation-finish-functions
(lambda (buf strg)
(let ((win (get-buffer-window buf 'visible)))
(when win (delete-window win)))))
Nói chung, bạn có thể tưởng tượng rằng đối với một cái gì đó như thế này có thể có một cái móc đã được cung cấp, vì vậy bạn có thể dễ dàng đính kèm mã tại một vị trí quan trọng như vậy trong quá trình xử lý. Một chút duyệt mã hoặc sử dụng M-x apropos
thường sẽ nhanh chóng cho bạn biết. Tên của móc thường kết thúc bằng -hook
hoặc -functions
.
Chủ đề này cũng có liên quan, trong trường hợp một số người quan tâm:
/programming/11043004/emacs-compile-buffer-auto-close
Các khoản tín dụng cho tác giả ban đầu jpkotta . Đây là câu trả lời của anh ấy:
Tôi sử dụng sau đây để biên dịch. Nó giữ bộ đệm biên dịch nếu có cảnh báo hoặc lỗi và chôn nó nếu không (sau 1 giây).
(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)
Tôi có đoạn trích này trong .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))))))