2012-12-16 7 views
8

Mein ~/.emacs enthält die folgenden Einstellungen für bestimmte Dateien mit bestimmten Anwendungen (Ubuntu 12.10; Emacs 24) zu öffnen:Wie vermeidet man Pop-up von * Async Shell Command * Puffer in Emacs?

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

Wenn ich zu einem PDF in dired-mode navigieren und drücken Sie !, es öffnet die PDF in OkularName , aber der dired-Puffer in zwei Teile geteilt wird, nun die zweiten ein nutzloser *Async Shell Command* Puffer, den Inhalt wie

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

Wie kann ich diesen Puffer verhindern, geöffnet zu sein? (außer vielleicht, wenn es einen Fehler gab und diese Information nützlich ist).

fand ich ähnliche Fragen here und here, aber sie scheinen mit bestimmten Befehlen asynchron ausgeführt zu behandeln, anstelle der *Async Shell Command* im allgemeinen (wenn möglich, ich möchte das Verhalten im Allgemeinen für asynchrone Prozesse verändern, nicht nur für bestimmte Dateitypen)

+0

Werfen Sie einen Blick auf die eigentlichen Funktionen innerhalb der Quelle '.../Lisp/simple.el' - das heißt' defun Shell-command' und 'defun Asynchron-shell-command'. Sie können sogar eigene Funktionen erstellen und/oder Defalias verwenden.Bei der Verwendung von 'start-process 'ist das zweite Argument der Name des Ausgabepuffers - die Verwendung von' nil 'für das zweite Argument verhindert, dass ein Ausgabepuffer erstellt wird. Sie können 'set-process-sentinel' in Verbindung mit' start-process' verwenden. – lawlist

+0

Die doc-Zeichenkette 'async-shell-command' gibt an:' ... In Elisp ist es oft besser, wenn Sie 'start-process' direkt aufrufen, da es mehr Kontrolle bietet und keine verwendet ( – lawlist

Antwort

1

ich bin nicht ganz sicher es für asynchrone Prozesse im allgemeinen zu tun, aber für alles, was durch async-shell-command geht, sollte diese Arbeit:

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

) Aber dann erzwingen Sie alle Verwendungen von 'async-shell-command', um den Puffer zu verlieren. Ich würde denken, das wäre übertrieben; Es wird sicherlich Situationen geben, in denen Sie die Ausgabe sehen möchten. Der Hinweis, einen Parameter hinzuzufügen, der festlegt, ob "Save-Window-Exkursion" durchgeführt werden soll oder nicht, sollte nicht zu schwer sein, aber warum sollte man dann zuerst Ratschläge geben? Verwenden Sie stattdessen eine einfache Wrapper-Funktion. – tripleee

+0

... Ich weiß, dass OP speziell nach einem 'async-shell-command' gefragt hat, aber die Vorbehalte für das Durcheinander sollten hervorgehoben werden. – tripleee

+0

Das hat nicht für mich funktioniert. Ich bekomme immer noch den Async-Shell-Befehlspuffer. –

0

Eine etwas komplizierte Beschwörung s Ich sollte dich bekommen, was du willst. Verwenden Sie einfach einen Shell-Befehl wie: (okular ? >& /dev/null &).

Ich habe dies nicht mit okular getestet, aber ich kann M- tun!((echo foo; sleep 10; echo bar) >& /dev/null &) und Emacs kehrt sofort zurück, ohne einen neuen Puffer zu erstellen.

+0

Schön. Der * Async Shell Command * -Puffer erscheint jedoch immer noch (gerade leer). Wenn ich dein 'M- versuchen! ... "Befehl, ich bekomme" Shell-Befehl erfolgreich ohne Ausgabe " –

0

löste ich das Problem, mit dieser Methode:

;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

Findet diese here:

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

Arbeiten für mich. Kein stderr Kauderwelsch.

2

Leider gibt es keinen guten Weg, um diesen Puffer zu vermeiden, wie es direkt von der Shell-Befehl-Funktion aufgerufen wird (async-Shell-Befehl ist nur ein Wrapper).

Also, ist ein viel besserer Weg, 'async-Shell-Befehl' durch 'start-process' zu ersetzen. Sie sollten den Prozess mit "set-process-sentinel" starten, um den Moment zu erkennen, in dem der Prozess das Signal "exit" ausgibt. Dann den Prozess beenden.

1

Die Frage wurde im Jahr 2012 gefragt, und zu der Zeit meines Schreibens, die jüngste Antwort ist 2015 datiert nun im Jahr 2017, kann ich sagen, dass die Antwort einfach:

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

0

Ich bin piggybacking von user1404316's Antwort, aber hier ist ein weiterer generischer Weg, um das gewünschte Ergebnis zu erreichen.

(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)))