Emacs-Dired中的多个异步shell命令?

时间:2011-08-01 07:06:03

标签: shell emacs asynchronous command dired

Emacs显然可以处理多个异步子进程,否则像org-babel这样的多语言编程环境就不可能了。

但是,当我在Dired并启动异步shell命令来查看pdf文件(& evince),然后尝试在第二个pdf文件上执行相同操作时,我收到以下消息:

“命令正在运行 - 杀了它?是或否?”

在Dired中有没有办法并行运行多个异步shell命令?

3 个答案:

答案 0 :(得分:12)

当您使用dired-do-async-shell-command时,Emacs会创建一个*Async Shell Command*缓冲区。如果需要另一个异步命令,则需要重命名此缓冲区,例如使用M-x rename-uniquely

你可以尝试通过建议来改变dired-do-async-shell-command的比例:

 (defadvice shell-command (after shell-in-new-buffer (command &optional output-buffer error-buffer))
    (when (get-buffer "*Async Shell Command*")
      (with-current-buffer "*Async Shell Command*"
         (rename-uniquely))))
 (ad-activate 'shell-command)

请注意,我确实建议使用shell命令Emacs命令,因为它是由dired调用的。

答案 1 :(得分:2)

我认为dired-do-async-shell-command不可能,但如果您只想打开某个文件,我建议使用OpenWith某个外部应用程序,它允许运行任意数量的外部进程。

答案 2 :(得分:0)

我刚刚设置了以下内容,它会删除dired-run-shell-command的当前定义,以将专用缓冲区名称传递给shell-command:

(defun dired-run-shell-command (command)
       (let ((handler
          (find-file-name-handler (directory-file-name default-directory)
                      'shell-command)))
     (if handler (apply handler 'shell-command (list command))
       (shell-command command
              (generate-new-buffer-name
               (concat "*Shell Command Output: '" command "'*")))))
       ;; Return nil for sake of nconc in dired-bunch-files.
       nil)