19939


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`を使う時に参照されるディレクトリを指定するにはどうすればよいでしょうか？


CC BY-SA 3.0
2015-12-13T11:14:51.877
19938
2015-12-13T13:40:01.377
3271
question
emacs
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]

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


CC BY-SA 3.0
2015-12-13T11:59:35.733
19939
2015-12-13T13:40:01.377
2015-12-13T13:40:01.377
19938
answer