답변:
몇 년 전 #emacs IRC 채널에서 영원히 사용했던이 코드를 얻었습니다. "2 초"값은 성공적인 컴파일 창이 표시되는 시간을 설정합니다.
; 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!")))))
라이브러리에서 코드를 빠르게 살펴보면 compile.el
hook 함수를 사용하여 표시된 버퍼를 죽이거나 숨길 수 있습니다 compilation-finish-functions
. 그렇게하려면 다음과 같이 사용하십시오.
(add-hook 'compilation-finish-functions (lambda (buf strg) (kill-buffer buf))
버퍼를 죽이지 않으려면 다음과 같이 사용하십시오.
(add-hook 'compilation-finish-functions
(lambda (buf strg)
(let ((win (get-buffer-window buf 'visible)))
(when win (delete-window win)))))
일반적으로 이와 같은 것을 위해 이미 후크가 제공되어 있다고 생각할 수 있으므로 처리의 중요한 위치에 코드를 쉽게 첨부 할 수 있습니다. 코드를 약간 탐색하거나 사용 M-x apropos
하면 일반적으로 신속하게 알려줍니다. 후크 이름은 일반적으로 -hook
또는로 끝납니다 -functions
.
이 스레드는 관심이있는 경우에도 관련이 있습니다.
/programming/11043004/emacs-compile-buffer-auto-close
크레딧은 원저자 jpkotta에게 전달 됩니다. 그의 대답은 다음과 같습니다.
나는 컴파일을 위해 다음을 사용합니다. 경고 또는 오류가 있으면 컴파일 버퍼를 유지하고 그렇지 않으면 (1 초 후) 묻습니다.
(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)
내 스 니펫이 있습니다 .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))))))