2012-06-15 14 views
12

Voglio chiudere automaticamente il buffer di compilazione quando non ci sono errori e avvisi, ma voglio mostrarlo quando ci sono avvertimenti. Qualcuno può aiutarmi? Questo codice da emacswiki esegue solo il primo requisito. Come cambiarlo?emacs compile buffer auto close?

;; 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

Che cosa stai compilando? – Thomas

+0

@Thomas questo non è il problema chiave – Iceman

+1

Potrebbe essere utile sapere quale compilatore stai usando perché potresti essere in grado di usare il parametro 'msg' per verificare se ci sono errori o avvertimenti. – Thomas

risposta

15

Io uso quanto segue per la compilazione. Mantiene il buffer di compilazione se ci sono avvertimenti o errori e seppellisce altrimenti (dopo 1 secondo).

(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

bene, funziona, forse rimuoverò il timer. – Iceman

+0

questo è interessante, ma perché lascia la finestra aperta dopo la chiusura del buffer di compilazione? questa finestra rimane aperta finché non muovo il cursore, quindi si chiude improvvisamente. cosa causa questo comportamento? – johnbakers

+0

@johnbakers: Perché tutto ciò che fa è cambiare il buffer nella finestra, lasciando invariato il layout della finestra. In genere non mi piace Emacs modificare il layout della mia finestra. Prova a giocare con 'delete-windows-on' invece di' switch-to-prev-buffer'. – jpkotta

2

jpkotta, funziona la maggior parte delle volte. A volte, anche se c'è un avviso, non passa al buffer di compilazione. Quindi ho apportato una modifica al modulo & ora funziona:

(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

Grazie, ho aggiornato la mia risposta. – jpkotta