มันน่ารำคาญที่เห็นหน้าต่างการคอมไพล์ปรากฏขึ้นเมื่อมันสำเร็จ วิธีลบโดยอัตโนมัติ
ฉันต้องการเห็นมันแม้ว่าจะไม่ประสบความสำเร็จ
มันน่ารำคาญที่เห็นหน้าต่างการคอมไพล์ปรากฏขึ้นเมื่อมันสำเร็จ วิธีลบโดยอัตโนมัติ
ฉันต้องการเห็นมันแม้ว่าจะไม่ประสบความสำเร็จ
คำตอบ:
หลายปีที่ผ่านมาใน #emacs IRC channel ฉันได้รับรหัสนี้มาตลอด ค่า "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
), 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))))))