tmux を使用して、helix エディタから選択範囲を REPL で実行
きっかけ
最近 Clojure に興味が出て、babashka をインストールしてみました。bash スクリプトの代わりになるのを目指した立ち上がりが早い Clojure 処理系とのこと。(用途的に Gauche に近い印象)
Lisp おもしろそうだなと、SICP を第3章途中まで進めたぐらいの初心者なんですが、もっと仲良くなりたい。けど、エディタは Emacs じゃなくて普段使っている helix を使いたい。
できたもの
画面上部は REPL を起動したターミナル。画面下部が helix エディタ。
0. REPLの用意
何の言語でもいいんですが、REPL を実行するコマンドを用意します。
#!/bin/sh
rlwrap -p"Green" bb
$ babashka
Babashka v1.12.200 REPL.
Use :repl/quit or :repl/exit to quit the REPL.
Clojure rocks, Bash reaches.
user=>
1. tmux のインストール
tmux (ティーマックス と読むらしい)は、ターミナル上でペインやウィンドウを表示するツールぐらいの認識で、自分は要らないかなと触ったことなかったんですが、send-keys
コマンドというのがあることを知って、あれ? この仕組み使ったらエディタから REPL を実行できるのでは? と思って試しました。
まず、tmux をインストールします。
$ brew install tmux
2. tmux を使って REPL を起動するスクリプトを用意
$ tmux new-session -s <セッション名> <コマンド>
でセッション名をつけてコマンドを実行できるので、セッション名を固定で呼び出すシェルスクリプトを用意します。
ここでは babashka
というセッション名にしました。
#!/bin/sh
if [[ $(tmux list-sessions 2>/dev/null | grep babashka) ]]; then
echo 'Already exists.'
else
tmux new-session -s babashka babashka
fi
上記のように定義して、
$ tmux-babashka-up
を実行すると、tmux を使って REPL が起動します。
3. tmux send-keys コマンドで REPL に入力を送るスクリプトを用意
$ tmux send-keys -t <セッション名> <REPLで実行するコード> C-m
のように実行すると、tmux で実行中の REPL にコードを送信して実行できます。C-m
は Enter と同じ動きです。
呼び出し側は tmux のセッション外でも大丈夫です。なので、tmux
コマンドが呼び出せるならどこからでも REPL にコマンドを渡せます。
シェルスクリプトを作成して、引数とパイプのどちら経由でも REPL にコードを渡して実行できるコマンドを作ります。
#!/bin/sh
if [ -p /dev/stdin ]; then
COMMAND=`cat -`
else
COMMAND=$@
fi
tmux send-keys -t babashka "$COMMAND" C-m
上記のように定義すると、以下のように叩いて REPL が実行できるようになります。
$ tmux-babashka-run '(+ 1 1)'
or
$ echo '(+ 1 1)' | tmux-babashka-run
ここまでできたら、あとはエディタから呼び出す処理を書くだけです。
4. helix の設定
helix のバージョン 25.01.1 (2025/5/16 現在最新)時点では、エディタからコマンドを実行する際にエディタの情報を渡す方法は用意されていないので、クリップボード経由で渡すようにします。
(これ が入るバージョンだといろいろ楽になるのかなあ)
選択範囲を REPL に渡すようキーマップを定義します。
(Normal モードで Enter
を押下すると実行するようにしました。)
[keys.normal]
"ret" = [
":clipboard-yank-join",
":sh pbpaste | tmux-babashka-run"
]
以上で設定は完了です。
これで、helix から REPL を実行できるようになりました。
やったー。
Discussion