libvim
? libvim
adalah cabang dari Vim, dengan tujuan menyediakan API minimal berbasis C, memodelkan pengeditan modal Vim. Ini tidak menyertakan antarmuka pengguna sama sekali (bahkan tidak ada UI terminal), dan terutama bertanggung jawab untuk bertindak sebagai mesin manipulasi buffer cepat, sesuai dengan penekanan tombol Vim. Ini masih dalam proses dan masih banyak pekerjaan yang harus dilakukan untuk menstabilkannya.
Jika Anda mencari terminal Vim, periksa neovim, atau GUI Vim, periksa Onivim 2.
libvim
terutama ditujukan untuk Onivim 2. Setelah mengimplementasikan beberapa iterasi 'UI Vims' antara v1, v2, dan proyek lainnya, abstraksi yang saya inginkan adalah semacam Vim yang berfungsi murni, sepenuhnya dipisahkan dari terminal UI - di mana 'vim ' adalah fungsi dari (editor state, input) => (new editor state)
. Karena Onivim 2 sepenuhnya menangani lapisan rendering, fungsi Vim-modelled-as-a-pure ini dapat fokus pada manipulasi buffer saja.
Untuk itu, libvim
memaparkan C API sederhana untuk bekerja dengan Vim, dan mendukung mendengarkan perubahan buffer, pesan, dll.
Ini bertanggung jawab untuk:
Ini TIDAK bertanggung jawab untuk:
Semua ini dimaksudkan untuk ditangani oleh konsumen perpustakaan - membiarkan libvim
fokus pada pekerjaan manipulasi buffer cepat.
libvim
membangun lintas platform (karena Onivim 2 memerlukannya!), serta untuk WebAssembly - kami ingin mem-porting tutorial v1 kami ke pengalaman berbasis browser.
Ada aplikasi menarik lainnya dari 'Vim abstrak':
readline
, misalnya. Untuk contoh penggunaan API, lihat apitests seperti normal_mode_motion. API lengkap tersedia di sini: libvim.h
Inti dari API adalah vimInput
yang mengambil satu kunci, dan diproses secara sinkron oleh mesin negara. 'Efek samping' seperti pembaruan buffer, pesan, dll dapat berlangganan melalui panggilan balik seperti vimSetBufferUpdateCallback
.
Pustaka ini sedang dalam pengembangan aktif dan saat ini kami tidak memberikan jaminan mengenai kompatibilitas ke belakang. Gunakan API dengan risiko Anda sendiri.
esy
seperti npm
untuk kode asli. Jika Anda belum memilikinya, instal dengan menjalankan:
npm install -g [email protected]
git clone https://github.com/onivim/libvim
cd src
esy install
esy '@test' install
esy build
esy '@test' build
Alur kerja esy
berfungsi dengan baik untuk pembangunan satu kali, namun akan membangun kembali dunia setiap saat, jadi selama pengembangan, lebih baik memiliki alur kerja tambahan.
cd src
make apitest/autoindent.test.exe
cd apitest
./autoindent.test.exe
Anda dapat menguji libvim
yang dibuat secara lokal terhadap Onivim 2 yang dibuat secara lokal dengan menambahkan resolusi di Onivim 2 package.json
, seperti:
"resolutions" : {
...
"libvim" : " link:../libvim/src "
}
Pastikan saja itu menunjuk ke folder libvim/src
.
CATATAN: Kami telah melihat masalah dengan alur kerja ini di mana binari mungkin kedaluwarsa di Onivim 2, jadi kami menyarankan untuk menjalankan
rm -rf _esy && esy i
setelah setiap perubahan untuk membangun kembali ketergantungan.
libvim
didasarkan pada Vim dan bukan Neovim? Saya penggemar berat pekerjaan yang dilakukan tim Neovim (dan tim tersebut sangat mendukung proyek Onivim). Idealnya, kita tetap menggunakan Neovim atau mengimplementasikan libvim
berdasarkan libnvim
. Faktanya, pertama kali saya mencoba membangun 'abstraksi minimal' ini - saya mencoba mendasarkannya pada libnvim
Neovim. Saya menjadwalkan penyelidikan menjadi 2 hari, dan menemui beberapa rintangan serius - lingkungan build kami agak menantang di Windows (didasarkan pada rantai alat kompiler silang Cygwin + MingW) - Saya mengalami beberapa masalah dalam membuat deps Neovim + di lingkungan tersebut . Berdasarkan lonjakan tersebut, saya memperkirakan diperlukan waktu ~3-4 minggu untuk membuatnya berfungsi di rantai alat tersebut.
Perhatikan bahwa ini bukan masalah Neovim - penggunaan ketergantungan dan pemanfaatan CMake
adalah keputusan yang baik - ini adalah konsekuensi dari sistem pembangunan OCaml kami. Toolchain cross-compiler Cygwin + MingW tidak ditangani dengan baik oleh semua dependensi (sebagai hibrida yang aneh dari Win32 dan Unix, sering kali terjadi #ifdefs yang salah, dependensi yang salah ditarik, dan ini dapat membuang banyak waktu. mengatasi masalah ini).
Vim, sebaliknya, dapat dikompilasi dalam lingkungan tersebut dengan mudah (CATATAN: Jika ada yang tertarik untuk membangun paket Neovim yang esy
-enabled lintas platform - kita dapat meninjaunya kembali!). Saya juga tertarik dengan build WebAssembly, untuk mem-porting tutorial Onivim v1 ke web, di mana pustaka abstrak C yang dikompilasi ke WebAssembly akan sangat cocok.
Di luar masalah pembangunan, Neovim dan Vim memerlukan pemfaktoran ulang untuk menyediakan API yang sinkron dan fungsional:
Motivasi dari semua pekerjaan ini adalah untuk menghapus lapisan RPC dari Onivim v2 untuk mengurangi kompleksitas dan mode kegagalan - pada akhirnya, ini murni keputusan teknis berbasis kendala. Jika kita bisa mendapatkan API serupa, yang dapat dibangun melalui lintas platform esy
, dengan nvim
- saya akan dengan senang hati menggunakannya :)
Jika libvim
menarik bagi Anda, dan Anda ingin mendukung pengembangan, pertimbangkan hal berikut:
Jika Anda ingin membantu menjadikan libvim
lebih baik, lihat file CONTRIBUTING.md.
Beberapa tempat untuk berkontribusi:
libvim
kode libvim
dilisensikan di bawah Lisensi MIT.
Itu juga bergantung pada kode pihak ketiga, terutama Vim, tetapi juga yang lain - lihat ThirdPartyLicenses.txt untuk detail lisensi.