如何避免在Emacs中弹出*Async Sh​​ell Command*缓冲区?

Mar*_*ert 15 emacs asynchronous dired

~/.emacs包含以下设置,用于打开某些应用程序的某些文件(Ubuntu 12.10; Emacs 24):

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

当我导航到.pdf dired-mode并点击时!,它会在Okular中打开.pdf,但是dired-buffer被分成两部分,第二部分现在是一个无用的*Async Shell Command*缓冲区,包含像

okular(25393)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig:
okular(25393)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig:
okular(25393)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig:
okular(25393)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig:
Run Code Online (Sandbox Code Playgroud)

如何防止打开此缓冲区?(除非,如果有错误,此信息有用).

我在这里这里找到了相关的问题,但它们似乎处理异步执行的特定命令,而不是*Async Shell Command*一般的(如果可能的话,我想改变异步进程的一般行为,不仅仅是针对某些文件类型)

Jac*_*son 16

在这里找到:

(call-process-shell-command "okular&" nil 0)
Run Code Online (Sandbox Code Playgroud)

适合我.没有stderr gobbledygook.


use*_*316 6

这个问题是在2012年提出的,在撰写本文时,最新答案是2015年。现在,在2017年,我可以说答案很简单:

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

  • 这仍然会创建一个缓冲区,但至少它不会弹出视图并占据屏幕的一半。我坚持这个,这是最简单的解决方案。 (2认同)

小智 5

我正在利用 user1404316 的答案,但这是实现预期结果的另一种通用方法。

(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)))
Run Code Online (Sandbox Code Playgroud)


Dan*_*nna 1

我并不完全确定是否要对一般的异步进程执行此操作,但对于任何经历的事情async-shell-command,这应该有效:

    (defadvice async-shell-command (around hide-async-windows activate)
       (save-window-excursion
          ad-do-it))
Run Code Online (Sandbox Code Playgroud)