読者です 読者をやめる 読者になる 読者になる

Emacs on Windows な環境で el-get する

この投稿はEmacs Advent Calendar 2012の14日目の記事です。 (Qiita で行われています)

"Emacs Advent Calendar 2012 - Qiita" - http://qiita.com/advent-calendar/2012/emacs

導入

Emacselisp 管理に el-get はいまやかかせないものになっています。

が、しかし git に依存しているため、 windows では工夫してやる必要がありました。 msysgit(msys) は大きな助けになります。

"Git for Windows" - http://msysgit.github.com/

msys の環境設定を引き継いだまま Emacs を起動するには msys のプロンプト上から

runemacs

を実行するだけですので簡単です。

したがってこれで終わり……とはいかないのが windows の悩ましいところですね。

問題

この状態で M-! で git が使えるにも関わらず、 el-get を使おうとするとエラーが発生してしまい el-get 自体の clone とインストールに失敗してしまいます。

この問題は msys に含まれる bin/install-info.exe が影響しています。 その顛末はこれを書いている今もここでやりとりがされています。

"install-info strangeness... · Issue #861 · dimitri/el-get" - https://github.com/dimitri/el-get/issues/861

問題としては、cygwin や msys が windows ネイティブの install-info.exe と 混ざって呼び出してしまうことのようですが、 てっとり早く回避方法を試しましょう。

回避方法

その1

msys の install-info.exe をリネームして使わないようにします。 強引ですが手間もかからず簡単です。 ただし今のところリネームによる問題は発生していませんが、 もしかすると Emacs 以外で問題が発生するかもしれません。

その2

el-get を手動で clone します。 el-get のインストールスクリプトは単純に el-get 管理下のディレクトリに まず el-get 自身を clone します。 ですのでこれを手で行なってしまいます。 msys のプロンプトで ~/.emacs.d/el-get などの環境に合わせた el-get の管理ディレクトリに移動して 手動で clone しましょう。

その2の方法で入れた el-get を el-get が誤作動で吹き飛ばした経験があるので、 現在は1の方法で運用しています。

おまけ

yasnippet は github 上で el-get でのインストールが紹介されています。

"capitaomorte/yasnippet · GitHub" - https://github.com/capitaomorte/yasnippet

しかし windows 環境では使用不可能なパスの形式で 一部の snippets が登録されています。 これらの snippets は git submodule で管理されているのですが、 公式で紹介されている el-get からのインストール方法を試すと git submodule も実行されてしまいます。 git submodule が実行されたタイミングで OS がエラーを出すために、 el-get が動作を停止した上 GUI では削除不可能なファイルが出来てしまいます。

この問題を回避するためには el-get に追加されたオプションを有効にしてインストールを行います。

通常、

      (:name yasnippet
             :website "https://github.com/capitaomorte/yasnippet.git"
             :description "YASnippet is a template system for Emacs."
             :type github
             :pkgname "capitaomorte/yasnippet"
             :features "yasnippet"
             :compile "yasnippet.el"

のように記述する部分に :submodule nil を追加し、

      (:name yasnippet
             :website "https://github.com/capitaomorte/yasnippet.git"
             :description "YASnippet is a template system for Emacs."
             :type github
             :pkgname "capitaomorte/yasnippet"
             :features "yasnippet"
             :compile "yasnippet.el"
             :submodule nil

というように変更します。 これで git submodule は実行されないため問題が回避出来ます。 (当然本来であればインストールされる snippets がインストールされません。) あくまで回避策、ですね。

終わりに

windows 環境は地雷がいっぱいなので、 VM に Linux を入れてそこで Emacs を使うのが一番楽だなと感じる今日このごろです。