el-getをインストールし、el-get-installでapelのインストールから先に進まない問題を解決したのですが、今度は次のようなエラーが出ました。
Generating autoloads for wanderlust/site-lisp/wl/wl-highlight.el...done Generating autoloads for wanderlust/site-lisp/wl/wl-mailto.el...done Generating autoloads for wanderlust/site-lisp/wl/wl-message.el...done Generating autoloads for wanderlust/site-lisp/wl/wl-mime.el...done wanderlust failed to install: (error Local variables entry is missing the suffix) el-get-installation-failed: Local variables entry is missing the suffix
なんのこっちゃい。
原因
wl-mime.elの後くらいでエラーになっていたので、その後のファイルを見て原因が分かりました。
例えばwl-news.elの先頭は次のようになっています。
;;; wl-news.el --- Create notification from NEWS(.ja) for Wanderlust. -*-coding: iso-2022-jp-unix;-*- ;; Copyright (C) 2002 Yoichi NAKAYAMA
coding-systemがunix。つまり、改行コードがLFと指定されているのです。
でも私は普段Windows環境ではgitをcore.autocrlf=trueにして使用しています。
リポジトリにはLFで保存されるが、ワーキングコピーはCRLFになるようにしているのです。
つまり、このwl-news.elはCRLFになっているのです。
どうもヘッダーではunix(LF)と書いてあるのに、実際のファイルはdos(CRLF)なのでエラーが出るようなのです。
対策
普段 core.autocrlf=true にしているのには訳があります。なので、 git config --global core.autocrlf false
にするのは却下です。
ワーキングコピーのローカルでgit configしようにも、el-getがこれからcloneしようとしているファイルに対しては意味がありません。
git cloneするときに、最初から git config core.autocrlf false
の状態になるような方法を探したのですが、良い方法は見つかりませんでした。
ただ、 git -c core.autocrlf=false
のようにオプションで指定してやれば、cloneして取り出したファイルはunix(LF)になりました。
残念ながらローカルなconfigにこのオプションは反映されません。
なので、毎回オプションをつけてgitを呼び出す必要があります。
つまり、el-getがgitを呼び出すときに、強制的にargsに("-c" "core.autocrlf=false")を付加してやれば良いわけです。
el-getでは、呼び出すコマンド列は全てリスト化されてまとめて el-get-start-process-list に渡されます(たぶん非同期対応のためだと思います)。
なので、 el-get-start-process-list に渡されるそのリスト(commands)の中に、:programがgitのものを見つけ出し、その:argsの先頭に("-c" "core.autocrlf=false")を付加します。
;;; el-getがgitを呼び出すとき、 -c core.autocrlf=false 引数を付加する。 ;;; wanderlustがLF改行でなければバイトコンパイルに失敗するので。 ;;; ;;; 普段autocrlf=trueでgitを使っているので、gitのglobal configを変えたくない。 ;;; ;;; 注意: cloneしたワーキングコピーのconfigにこの設定は反映されない。 ;;; el-get以外から直接 ~/.emacs.d/el-get/ にあるワーキングコピーを ;;; gitで操作しようとすると、問題が起きる場合があるので注意すること。 ;;; そのようなことをする前に git config で明示的に設定すると良いと思う。 (defadvice el-get-start-process-list (around my-el-get-start-process-list--modify-git-args activate) (let* ((commands (ad-get-arg 1)) (git-executable (el-get-executable-find "git")) (new-commands (loop for c in commands collect (if (string= (plist-get c :program) git-executable) ;; gitならargsプロパティに -c core.autocrlf=falseをつける。 ;; @todo 破壊的だけどOK? (plist-put c :args (append '("-c" "core.autocrlf=false") (plist-get c :args))) ;; gitでないならそのまま c)))) (ad-set-arg 1 new-commands) ad-do-it))
これで無事にWanderlustがバイトコンパイルできるようになりました。
……これだからel-getは使いたくなかったんだ。
その他の解決策
git -c core.autocrlf=false %*
という内容のgit-lf.batを作って、それをel-getに使わせる(el-get-git-executableを書き換える)という方法もあります。
その他のトラブル
gitは空白が無いパスに入れた方が無難かも?(詳しく確認してないがverboseで追っているときに、checksumのところでProgram Filesがらみの変なエラーメッセージを見たことがある)