Vim と Socket REPL が出会った
メリークリスマス!
我が家にもつい先ほどサンタさんが来て子供へのプレゼントを置いていきました。
世のサンタさんたちお疲れ様です。子供が起きてプレゼントを見た時の顔が楽しみですね。
(ちょっと Vim 色が強めですがご了承ください /icons/vim.icon ) TL;DR
ちょっとしたスクリプトとしての Clojure 利用
Clojure Advent Calendar 2019 の 15 日目の記事で @ponkore さんが紹介したように、ちょっとしたスクリプトとして Clojure を利用しやすい環境が整ってきました。 しかし一方で Vim においては (私が調べた範囲では) Neovim 向けに Socket REPL のプラグインが1つあるのみ( clojure-socketrepl.nvim )で Vim 向けのプラグインはなさそうでした。 vim-iced での Socket REPL 対応
強いていうのであれば reply.vim が Clojure CLI を使って近いことができますが、普段の Clojure 開発と同じキーマップを使おうと思うと既存のキーマップと競合して設定が微妙に面倒です。 私の場合は普段の Clojure 開発に拙作の vim-iced を使っていますが、vim-iced はリリース当初から nREPL をターゲットにした作りになっていて Socket REPL には対応していません。
それなら REPL 機能自体をコンポーネント化して nREPL と Socket REPL で同じI/Fを用意してあげれば nREPL での機能をそのままに部分的に Socket REPL にも対応できるのは?
そうだ。Socket REPL 対応しよう!
各種ツールでの接続例
ということで暫定対応しました!
master ブランチにはマージしていないので絶賛開発中ですが、dev ブランチでお試しいただけます。 なお vim-iced は Vim/Neovim の両対応を今の所謳っているので、Neovim でも動作することは一応確認済みです。
早速ですが各ツールで Socket REPL を起動し、vim から vim-iced 経由で接続している様をご覧ください。
$ lumo --socket-repl 5555
(prompt の判定がデフォルトで user=> なので、virtual text がおかしいですが気にしないでください。あとで直します)
https://gyazo.com/81fa41d7d98b72bd3cf1b427dd2a7d3e
$ planck --socket-repl 5555
(prompt の判定が(以下略))
https://gyazo.com/333a4c6dabe8a5c93740a820f9806044
$ joker --repl :5555
https://gyazo.com/1ca544d561e7673f7e4fa0e79bd23d54
$ bb --socket-repl 5555
https://gyazo.com/8c1131eec272e85eac05269471c7e407
ついでにスクリーンショットだと見分けがつかなくて微妙ですが pREPL にも対応しました。
$ clj -J-Dclojure.server.repl="{:port 5555 :accept clojure.core.server/io-prepl}"
https://gyazo.com/381b0424ac9ba46e636e3bd835ae63c9
これで vim を使った Clojure でのスクリプト作成が捗りますね!
ところで
おもむろに以下のコマンドを打って、vim-iced 上から :IcedConnectSocketRepl 5555 してみましょう。
code:console
rm -f /tmp/f; mkfifo /tmp/f
cat /tmp/f | dad --no-color --repl 2>&1 | nc -lk 0.0.0.0 5555 > /tmp/f
https://gyazo.com/27c28cd45a6e8e0ddf9a28c3f9bd8f8d
あー、Dad でのスクリプト作成がめっちゃ捗る。これです。これがやりたかったんです。
最後に
Dad のスクリプト作成のためだけに対応した Socket REPL ですが、前述の通り、各種ツールを利用したちょっとしたスクリプト作成にも中々効果を発揮するのではと思っています。
特に Babashka については新しい機能がどんどん追加されてできることも増えているので、これから活用シーンも増えてくると思います。
それでは皆様、良いお年を!