20

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

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

当我导航到 .pdf indired-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:

如何防止打开此缓冲区?(除了,也许,如果有一个错误,这个信息是有用的)。

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

4

8 回答 8

24

在这里找到这个:

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

为我工作。没有标准错误 gobbledygook。

于 2014-04-10T08:21:01.317 回答
10

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

(add-to-list 'display-buffer-alist
  (cons "\\*Async Shell Command\\*.*" (cons #'display-buffer-no-window nil)))
于 2017-12-01T05:29:15.200 回答
6

我捎带了 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)))
于 2017-12-20T16:29:08.213 回答
1

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

    (defadvice async-shell-command (around hide-async-windows activate)
       (save-window-excursion
          ad-do-it))
于 2012-12-17T03:53:54.207 回答
1

遗憾的是,没有避免这个缓冲区的好方法,因为它是由“shell-command”函数直接调用的(“async-shell-command”只是一个包装器)。

因此,一个更好的方法是将 'async-shell-command' 替换为 ' start-process '。您应该使用“ set-process-sentinel ”启动进程,以检测进程发出“退出信号”的时刻。然后杀死进程。

于 2015-04-29T18:39:08.440 回答
0

稍微复杂一点的咒语应该可以得到你想要的。只需使用 shell 命令,例如: (okular ? >& /dev/null &).

我没有用 okular 对此进行测试,但我可以这样做M-! ((echo foo; sleep 10; echo bar) >& /dev/null &),并且 Emacs 会立即返回,而无需创建新的缓冲区。

于 2012-12-17T15:15:46.317 回答
0

我用这个方法解决了这个问题:

;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)))
于 2013-10-03T11:04:10.350 回答
0

当然,如果他在路径上运行不同的程序,则使用 start-process 的建议是可以的。但是,如果您想在特定目录(例如您的项目目录)中运行一些 shell 命令,那么只需平息弹出窗口 - 您经常需要缓冲区,但不希望它在您的脸上跳跃。例如,我运行一个网络服务器,我想查看输出,但不是现在......

  (use-package php-mode
    :config
    (add-to-list 'display-buffer-alist
    (cons "\\*Symfony Web Server\\*.*" (cons #'display-buffer-no-window nil)))
    (defun php-mode-webserver-hook ()
      (if (projectile-project-root) (let ((default-directory (projectile-project-root)))
        (unless (get-buffer "*Symfony Web Server*" )
          (async-shell-command "bin/console server:run" "*Symfony Web Server*")))))
    :hook (php-mode . php-mode-webserver-hook))
于 2020-02-23T13:12:19.480 回答