2012-12-16 13 views
8

mio ~/.emacs contiene le seguenti impostazioni per l'apertura di determinati file con determinate applicazioni (Ubuntu 12.10; Emacs 24):Come evitare il pop-up del buffer * Comando shell asincrona * in Emacs?

(setq dired-guess-shell-alist-user 
     '(("\\.pdf\\'" "okular ? &") 
    ("\\.djvu\\'" "okular ? &") 
     ("\\.mp3\\'" "vlc ? &") 
    ("\\.mp4\\'" "vlc ? &") 
    )) 

Se navigando a una .pdf in dired-mode e ha colpito !, si apre il .pdf in Okular , ma il-buffer dired è diviso in due parti, la seconda essendo ora un inutile *Async Shell Command* tampone contenente contenuti come

okular(25393)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 
okular(25393)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 
okular(25393)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 
okular(25393)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 

Come posso evitare questo buffer venga aperto? (eccetto, forse, se c'è stato un errore e questa informazione è utile).

ho trovato questioni connesse here e here, ma sembrano a che fare con i comandi specifici eseguiti in modo asincrono, al posto del *Async Shell Command* in generale (se possibile, vorrei cambiare il comportamento in generale per i processi asincroni, non solo per alcuni tipi di file)

+0

Date un'occhiata alle funzioni effettive all'interno della fonte di '.../lisp/simple.el' - vale a dire,' defun shell-comando' e 'defun async-shell-comando'. Puoi persino creare le tue funzioni personalizzate e/o usare 'defalias'.Quando si usa 'start-process', il secondo argomento è il nome del buffer di output - usando' nil' per il secondo argomento si impedisce la creazione di un buffer di output. Puoi usare 'set-process-sentinel' in congiunzione con' start-process'. – lawlist

+0

La stringa doc di 'async-shell-command' afferma:' ... In Elisp, sarà spesso servito meglio chiamando 'start-process' direttamente, poiché offre più controllo e non impone l'uso di uno shell (con la necessità di citare gli argomenti) .' – lawlist

risposta

1

io non sono del tutto sicuro di farlo per i processi asincroni in generale, ma per tutto ciò che passa attraverso async-shell-command, questo dovrebbe funzionare:

(defadvice async-shell-command (around hide-async-windows activate) 
     (save-window-excursion 
      ad-do-it)) 
+0

Ma poi si stanno forzando tutti gli usi di 'async-shell-command' per perdere il buffer. Penserei che sarebbe eccessivo; ci saranno certamente situazioni in cui vorresti vedere l'output. Cambiare il consiglio di aggiungere un parametro che specifica se fare o meno "save-window-excursion" non dovrebbe essere troppo difficile, ma allora perché usare i consigli in primo luogo; utilizzare invece una semplice funzione wrapper. – tripleee

+0

... Mi rendo conto che OP ha chiesto una soluzione specifica a 'async-shell-command' in modo specifico, ma gli avvertimenti per fare scherzi dovrebbero essere enfatizzati. – tripleee

+0

Questo non ha funzionato per me. Ricevo ancora il buffer del comando shell asincrono. –

0

Un incantesimo po 'più complicato s dovrei prenderti quello che vuoi. Basta usare un comando di shell come: (okular ? >& /dev/null &).

Non ho provato questo con okular, ma posso fare M-!((echo foo; sleep 10; echo bar) >& /dev/null &) ed Emacs restituisce immediatamente senza creare un nuovo buffer.

+0

Bello. Tuttavia, il buffer * Async Shell Command * si apre ancora (è appena vuoto). Se provo il tuo 'M-! ... 'comando, ottengo" comando di shell riuscito senza output " –

0

ho risolto il problema, con questo metodo:

;list of programs, corresponding to extensions 
(setq alist-programs 
     '(("pdf" ."okular") 
     ("djvu" . "okular") 
     ("mp3" . "xmms"))) 

(defun my-run-async-command (command file) 
    "Run a command COMMAND on the file asynchronously. 
    No buffers are created" 
    (interactive 
    (let ((file (car (dired-get-marked-files t current-prefix-arg)))) 
    (list 
     ;last element of alist-programs, contains COMMAND 
     (cdr 
     (assoc 
     (file-name-extension file) 
     alist-programs)) 
     file))) 
    ;begin of function body 
    (if command ;command if not nil? 
     (start-process "command" nil command file) 
    ) 
) 

;attach function to <f2> key 
(add-hook 'dired-mode-hook 
     (lambda() 
    (define-key dired-mode-map (kbd "<f2>") 'my-run-async-command))) 
8

trovato questo here:

(call-process-shell-command "okular&" nil 0) 

funziona per me. Nessun gobbledygook stderr.

2

Purtroppo non esiste un buon modo per evitare questo buffer poiché viene chiamato direttamente dalla funzione 'shell-command' ('async-shell-command' è solo un wrapper).

Quindi, un modo molto migliore è sostituire "async-shell-command" con "start-process". Si dovrebbe iniziare il processo con 'set-process-sentinel' per rilevare il momento in cui il processo emette il segnale di uscita. Quindi uccidi il processo.

1

La domanda è stata posta nel 2012, e al momento della mia scrittura, la risposta più recente è datata 2015. Ora, nel 2017, posso dire che la risposta è semplice:

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

0

Sto trascurando la risposta dell'utente1404316, ma qui c'è un altro modo generico per ottenere il risultato desiderato.

(defun async-shell-command-no-window 
    (command) 
    (interactive) 
    (let 
     ((display-buffer-alist 
     (list 
     (cons 
      "\\*Async Shell Command\\*.*" 
      (cons #'display-buffer-no-window nil))))) 
    (async-shell-command 
    command))) 
Problemi correlati