Zshの補完をあらゆるエディタで使いたいのでLanguage Serverを自作した
はじめに
Zshの補完機能をLSP経由で提供するツール(zshcs)を作成したので、その紹介と開発の背景を共有します。
使ったりコントリビュートしたりしてくれると嬉しいです。
作った経緯
VimやNeovimでは以下のプラグインを愛用してきました。
- Neovim
- Vim
環境構築で.zshrcを編集するときや、edit-command-lineでコマンドをテキストエディタから編集する際、Zshの補完機能が使えると便利です。
逆に言えば補完プラグインを選定する際、Zshの補完機能を実現できるという要件が制約になっていました。
もっとフットワーク軽く、様々な補完プラグインやテキストエディタを試せる状況にしたいという思いが出てきました。
最近のテキストエディタはLSP(Language Server Protocol)を利用した補完機能を持つことが多いため、これを実装すれば選択肢が増えると考えました。
fishについても同様ですが、fishはfish-lspがすでにありました。
作り始めた当時はZshのLSP実装が見当たらなかったので、作りたくなったのです。
zshcsの実装について
zshcs はRustで実装しました。
作り始めはRustの学習とVibe Codingをやってみるという、複数の未知に同時にチャレンジしてしまったためコードは荒削りです。
それでも一旦使えるものが出来上がりました。
補完の仕組み
Zshの補完候補の取得方法はzsh-capture-completionに大きく影響を受けています。
ポイントはZshスクリプトでzptyを用いてシェル環境を再現し、実際にZshの補完関数を実行して候補を生成していることです。
今後の展望と課題
とりあえず使えるものはできましたが、まだ改善の余地があります。
- サーバー化による高速化
-
ddc-source-shell_nativeのようにZshプロセスをサーバー化する
- 現在は
textDocument/completion毎にZshスクリプトのプロセスを起動している
- 現在は
-
ddc-source-shell_nativeのようにZshプロセスをサーバー化する
- 様々なユーザー環境への適応
- fpathを追加で指定可能とする
もし興味のある方がいれば、コントリビュートしていただけると非常に嬉しいです。
おわりに
新しいテキストエディタや補完プラグインが出るたびにZshの補完ソースを作成するとタイムラグがありますし、世の中にZshのLSP実装があることには価値があると考えています。
(当然各ソフトウェアに特化した補完ソースにも価値がある)
Rustのコードをブラッシュアップ出来る人、Zshのスクリプトをブラッシュアップ出来る人などのコントリビュートをお待ちしております。
もっと良いもの作ったよ、という人も教えてくれると嬉しいです!
Discussion