2012-06-15 4 views
12

Я хочу, чтобы автоматическое закрытие буфера компиляции, когда нет ошибки и никакого предупреждения, но я хочу показать его, когда есть предупреждения. Кто-нибудь может мне помочь? Этот код от emacswiki выполняет только первое требование. Как его изменить?emacs compiler 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

Что вы компилируете? – Thomas

+0

@Thomas это не ключевая проблема – Iceman

+1

Возможно, было бы полезно узнать, какой компилятор вы используете, потому что вы можете использовать параметр 'msg', чтобы проверить наличие ошибок или предупреждений. – Thomas

ответ

15

Я использую следующее для компиляции. Он хранит буфер компиляции, если есть предупреждения или ошибки, и зарывает его в противном случае (через 1 секунду).

(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

хорошо, он работает, возможно, я удалю таймер. – Iceman

+0

это круто, но почему он закрывает окно после закрытия буфера компиляции? это окно остается открытым до тех пор, пока я не перемещу курсор, затем он внезапно закрывается. что вызывает такое поведение? – johnbakers

+0

@ johnbakers: Потому что все, что он делает, это переключить буфер в окне, оставив макет окна без изменений. Обычно мне не нравится Emacs менять макет окна. Попробуйте сыграть с 'delete-windows-on' вместо' switch-to-prev-buffer'. – jpkotta

2

jpkotta, он действительно работает большую часть времени. Иногда, даже если есть предупреждение, он не переключается на буфер компиляции. Таким образом, я внес изменения в вашу форму & Теперь он работает:

(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

Спасибо, я обновил свой ответ. – jpkotta