El búfer de proceso de shell asíncrono siempre cambia la disposición de la ventana

8

Frecuentemente lanzo programas externos desde emacs usando M-!, como Firefox o Evince, etc. Cada vez que lo hago, aparece un búfer lleno de resultados para el proceso, que registra cualquier otra cosa que tenga que ver con el arreglo de Windows.

¿Hay alguna manera de enterrar dichos búferes por defecto, para que no tenga que verlos a menos que decida ir a buscarlos?

Steven Arntson
fuente

Respuestas:

11

Como menciono que el comando se ejecuta de forma asincrónica, supongo que se refiere al comando async-shell-commandvinculado a M-&. Puede seguir los consejos en la documentación de async-shell-command(puede leerlo haciendo C-hfasync-shell-commandRET) personalizar de la display-buffer-alistsiguiente manera

(add-to-list 'display-buffer-alist (cons "\\*Async Shell Command\\*.*" (cons #'display-buffer-no-window nil)))

Ahora el búfer utilizado por el comando para mostrar la salida nunca se mostrará.

Iqbal Ansari
fuente
Esto funciona muy bien, gracias. Además, tampoco sabía nada M-&. Estaba usando M-!y luego agregando manualmente &el comando que pasé al shell.
Steven Arntson
4

Emacs tiene una función de propósito general para evitar que cualquier cambio involuntario (o de hecho intencional) en la configuración de la ventana cause problemas.

Añadir (winner-mode 1)a su archivo de inicio. Luego, cuando algo estropea tus ventanas, usa C-c<left>( winner-undo) para restaurarlas. Puede usarlo repetidamente para deshacer cambios en la configuración de múltiples ventanas. C-c<right>( winner-redo) lo regresa a la configuración más reciente.

phils
fuente
Sí, soy un usuario muy entusiasta del modo ganador.
Steven Arntson
4

Aquí está mi configuración. Debería funcionar muy bien si estás en Linux.

(require 'dired-aux)

(defvar dired-filelist-cmd
  '(("vlc" "-L")))

(defun dired-start-process (cmd &optional file-list)
  (interactive
   (let ((files (dired-get-marked-files t current-prefix-arg)))
     (list
      (dired-read-shell-command "& on %s: " current-prefix-arg files)
      files)))
  (start-process
   cmd nil shell-file-name
   shell-command-switch
   (format "nohup 1>/dev/null 2>/dev/null %s \"%s\""
           (if (> (length file-list) 1)
               (format "%s %s" cmd
                       (cadr (assoc cmd dired-filelist-cmd)))
             cmd)
           (mapconcat #'expand-file-name file-list "\" \""))))

(define-key dired-mode-map "r" 'dired-start-process)

No solo ocultará esos molestos búferes cuando, por ejemplo, abra un archivo pdf dired, sino que Evince persistirá incluso si cierra Emacs. También hay una pequeña personalización para poner en cola archivos de video marcados para una lista de reproducción vlc.

abo-abo
fuente
2

Puede suprimir esa ventana para un solo comando en lugar de usar globalmente let

(let ((display-buffer-alist
       (cons (cons "\\*Async Shell Command\\*.*"
                   (cons #'display-buffer-no-window nil))
             display-buffer-alist))) ;; suppress async shell command window
  (async-shell-command command))
killdash9
fuente
Sugiero en (cons NEWTHING display-buffer-alist)lugar de (list NEWTHING)no inhibir completamente la lista original.
phils
Buena sugerencia, implementada.
killdash9