日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

関連付け起動で clj ファイルを emacs で開く

自分は Clojure でコードを書く時、

用途 ツール
通常のテキスト編集 xyzzy
Clojure での開発 emacs + コマンドプロンプト
ファイル操作 xyzzy ファイラ

と言う、多分世界で何人もいないんじゃないかwと言う相当ニッチな環境で作業してる。

これで一つだけ困ってたのが、xyzzy ファイラから 1 ストロークemacsClojure ソースを開けないと言う事。

さすがに emacs で C-x C-f してーのパスを補完しながら打ち込んでーの、と言うのはやっておらず、これまでは xyzzy ファイラからマウス右ボタンでの D&Demacs へ渡すと言う方法を取っており、それでも最初の方法よりはマシなのでそれで妥協していた。ただこの方法も PC で作業するのに必要なツールが emacs, xyzzy, コマンドプロンプトだけなはずもなく、ウィンドウがいくつも立ち上がってるとやはり少し煩わしく感じる。

最近調べるメンドくささより毎度若干手間な手順で開くメンドくささが上回ってきたのでそろそろ何とかする。

でどうするか

xyzzy ファイラでも xyzzy で開く(Enter キー)のとは別キーながらも 1 キーで関連付け起動はできる(X キー)ので Windows の関連付け設定で clj を emacs に関連付ける。ベストなのは xyzzy ファイラで Enter 叩いた時 clj なら emacs でファイルを開くようにする事だが、それはちょっと手間かかりそうなので諦める。

はい、やり方はすぐ思いついてたんですが Windows が 7 になって関連付けをどこで設定するのか、その時の emacs の起動オプションって何を指定するのかがメンドくさくて調べてなかっただけです。

以下手順。

clj を関連付けに登録

実際の関連付け設定はレジストリにあるのだが、これも何かのプログラムで一度関連付け起動しないとそもそもエントリ自体が存在しないので一度やっておく。一時的なものなのでメモ帳ででも開いておけば良い。

関連付け設定

コマンドラインでできまっせと言う説明が EmacsWiki の Create File Associations にありこうしてみたがダメ。

ftype ClojureCode=C:\path\to\emacs\bin\emacsclientw -na C:\path\to\emacs\bin\runemacs "%1"
assoc .clj=ClojureCode

そういや ClojureCode とかって勝手に名前付けたけどまずその名前登録しとかないとダメなのでは、それ多分レジストリだよなと思い再度レジストリエディタで確認。すると関連付け拡張子の登録は下記レジストリパスにあった。

HKEY_CURRENT_USER\Software\Classes\

こいつの下に .clj とあるはずで、値には auto_clj だか何かそんな名前が入っているはず。多分このままでもいいんだろうけど何となく ClojureCode と変更。

でこの名前で何のプログラム起動させるかの設定が

HKEY_CURRENT_USER\Software\Classes\auto_clj

以下に入ってて、名前を変えてる場合こちらもまず auto_clj を変えておく。この場合なら ClojureCode ね。

次に open と edit にそれぞれメモ帳(notepad)が起動するようになってるはずなので、ここに最初コマンドラインで設定しようとしていた値を入れる。レジストリパスを見る限りあくまで今のログインユーザのみで有効な設定っぽいが個人 PC なので気にしない。

emacs をサーバで開始する設定追記

以上で一応 Windows 側の関連付け設定は済むのだが、これだけだとファイルを開くたびに新しく emacs が開いてあんまりよろしくない。既に開いている emacs へファイルを開くには emacs にも設定が必要で ~/.emacs.d/init.el に以下を追記する。

(server-start)

が、何やら emacs 起動エラーが出た。どうやらサーバモードで動作させる時に使う ~/.emacs.d/server フォルダが Admin 権限だとダメらしい。これは server フォルダをログインユーザ権限に切り替えれば解消する。手順は stackoverflow にあった。

ちなみに関連付け起動時に既に起動している emacs で開くようにする設定は正確には関連付けのコマンドラインオプションの方で指定してあり、詳しい事は emacsclientw --help を見たって下さい。