libvim
? libvim
es una bifurcación de Vim, con el objetivo de proporcionar una API mínima basada en C, modelando la edición modal de Vim. No incluye ninguna interfaz de usuario (ni siquiera una interfaz de usuario de terminal) y es el principal responsable de actuar como un motor rápido de manipulación del búfer, fiel a las pulsaciones de teclas de Vim. Todavía es un trabajo en progreso y queda mucho trabajo por estabilizar.
Si está buscando un terminal Vim, consulte neovim, o un GUI Vim, consulte Onivim 2.
libvim
está destinado principalmente a Onivim 2. Después de implementar varias iteraciones de 'UI Vims' entre v1, v2 y otros proyectos, la abstracción que deseaba tener era una especie de Vim funcional puro, completamente desacoplado de la interfaz de usuario del terminal, donde 'vim ' es una función de (editor state, input) => (new editor state)
. Como Onivim 2 maneja completamente la capa de renderizado, esta función modelada-como-pura-de-Vim podría centrarse solo en la manipulación del búfer.
Con ese fin, libvim
expone una API C simple para trabajar con Vim y admite escuchar cambios de búfer, mensajes, etc.
Es responsable de:
NO es responsable de:
Todos estos están destinados a ser manejados por el consumidor de la biblioteca, dejando que libvim
se concentre en el trabajo de manipulación rápida del búfer.
libvim
compila multiplataforma (¡ya que Onivim 2 lo requiere!), así como para WebAssembly: nos gustaría trasladar nuestros tutoriales v1 a una experiencia basada en navegador.
Hay otras aplicaciones interesantes de este tipo de 'Vim abstracto':
readline
, por ejemplo. Para ver un ejemplo del uso de API, consulte las pruebas como normal_mode_motion. La API completa está disponible aquí: libvim.h
El corazón de la API es vimInput
, que toma una única clave y la máquina de estado la procesa sincrónicamente. Se puede suscribir a 'efectos secundarios' como actualizaciones de búfer, mensajes, etc. mediante devoluciones de llamada como vimSetBufferUpdateCallback
.
Esta biblioteca está en desarrollo activo y actualmente no ofrecemos garantías sobre la compatibilidad con versiones anteriores. Utilice la API bajo su propia responsabilidad.
esy
es como npm
para código nativo. Si aún no lo tienes, instálalo ejecutando:
npm install -g [email protected]
git clone https://github.com/onivim/libvim
cd src
esy install
esy '@test' install
esy build
esy '@test' build
El flujo de trabajo esy
funciona muy bien para compilaciones únicas, pero reconstruirá el mundo cada vez, por lo que durante el desarrollo es mejor tener un flujo de trabajo incremental.
cd src
make apitest/autoindent.test.exe
cd apitest
./autoindent.test.exe
Puede probar un libvim
creado localmente con un Onivim 2 creado localmente agregando una resolución en el package.json
de Onivim 2, como:
"resolutions" : {
...
"libvim" : " link:../libvim/src "
}
Solo asegúrese de que apunte a la carpeta libvim/src
.
NOTA: Hemos visto problemas con este flujo de trabajo donde los binarios pueden estar desactualizados en Onivim 2, por lo que recomendamos ejecutar
rm -rf _esy && esy i
después de cada cambio para reconstruir la dependencia.
libvim
se basa en Vim y no en Neovim? Soy un gran admirador del trabajo que está haciendo el equipo de Neovim (y el equipo ha apoyado increíblemente el proyecto Onivim). Lo ideal sería seguir con Neovim o implementar libvim
basado en libnvim
. De hecho, la primera vez que intenté construir esta 'abstracción mínima', intenté basarla en libnvim
de Neovim. Programé la investigación en 2 días y me encontré con algunos obstáculos serios: nuestro entorno de compilación es un poco desafiante en Windows (está basado en la cadena de herramientas del compilador cruzado Cygwin + MingW). Encontré varios problemas para lograr que los departamentos de Neovim + construyan en ese entorno. . Basado en ese pico, calculé que tomaría entre 3 y 4 semanas hacerlo funcionar en esa cadena de herramientas.
Tenga en cuenta que esto no es un problema de Neovim: el uso de dependencias y el aprovechamiento de CMake
son buenas decisiones; es una consecuencia de nuestro sistema de compilación OCaml. La cadena de herramientas del compilador cruzado Cygwin + MingW no es bien manejada por todas las dependencias (al ser un híbrido extraño de Win32 y Unix, a menudo ocurre que #ifdefs son incorrectos, se incorporan dependencias incorrectas y puede ser una gran pérdida de tiempo). resolver estos problemas).
Vim, por el contrario, pudo compilar en ese entorno fácilmente (NOTA: si alguien está interesado en crear un paquete Neovim multiplataforma habilitado esy
, ¡podemos volver a visitarlo!). También estoy interesado en las compilaciones de WebAssembly, para trasladar los tutoriales de Onivim v1 a la web, en las que esta biblioteca extraída de C compilada en WebAssembly encajaría perfectamente.
Más allá de los problemas de compilación, tanto Neovim como Vim necesitarían refactorización para proporcionar esa API funcional y sincrónica:
La motivación de todo este trabajo fue eliminar la capa RPC de Onivim v2 para reducir la complejidad y los modos de falla; al final, esto fue una decisión puramente técnica basada en restricciones. Si podemos obtener una API similar, que se pueda construir a través de esy
multiplataforma, con nvim
, estaré feliz de usarla :)
Si libvim
es interesante para usted y le gustaría apoyar el desarrollo, considere lo siguiente:
Si desea ayudar a mejorar libvim
, consulte el archivo CONTRIBUTING.md.
Algunos lugares para contribuir:
libvim
El código libvim
tiene la licencia MIT.
También depende del código de terceros, en particular Vim, pero también de otros; consulte ThirdPartyLicenses.txt para obtener detalles sobre la licencia.