Emacsでshell-commandを使う時のカレントディレクトリを変更する


Emacsの設定を自動化するために、必要なファイルがなかったらgitを使って取得する処理を書いているですが

[code]

    (unless (file-exists-p "~/.emacs.d/git/auto-complete")  
            (shell-command "git clone git@github.com:auto-complete/auto-complete.git ~/.emacs.d/git/auto-complete"))
    
[/code]

カレントディレクトリを指定できないので作成するパスを指定しないと期待通りの動作になりません。Emacsで`shell-
command`を使う時に参照されるディレクトリを指定するにはどうすればよいでしょうか？




`shell-command` は `default-directory`
に設定されているディレクトリに移動してからコマンドを実行しますので、以下の様にします。

[code]

    (let* ((clone "~/.emacs.d/git/auto-complete")
           (default-directory (file-name-directory clone)))
      (unless (file-exists-p clone)
        (if (and (file-directory-p default-directory)
                 (file-writable-p default-directory))
            (shell-command "git clone git@github.com:auto-complete/auto-complete.git")
          (message (concat default-directory " does not exist or not writable.")))))
    
[/code]

**追記**

余談ですが、例えば以下の様なマクロを定義しておいて、

[code]

    (defmacro shell-command-at-directory (command dir &optional output-buffer error-buffer)
      `(let ((default-directory ,dir))
         (shell-command ,command ,output-buffer ,error-buffer)))
    
[/code]

以下の様に実行すると良いかも知れません。

[code]

    (shell-command-at-directory "git clone git@github.com:auto-complete/auto-complete.git"
                                "~/.emacs.d/git")
    
[/code]

# あまり代わり映えしませんけれども…




`shell-command` は `default-directory`
に設定されているディレクトリに移動してからコマンドを実行しますので、以下の様にします。

[code]

    (let* ((clone "~/.emacs.d/git/auto-complete")
           (default-directory (file-name-directory clone)))
      (unless (file-exists-p clone)
        (if (and (file-directory-p default-directory)
                 (file-writable-p default-directory))
            (shell-command "git clone git@github.com:auto-complete/auto-complete.git")
          (message (concat default-directory " does not exist or not writable.")))))
    
[/code]

**追記**

余談ですが、例えば以下の様なマクロを定義しておいて、

[code]

    (defmacro shell-command-at-directory (command dir &optional output-buffer error-buffer)
      `(let ((default-directory ,dir))
         (shell-command ,command ,output-buffer ,error-buffer)))
    
[/code]

以下の様に実行すると良いかも知れません。

[code]

    (shell-command-at-directory "git clone git@github.com:auto-complete/auto-complete.git"
                                "~/.emacs.d/git")
    
[/code]

# あまり代わり映えしませんけれども…

