libvim
とは何ですか? libvim
は Vim のフォークであり、最小限の C ベース API を提供し、Vim モーダル編集をモデル化することを目的としています。これにはユーザー インターフェイスはまったく含まれておらず (端末 UI さえも)、主に Vim のキーストロークに忠実な高速バッファ操作エンジンとして機能します。これはまだ進行中の作業であり、安定化するために多くの作業が残されています。
ターミナル Vim をお探しの場合は neovim を、GUI Vim をお探しの場合は Onivim 2 をチェックしてください。
libvim
主に Onivim 2 を対象としています。 v1、v2、およびその他のプロジェクト間で「UI Vims」を何度か繰り返し実装した後、私が望んでいた抽象化は、ターミナル UI から完全に切り離された、一種の純粋な関数型 Vim でした。 ' は(editor state, input) => (new editor state)
の関数です。 Onivim 2 はレンダリング層を完全に処理するため、この純粋な関数としてモデル化された Vim はバッファー操作だけに焦点を当てることができます。
そのために、 libvim
Vim を操作するための単純な C API を公開し、バッファーの変更やメッセージなどのリスニングをサポートします。
それは次のことを担当します。
以下については責任を負いません。
これらはすべて、ライブラリのコンシューマによって処理されることを目的としており、 libvim
高速バッファ操作のジョブに集中することができます。
libvim
クロスプラットフォーム (Onivim 2 で必要なため!) と WebAssembly をビルドします。v1 チュートリアルをブラウザベースのエクスペリエンスに移植したいと考えています。
このような「抽象化された Vim」の興味深い応用例は他にもあります。
readline
実装するための優れた基盤となるでしょう。 API の使用例については、normal_mode_motion などの apitest を確認してください。完全な API は、libvim.h から入手できます。
API の中心となるのはvimInput
で、これは 1 つのキーを受け取り、ステート マシンによって同期的に処理されます。バッファ更新やメッセージなどの「副作用」は、 vimSetBufferUpdateCallback
などのコールバック経由でサブスクライブできます。
このライブラリは現在開発中であるため、現在、下位互換性については保証されていません。 API はご自身の責任で使用してください。
esy
ネイティブ コードのnpm
のようなものです。まだお持ちでない場合は、次を実行してインストールします。
npm install -g [email protected]
git clone https://github.com/onivim/libvim
cd src
esy install
esy '@test' install
esy build
esy '@test' build
esy
ワークフローは 1 回限りのビルドには最適ですが、毎回ワールドを再構築するため、開発中は増分ワークフローを使用することをお勧めします。
cd src
make apitest/autoindent.test.exe
cd apitest
./autoindent.test.exe
次のように Onivim 2 package.json
に解決策を追加することで、ローカルでビルドされたlibvim
ローカルでビルドされた Onivim 2 に対してテストできます。
"resolutions" : {
...
"libvim" : " link:../libvim/src "
}
libvim/src
フォルダーを指していることを確認してください。
注: このワークフローでは、Onivim 2 でバイナリが古くなる可能性があるという問題が確認されているため、変更のたびに
rm -rf _esy && esy i
実行して依存関係を再構築することをお勧めします。
libvim
Neovim ではなく Vim をベースにしているのでしょうか?私は Neovim チームが行っている仕事の大ファンです (そして、チームは Onivim プロジェクトを非常にサポートしてくれています)。理想的には、 Neovim を使い続けるか、 libnvim
に基づいてlibvim
実装していたと思います。実際、私が初めてこの「最小限の抽象化」を構築しようとしたとき、Neovim のlibnvim
ベースにしようとしました。調査の期限を 2 日に設定したところ、いくつかの深刻なハードルに遭遇しました - 私たちのビルド環境は Windows では少し困難です (Cygwin + MingW クロスコンパイラー ツールチェーンに基づいています) - その環境で Neovim + deps をビルドするにはいくつかの問題が発生しました。この急増に基づいて、そのツールチェーンで機能するまでに約 3 ~ 4 週間かかると推定しました。
これは Neovim の問題ではないことに注意してください。依存関係の使用とCMake
の活用は適切な決定です。これは OCaml ビルド システムの結果です。 Cygwin + MingW クロスコンパイラ ツールチェーンは、すべての依存関係で適切に処理されるわけではありません (Win32 と Unix の奇妙なハイブリッドであるため、#ifdef が間違っていて、間違った依存関係が取り込まれ、膨大な時間がかかることがよくあります)これらの問題に取り組んでいます)。
対照的に、Vim はその環境で簡単にコンパイルできました (注: クロスプラットフォームのesy
対応 Neovim パッケージの構築に興味がある人は、これをもう一度見てみましょう!)。また、Onivim v1 チュートリアルを Web に移植するための WebAssembly ビルドにも興味があります。WebAssembly にコンパイルされたこの C 抽象化ライブラリが最適です。
ビルドの問題以外にも、同期の機能的な API を提供するには Neovim と Vim の両方をリファクタリングする必要があります。
このすべての作業の動機は、複雑さと障害モードを軽減するために Onivim v2 から RPC レイヤーを削除することでした。最終的には、これは純粋に制約に基づいた技術的な決定でした。 nvim
を使用してesy
クロスプラットフォーム経由でビルド可能な同様の API を入手できれば、喜んで使用したいと思います :)
libvim
に興味があり、開発をサポートしたい場合は、次の点を考慮してください。
libvim
の改善に協力したい場合は、CONTRIBUTING.md ファイルを参照してください。
貢献できる場所:
libvim
に必要のないコードや機能の削除にご協力ください。libvim
コードは MIT ライセンスに基づいてライセンスされています。
また、サードパーティのコード、特に Vim だけでなく他のコードにも依存します。ライセンスの詳細については、ThirdPartyLicenses.txt を参照してください。