2012-12-16 9 views
8

My ~/.emacs zawiera następujące ustawienia otwierania niektórych plików z niektórych aplikacji (Ubuntu 12.10; Emacs 24):Jak uniknąć wyskakiwania bufora * Async Shell Command * w Emacs?

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

Kiedy przejść do .pdf w dired-mode i uderzył !, otwiera .pdf w Okular , ale dired-bufor jest podzielony na dwie części, drugi teraz jest bezużyteczny bufor *Async Shell Command* zawierające treść jak

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

Jak mogę zapobiec tego bufora przed otwarciem? (z wyjątkiem, być może, jeśli wystąpił błąd i informacje te są przydatne).

znalazłem pytania związane here i here, ale wydają się radzić sobie z konkretnych poleceń wykonywanych asynchronicznie, zamiast *Async Shell Command* w ogóle (jeśli to możliwe, chciałbym zmienić zachowanie w ogóle do procesów asynchronicznych, a nie tylko dla niektórych typy plików)

+0

Zobacz rzeczywiste funkcje wewnątrz źródła '.../lisp/simple.el' - tj.' Defun shell-command' i 'defun async-shell-command'. Możesz nawet tworzyć własne niestandardowe funkcje i/lub używać 'defalias'.Podczas używania 'start-process', drugim argumentem jest nazwa bufora wyjściowego - użycie' nil' dla drugiego argumentu zapobiega tworzeniu bufora wyjściowego. Możesz użyć 'set-process-sentinel' w połączeniu z' start-process'. – lawlist

+0

Łańcuch dokumentu 'async-shell-command' stwierdza:' ... W Elisp, często będziesz lepiej obsługiwany przez wywoływanie "procesu startowego" bezpośrednio, ponieważ zapewnia on większą kontrolę i nie narzuca używania shell (z potrzebą cytowania argumentów). " – lawlist

Odpowiedz

1

nie jestem do końca pewien co robi to dla procesów asynchronicznych w ogóle, ale na wszystko, co przechodzi przez async-shell-command, to powinno działać:

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

Ale potem zmuszasz wszystkie zastosowania' async-shell-command' do utraty bufora. Myślę, że to byłoby przesadą; na pewno będą sytuacje, w których chcesz zobaczyć wynik. Zmiana porady w celu dodania parametru, który określa, czy wykonać "save-window-excursion", nie powinna być zbyt trudna, ale dlaczego najpierw skorzystać z porady; zamiast tego użyj prostej funkcji opakowania. – tripleee

+0

... Zdaję sobie sprawę, że OP poprosił o poprawkę do polecenia 'async-shell-command', ale należy podkreślić zastrzeżenia, z którymi należy się pomylić. – tripleee

+0

To nie działa dla mnie. Nadal dostaję bufor polecenia Async Shell. –

0

nieco bardziej skomplikowane zaklęcie s mógłbym dostać to, czego chcesz. Po prostu użyj polecenia powłoki, na przykład: (okular ? >& /dev/null &).

Nie testowałem tego z okularem, ale mogę zrobić M-!((echo foo; sleep 10; echo bar) >& /dev/null &) i Emacs natychmiast powraca bez tworzenia nowego bufora.

+0

Nice. Jednak bufor * Async Shell Command * nadal pojawia się (teraz pusty). Jeśli spróbuję twojego 'M-! ... 'polecenie, dostaję" polecenie powłoki powiodło się bez wyjścia " –

0

I rozwiązać problem, stosując tę ​​metodę:

;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

uznał ten here:

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

pracuje dla mnie. Bez stderr gobbledygook.

2

Niestety nie ma dobrego sposobu na uniknięcie tego bufora, ponieważ jest wywoływany bezpośrednio przez funkcję "powłoki-polecenia" ("async-shell-command" to tylko opakowanie).

Tak więc znacznie lepszym sposobem jest zamiana polecenia "async-shell-command" na "start-process". Powinieneś rozpocząć proces od "set-process-sentinel", aby wykryć moment, w którym proces wyemituje sygnał wyjściowy. Następnie zabij proces.

1

Pytanie zostało zadane w 2012 roku, a w czasie mojego pisania, najnowsza odpowiedź jest datowany 2015. Teraz, w 2017 roku, mogę powiedzieć, że odpowiedź jest prosta:

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

0

Łączę się z odpowiedzią user1404316, ale tutaj jest inny ogólny sposób na osiągnięcie pożądanego rezultatu.

(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))) 
Powiązane problemy