Il buffer di processo della shell asincrona blocca sempre la disposizione delle finestre


8

Lancio frequentemente programmi esterni da emacs usando M-!, come Firefox o Evince, ecc. Ogni volta che lo faccio, viene visualizzato un buffer pieno di risultati per il processo, che blocca qualsiasi altra cosa io abbia fatto in termini di disposizione di Windows.

C'è un modo per seppellire questi buffer per impostazione predefinita, in modo che non devo vederli a meno che non decida di andare a cercarli?


Risposte:


11

Poiché menziono che il comando viene eseguito in modo asincrono, suppongo che intendi il comando async-shell-commandassociato M-&. Puoi seguire i consigli nella documentazione di async-shell-command(puoi leggerlo facendo C-hfasync-shell-commandRET) personalizzare display-buffer-alistcome segue

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

Ora il buffer utilizzato dal comando per visualizzare l'output non verrà mai mostrato.


Funziona magnificamente, grazie. Inoltre, non ne sapevo nulla M-&. Stavo usando M-!e poi aggiungendo manualmente &il comando al comando che ho passato alla shell.
Steven Arntson,

4

Emacs ha una funzione di uso generale per impedire che eventuali modifiche involontarie (o addirittura intenzionali) alla configurazione della finestra causino problemi.

Aggiungi (winner-mode 1)al tuo file init. Quindi quando qualcosa incasina le finestre, usa C-c<left>( winner-undo) per ripristinarle. Puoi usarlo ripetutamente per annullare più modifiche alla configurazione della finestra. C-c<right>( winner-redo) ti riporta alla configurazione più recente.


Sì, sono un utente entusiasta della modalità Vincitore!
Steven Arntson,

4

Ecco la mia configurazione. Dovrebbe funzionare benissimo se sei su 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)

Non solo nasconderà quei fastidiosi buffer quando aprirai un file pdf dired, ma Evince persisterà anche se chiudi Emacs. C'è anche una piccola personalizzazione per accodare i file video contrassegnati per una playlist vlc.


2

È possibile sopprimere quella finestra per un singolo comando anziché utilizzare 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))

Suggerisco (cons NEWTHING display-buffer-alist)invece di (list NEWTHING)non inibire completamente la lista originale.
phils,

Buon suggerimento, implementato.
killdash9,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.