2012-06-15 31 views
12

Hata ve uyarı olmadığında derleme arabelleğini otomatik olarak kapatmak istiyorum, ancak uyarı olduğunda bunu göstermek istiyorum. Bana yardım edebilecek kimse var mı? Bu kod emacswiki'dan sadece ilk gerekliliği yapar. Nasıl değiştirilir?emacs arabellek otomatik kapat?

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

Ne derliyorsunuz? – Thomas

+0

@Thomas bu önemli bir sorun değil. – Iceman

+1

Hangi derleyiciyi çalıştırdığınızı bilmek faydalı olabilir çünkü hata veya uyarı olup olmadığını kontrol etmek için 'msg' parametresini kullanabilirsiniz. – Thomas

cevap

15

Derleme için aşağıdakileri kullanıyorum. Uyarı ya da hata varsa derleme arabelleğini tutar ve aksi halde (1 saniye sonra) gömer.

(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

iyi, işe yarıyor, belki de zamanlayıcıyı kaldıracağım. – Iceman

+0

bu harika, ancak derleme arabelleği kapatıldıktan sonra pencereyi neden açık bırakıyor? Bu pencere imleci hareket ettirene kadar açık kalır, sonra aniden kapanır. Bu davranışa ne sebep olur? – johnbakers

+0

@johnbakers: Çünkü tek yaptığı, pencerede arabelleği değiştirmeden pencere düzenini değiştirmeden değiştirir. Pencere düzenimi değiştirmek için genellikle Emacs'i sevmiyorum. 'Prev-buffer 'yerine' delete-windows-on 'ile oynamayı deneyin. – jpkotta

2

jpkotta, bu kez en çalışır. Bazen, bir uyarı olsa bile, derleme arabelleğine geçmez. Bu yüzden form & bir değişiklik yaptım şimdi çalışır:

(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

Teşekkürler, cevabımı güncelledim. – jpkotta

İlgili konular