libvim
? libvim
é um fork do Vim, com o objetivo de fornecer uma API mínima baseada em C, modelando a edição modal do Vim. Ele não inclui nenhuma interface de usuário (nem mesmo uma UI de terminal) e é o principal responsável por atuar como um mecanismo rápido de manipulação de buffer, fiel às teclas do Vim. Ainda é um trabalho em andamento e ainda há muito trabalho para estabilizar.
Se você está procurando um terminal Vim, dê uma olhada no neovim, ou uma GUI Vim, dê uma olhada no Ovivim 2.
libvim
é destinado principalmente ao Onivim 2. Depois de implementar várias iterações de 'UI Vims' entre v1, v2 e outros projetos, a abstração que eu desejava ter era uma espécie de Vim funcional puro, completamente desacoplado da UI do terminal - onde 'vim 'é uma função de (editor state, input) => (new editor state)
. Como o Ovivim 2 lida completamente com a camada de renderização, esta função modelada pelo Vim como uma função pura poderia se concentrar apenas na manipulação do buffer.
Para esse fim, libvim
expõe uma API C simples para trabalhar com o Vim e suporta a escuta de alterações de buffer, mensagens, etc.
É responsável por:
NÃO é responsável por:
Tudo isso deve ser tratado pelo consumidor da biblioteca - deixando libvim
focado no trabalho de manipulação rápida do buffer.
libvim
compila multiplataforma (já que o Ovivim 2 exige isso!), bem como para WebAssembly - gostaríamos de portar nossos tutoriais v1 para uma experiência baseada em navegador.
Existem outras aplicações interessantes desse 'Vim abstrato':
readline
, por exemplo. Para obter um exemplo de uso da API, verifique os apitests como normal_mode_motion. A API completa está disponível aqui: libvim.h
O coração da API é vimInput
, que usa uma única chave e é processado de forma síncrona pela máquina de estado. 'Efeitos colaterais' como atualizações de buffer, mensagens, etc. podem ser assinados por meio de retornos de chamada como vimSetBufferUpdateCallback
.
Esta biblioteca está em desenvolvimento ativo e atualmente não oferecemos garantias sobre compatibilidade com versões anteriores. Use a API por sua conta e risco.
esy
é como npm
para código nativo. Se você ainda não o possui, instale-o executando:
npm install -g [email protected]
git clone https://github.com/onivim/libvim
cd src
esy install
esy '@test' install
esy build
esy '@test' build
O fluxo de trabalho esy
funciona muito bem para compilações únicas, mas sempre reconstruirá o mundo, portanto, durante o desenvolvimento, é melhor ter um fluxo de trabalho incremental.
cd src
make apitest/autoindent.test.exe
cd apitest
./autoindent.test.exe
Você pode testar um libvim
construído localmente em relação a um Ovivim 2 construído localmente adicionando uma resolução no package.json
Ovivim 2.json , como:
"resolutions" : {
...
"libvim" : " link:../libvim/src "
}
Apenas certifique-se de que aponta para a pasta libvim/src
.
NOTA: Vimos problemas com este fluxo de trabalho em que os binários podem estar desatualizados no Ovivim 2, por isso recomendamos executar
rm -rf _esy && esy i
após cada alteração para reconstruir a dependência.
libvim
é baseado no Vim e não no Neovim? Sou um grande fã do trabalho que a equipe do Neovim está fazendo (e a equipe tem apoiado incrivelmente o projeto Ovivim). Idealmente, teríamos ficado com o Neovim ou implementado libvim
baseado em libnvim
. Na verdade, a primeira vez que tentei construir essa 'abstração mínima' - tentei baseá-la no libnvim
do Neovim. Limitei o tempo da investigação para 2 dias e encontrei alguns obstáculos sérios - nosso ambiente de construção é um pouco desafiador no Windows (é baseado no conjunto de ferramentas de compilador cruzado Cygwin + MingW) - encontrei vários problemas para fazer o Neovim + deps construir naquele ambiente . Com base nesse pico, estimei que levaria cerca de 3 a 4 semanas para que funcionasse nesse conjunto de ferramentas.
Observe que este não é um problema do Neovim - o uso de dependências e o aproveitamento do CMake
são boas decisões - é uma consequência do nosso sistema de construção OCaml. O conjunto de ferramentas do compilador cruzado Cygwin + MingW não é bem tratado por todas as dependências (sendo um estranho híbrido de Win32 e Unix, geralmente é o caso em que #ifdefs estão errados, dependências incorretas são atraídas e pode ser uma grande perda de tempo trabalhando com essas questões).
O Vim, por outro lado, foi capaz de compilar facilmente nesse ambiente (NOTA: Se alguém estiver interessado em construir um pacote Neovim multiplataforma habilitado para esy
- podemos revisitar isso!). Também estou interessado em compilações WebAssembly, para portar os tutoriais do Ovivim v1 para a web, nos quais esta biblioteca C-abstrata compilada para WebAssembly seria uma opção perfeita.
Além dos problemas de construção, tanto o Neovim quanto o Vim precisariam de refatoração para fornecer essa API funcional e síncrona:
A motivação de todo esse trabalho foi remover a camada RPC do Ovivim v2 para reduzir a complexidade e os modos de falha - no final, isso foi puramente uma decisão técnica baseada em restrições. Se conseguirmos uma API semelhante, construível via plataforma cruzada esy
, com nvim
- ficarei feliz em usá-la :)
Se libvim
for interessante para você e você quiser apoiar o desenvolvimento, considere o seguinte:
Se você quiser ajudar a melhorar libvim
, consulte o arquivo CONTRIBUTING.md.
Alguns locais para contribuição:
libvim
O código libvim
é licenciado sob a licença MIT.
Também depende de código de terceiros, principalmente do Vim, mas também de outros - consulte ThirdPartyLicenses.txt para obter detalhes da licença.