2012-06-15 12 views
12

Ich möchte automatisch den Kompilierungspuffer schließen, wenn es keinen Fehler und keine Warnung gibt, aber ich möchte es zeigen, wenn es Warnungen gibt. Kann mir jemand helfen? Dieser Code von emacswiki nur die erste Anforderung. Wie man es ändert?emacs kompilieren Puffer automatisch schließen?

;; Helper for compilation. Close the compilation window if 
    ;; there was no error at all. 
    (defun compilation-exit-autoclose (status code msg) 
    ;; If M-x compile exists with a 0 
    (when (and (eq status 'exit) (zerop code)) 
     ;; then bury the *compilation* buffer, so that C-x b doesn't go there 
     (bury-buffer) 
     ;; and delete the *compilation* window 
     (delete-window (get-buffer-window (get-buffer "*compilation*")))) 
    ;; Always return the anticipated result of compilation-exit-message-function 
    (cons msg code)) 
    ;; Specify my function (maybe I should have done a lambda function) 
    (setq compilation-exit-message-function 'compilation-exit-autoclose) 
+0

Was kompilieren Sie? – Thomas

+0

@Thomas das ist nicht das Schlüsselproblem – Iceman

+1

Es könnte nützlich sein zu wissen, welchen Compiler Sie ausführen, weil Sie möglicherweise den 'msg' Parameter verwenden können, um zu überprüfen, ob es Fehler oder Warnungen gibt. – Thomas

Antwort

15

Ich verwende Folgendes für die Kompilierung. Es behält den Kompilierungspuffer bei, wenn Warnungen oder Fehler vorliegen, und vergräbt es andernfalls (nach 1 Sekunde).

(defun bury-compile-buffer-if-successful (buffer string) 
"Bury a compilation buffer if succeeded without warnings " 
(when (and 
     (buffer-live-p buffer) 
     (string-match "compilation" (buffer-name buffer)) 
     (string-match "finished" string) 
     (not 
      (with-current-buffer buffer 
      (goto-char (point-min)) 
      (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) 
+0

gut, es funktioniert, vielleicht werde ich den Timer entfernen. – Iceman

+0

das ist cool, aber warum lässt es das Fenster offen, nachdem der Kompilierungspuffer schließt? dieses Fenster bleibt dann geöffnet, bis ich den Cursor bewege, dann schließt es sich plötzlich. Was verursacht dieses Verhalten? – johnbakers

+0

@johnbakers: Weil es nur den Puffer im Fenster wechselt und das Fensterlayout unverändert lässt. Ich mag es im Allgemeinen nicht, wenn Emacs mein Fensterlayout ändert. Versuchen Sie, mit 'delete-windows-on' anstelle von' switch-to-prev-buffer' zu spielen. – jpkotta

2

jpkotta, es funktioniert die meiste Zeit. Manchmal, auch wenn eine Warnung angezeigt wird, wird nicht in den Kompilierungspuffer gewechselt. So habe ich eine Änderung an Ihrem Formular gemacht & es funktioniert jetzt:

(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 
      **(goto-char 1)** 
      (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) 
+0

Danke, ich habe meine Antwort aktualisiert. – jpkotta

Verwandte Themen