O buffer de processo de shell assíncrono sempre derruba o arranjo da janela

8

Freqüentemente inicio programas externos do emacs usando M-!, como Firefox ou Evince, etc. Sempre que faço, um buffer aparece cheio de resultados para o processo, o que derruba tudo o que tenho em termos de organização do Windows.

Existe uma maneira de enterrar esses buffers por padrão, para que eu não precise vê-los, a menos que decida procurá-los?

Steven Arntson
fonte

Respostas:

11

Desde que mencione que o comando está sendo executado de forma assíncrona, estou assumindo que você quer dizer o comando async-shell-commandvinculado M-&. Você pode seguir o conselho na documentação de async-shell-command(você pode lê-lo fazendo C-hfasync-shell-commandRET) personalizar da display-buffer-alistseguinte maneira

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

Agora, o buffer usado pelo comando para exibir a saída nunca será mostrado.

Iqbal Ansari
fonte
Isso funciona lindamente, obrigado. Além disso, eu também não sabia M-&. Eu estava usando M-!e adicionando manualmente &o comando que passei para o shell.
Steven Arntson
4

O Emacs possui um recurso de uso geral para impedir que alterações na configuração da janela não intencionais (ou mesmo intencionais) causem problemas.

Adicione (winner-mode 1)ao seu arquivo init. Então, quando algo atrapalhar suas janelas, use C-c<left>( winner-undo) para restaurá-las. Você pode usá-lo repetidamente para desfazer várias alterações na configuração da janela. C-c<right>( winner-redo) retorna para a configuração mais recente.

phils
fonte
Sim, sou um usuário muito entusiasmado do Modo Vencedor!
Steven Arntson
4

Aqui está a minha configuração. Deve funcionar muito bem se você estiver no 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)

Ele não apenas oculta esses buffers irritantes quando você abre um arquivo pdf dired, como o Evince persiste mesmo se você fechar o Emacs. Há também uma pequena personalização para enfileirar arquivos de vídeo marcados para uma lista de reprodução vlc.

abo-abo
fonte
2

Você pode suprimir essa janela para um único comando em vez 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
fonte
Sugiro, em (cons NEWTHING display-buffer-alist)vez de (list NEWTHING)não inibir completamente a lista original.
Phill
Boa sugestão, implementada.
killdash9