キー一発で emacs のカレントディレクトリを同一 window のシェルで開く (2) 前編


こんにちは。森谷です。

今回は前回(キー一発で emacs のカレントディレクトリを同一 window のシェルで開く)の続編です。が、時間がなかったので前編です。前回の最後にお伝えした改善点を実装していきたいのですが、なんとなく前回の emacs lisp の実装が気に食わなかったので、今回はその辺を改良したいと思います。

早速実装を見て行きましょう。まず init.el ですが、前回より汎用的に、バックグラウンドプロセスを走らせて、そのプロセスと通信することで任意の emacs lisp の式を受け取って結果を出力することにします( emacsclient -e でも同様のことが出来ますが、今回は default-directory の内容を見たくて、 emacsclient にするとそれが emacsclient を起動することで変わってしまうため使えません)。

入出力は一行づつ行われます。 set-process-filter はサブプロセスに filter 関数を紐付ける関数で、 process-send-string は文字列をサブプロセスの標準入力に送る関数です。 start-process 関数でサブプロセスを起動すると、 emacs はサブプロセスの標準出力を filter 関数が設定されていればそれで受け取ることが出来ます。よってこれでサブプロセスが標準出力に出力した文字列を受け取ってサブプロセスの標準入力に結果を返すことが出来ます。

サブプロセスはプログラムのファイル名(ここでは emacs-eval-daemon-exe )で指定しています。次はこのファイルを見ていきます。

はい。皆さんの大好きな Ruby ですね。僕もなんだかんだ最近はこういう適当なファイルを沢山 Ruby で書いています。本当は fork とかして並列に沢山繋げるようにすべきなのでしょうが、そこまでトラフィックが増えるとも思えないので適当です。既に init.el の実装で server っぽいものは実装されているのですが、もう一度ここで Ruby でラップして使い勝手を良くしておきます。

次は上のサーバーに繋ぎに行くクライアントの部分を作りましょう。

これで準備は完了です。 init.el を再度読み込みデーモンをスタートさせて下さい。コンソールから、

と入力すると、現在の emacs のアクティブな buffer のディレクトリ名が表示されます。
因みに前回はここで buffer-file-name を使っていたのですが、 default-directory を使うと dired-mode でもディレクトリ名が分かって便利です。というわけで改善点の2番目は解決ですね。

次回も引き続き後編を書いていきたいと思います。

この記事に対してコメントを書く