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


こんにちは。森谷です。

今回は emacs と tmux のお話です。両者の連携については Emacsから tmuxを操作する拡張 emamuxを書きました や Emacsで編集中のファイルのディレクトリをtmuxの新しいウィンドウで開く など既に色々ありますが、デファクトスタンダード的な何かはまだ無いように感じられます。

よって、痒いところまで届く孫の手は自分で実装しなければなりません。幸いにも、実装に必要な道具は揃っています。 emacs は皆さんご存知の通り emacs lisp で(出来る事は)何でも出来ますし、 tmux はコマンドラインから(出来る事は)何でも出来ます。

今回はこの道具たちを使って、 emacs で開いているファイルがあるディレクトリを近くの pane の zsh で開く( cd する)、という操作を実装したいと思います。

まず、前提条件がいくつかあります。

  1. 同 window に複数 pane があり、それらの pane それぞれで、 zsh か emacs のどちらかが動いている。
  2. emacs は emacsclient で動いている。
  3. 近くの pane とは、 emacs pane の pane id から始めて pane を訪問していった時、最初の zsh pane を指す。
  4. zsh 上では ssh など、 emacs で開いているファイルのディレクトリに cd 出来ないようなコマンドを実行中ではないとする。

emacsclient については深く立ち入りませんが、いちいち各 pane で独立した emacs を起動するのではなく、一つのサーバーで繋ぐことによって buffer を共有したり出来るようにするためのものです。これに関しては tmux や screen の pane 上で emacs を便利に弄るための常套手段っぽいので、入れてみることをオススメします。

では、実装を見ていきましょう。まずは emacs 側、基本的に emacs lisp sucks なので(何でも出来るって言ったのにね)、あんまり複雑なことはしません。

これで、 buffer を切り替えるたびに開いているファイルの名前が current-buffer-file-name というファイルに格納されます。

次に tmux の設定です。

で、 $HOME/tmux/emacs_to_shell は

やってることは、現在の pane が emacs pane なら、順に pane を捜査して非 emacs pane を探し、そこに cd を send して pane を移動する、という感じ( pstree, awk がインストールされていないと動作しません)。これでキー入力一発で現在のディレクトリでコマンドを打てる状態になります。

今後もこの機能は拡張していく予定なので、何らかの進展があればまた書くと思います。改善点は

  • 前提条件4番目で ssh してた場合でも良きに計らう。
  • dired でも良きに計らう。
  • zsh から emacs の dired を開く。

といったところでしょうか。ではまた。

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