从emacs中的特定目录运行shell命令

时间:2014-04-18 23:47:02

标签: emacs elisp

如何从特定目录执行shell命令(例如git gui)?我更喜欢不依赖于&&;等shell运算符的跨平台方法,因为我需要在Windows和unix上运行它。 (例如,调用cd /path/to/dir && git gui将无法在Windows上运行,因为&&无效。)

我试过了:

(async-shell-command (concat "cd \""
  (replace-regexp-in-string 
    "/" "\\\\" (file-name-directory (buffer-file-name))) "\" ; git gui"))

失败是因为无论出于何种原因,shell认为; git gui是路径的一部分,并且报告:The system cannot find the path specified.

所以,我宁愿不处理shell怪癖,我希望有一个elisp函数来设置shell-commandasync-shell-command的目录。我试过了:

 (shell-process-pushd (file-name-directory (buffer-file-name)))
 (shell-command "git gui")
 (shell-process-popd nil)

这没有效果:git gui总是在我的主目录中打开。 (另外,shell-process-pushd/popd没有记录。)

这也不起作用:

(start-process "gitgui" nil "git" "gui")

这两个都没有:

(let '(bufdir (file-name-directory (buffer-file-name))) 
       (with-temp-buffer
         (print bufdir)
         (cd bufdir)
         (shell-command "git gui")))

3 个答案:

答案 0 :(得分:7)

您确定在emacs-lisp中使用尾部斜杠表示目录名吗?

(let ((default-directory "~/.emacs.d"))
  (shell-command-to-string "echo $PWD"))
        ;;; ⇒ "/Users/me"

(let ((default-directory "~/.emacs.d/"))
  (shell-command-to-string "echo $PWD"))
        ;;; ⇒ "/Users/me/.emacs.d"

答案 1 :(得分:2)

试试这个:

(let ((default-directory "~/.emacs.d/")) (shell-command "ls"))

答案 2 :(得分:1)

(shell-command) 使用缓冲区default-directory,这意味着没有理由cd到缓冲区的目录。

我的问题是我错误地在没有关联git gui目录的缓冲区上运行.git/