Ocultar * compilación * ventana

20

Es molesto ver aparecer la ventana de compilación cuando tiene éxito. ¿Cómo eliminar eso automáticamente?

Sin embargo, quiero verlo si no tiene éxito.

Husain
fuente

Respuestas:

11

Hace años en el canal #emacs IRC obtuve este código que he estado usando desde siempre. El valor "2 segundos" establece la cantidad de tiempo que la ventana de compilación exitosa permanece visible.

; 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!")))))
shapr
fuente
14

Mirando rápidamente el código (en la biblioteca compile.el), debería poder simplemente matar u ocultar el búfer mostrado usando una función en el gancho compilation-finish-functions. Para hacer eso, usa algo como esto:

 (add-hook 'compilation-finish-functions (lambda (buf strg) (kill-buffer buf))

Si no quieres matar el búfer, usa algo como esto:

 (add-hook 'compilation-finish-functions
           (lambda (buf strg)
             (let ((win  (get-buffer-window buf 'visible)))
               (when win (delete-window win)))))

En general, puede imaginar que para algo como esto probablemente ya se haya proporcionado un gancho, por lo que puede adjuntar fácilmente el código en un lugar tan significativo en el procesamiento. Una pequeña exploración del código o el uso M-x aproposgeneralmente le informarán rápidamente. Los nombres de los ganchos generalmente terminan en -hooko -functions.

Dibujó
fuente
2

Este hilo también es relevante, en caso de que alguien esté interesado:

/programming/11043004/emacs-compile-buffer-auto-close

El crédito va al autor original jpkotta . Aquí está su respuesta:

Yo uso lo siguiente para la compilación. Mantiene el búfer de compilación si hay advertencias o errores, y lo entierra de otro modo (después de 1 segundo).

(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)
Swarnendu Biswas
fuente
1
Por favor no publique una respuesta que consta de sólo un enlace . Incluya las partes esenciales de la respuesta en su publicación, para que su publicación responda a la pregunta. Proporcione el enlace como fuente y para más información. Para obtener más información, lea nuestras pautas para escribir respuestas .
Gilles 'SO- deja de ser malvado'
Actualicé mi respuesta.
Swarnendu Biswas
Tenga en cuenta que está bien citar la respuesta de otra persona de Stack Exchange , pero debe proporcionar la atribución adecuada , incluido el nombre del autor.
Gilles 'SO- deja de ser malvado'
1

Tengo este fragmento en mi .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))))))
politza
fuente