libvim
? libvim
是 Vim 的一個分支,目標是提供最小的基於 C 的 API,對 Vim 模式編輯進行建模。它根本不包含任何使用者介面(甚至沒有終端 UI),主要負責充當快速緩衝區操作引擎,忠實於 Vim 擊鍵。它仍在進行中,還有很多工作需要穩定。
如果您正在尋找終端 Vim,請查看 neovim,或 GUI Vim,請查看 Onivim 2。
libvim
主要用於Onivim 2。 ” ' 是(editor state, input) => (new editor state)
的函數。由於 Onivim 2 完全處理渲染層,因此這個 Vim 建模的純函數可以專注於緩衝區操作。
為此, libvim
公開了一個簡單的 C API 來與 Vim 配合使用,並支援監聽緩衝區變更、訊息等。
它負責:
它不負責:
所有這些都旨在由庫的使用者來處理 - 讓libvim
專注於快速緩衝區操作的工作。
libvim
建構跨平台(因為 Onivim 2 需要它!),以及 WebAssembly - 我們希望將 v1 教學移植到基於瀏覽器的體驗。
這種「抽象 Vim」還有其他有趣的應用:
readline
的良好基礎。 有關 API 用法的範例,請查看 apitest,例如 normal_mode_motion。完整的 API 可以在這裡找到:libvim.h
API 的核心是vimInput
,它採用單一金鑰,並由狀態機同步處理。緩衝區更新、訊息等「副作用」可以透過像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
工作流程非常適合一次性構建,但每次都會重建世界,因此在開發過程中最好採用增量工作流程。
cd src
make apitest/autoindent.test.exe
cd apitest
./autoindent.test.exe
您可以透過在 Onivim 2 package.json
中新增解決方案來針對本地建置的 Onivim 2 測試本地建置的libvim
,例如:
"resolutions" : {
...
"libvim" : " link:../libvim/src "
}
只需確保它指向libvim/src
資料夾即可。
注意:我們已經看到此工作流程有問題,其中 Onivim 2 中的二進位檔案可能已過期,因此我們建議在每次變更後執行
rm -rf _esy && esy i
以重建依賴關係。
libvim
基於 Vim 而不是 Neovim?我是 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 套件 - 我們可以重新訪問它!)。我對 WebAssembly 建置感興趣,用於將 Onivim v1 教程移植到網路上,其中這個編譯為 WebAssembly 的 C 抽象程式庫將是一個完美的選擇。
除了建置問題之外,Neovim 和 Vim 都需要重構才能提供同步的功能性 API:
所有這些工作的動機是從 Onivim v2 中刪除 RPC 層以減少複雜性和故障模式 - 最終,這純粹是基於約束的技術決策。如果我們可以使用nvim
獲得類似的 API,可以透過esy
跨平台建立 - 我很樂意使用它:)
如果您對libvim
感興趣,並且您想支援開發,請考慮以下事項:
如果您想協助改進libvim
,請參閱 CONTRIBUTING.md 檔案。
一些貢獻的地方:
libvim
不需要的程式碼或功能libvim
程式碼已根據 MIT 許可證獲得許可。
它還依賴第三方代碼,特別是 Vim,但也依賴其他代碼 - 有關許可證詳細信息,請參閱 ThirdPartyLicenses.txt。