Я работаю в Tabnine последние два года.

Tabnine — это потрясающая программа для генерации кода с использованием ИИ, которая работает непосредственно в вашей среде IDE, обеспечивая полнофункциональное автодополнение кода в режиме реального времени.

Хотя Tabnine работает с несколькими IDE, он не поддерживает полнофункциональные дополнения в Vim (точнее, Neovim), который я предпочитаю.

Мне было несколько неудобно работать над продуктом, с которым я не мог работать каждый день, поэтому я решил сделать полнофункциональные дополнения доступными в Vim.

Начиная

Поработав над нашими плагинами VS Code и Intellij, я знал, что сначала мне нужно убедиться, что API виртуальных линий существует в Neovim.

Я погуглил и нашел это.

Большой!

Хотя я работаю с Vim уже много лет — и у меня довольно приличный набор конфигураций — я никогда ничего для него не разрабатывал — в основном я копировал и вставлял конфигурации других плагинов в свой файл init.vim.

Итак, с чего мне начать?

Я знал из прошлого опыта (в основном из использования других плагинов), что плагины Neovim написаны на Lua или Viml.

Viml ни на что не похож, поэтому его сразу же исключили, а я никогда не программировал на Lua… и синтаксис выглядел немного… мда.

Надеясь, что мне удастся избежать использования Lua, я искал в Интернете другие решения.

Это было первое, что бросилось мне в глаза.

Узловой клиент для Neovim! Бум, на большее я и не надеялся. Моей первоначальной мыслью было создать форк проекта tabnine-vscode (написанного на машинописном языке) и быстро внести коррективы в Neovim. Я рассчитывал, что это займет у меня 2 дня, вершины!

1 час спустя, и я был уже расстроен. Документации почти не было даже на самые простые вещи. Мне едва удалось запустить самый простой пример.

Я попытался найти плагины Neovim, написанные с помощью этого SDK, чтобы понять, с чего начать. Их практически не было. Я посмотрел репозиторий node-client — он почти не обслуживался. Но я еще не был готов сдаться.

Потратив несколько часов на настройку плагина tabnine-vscode, мне удалось запустить базовую конфигурацию. Но он все еще чувствовал себя непропеченным. Однако без документации или примеров я застрял. Я понял, что иду по ложному пути.

Я искал страницу Neovim’s GitHub, где нашел pynvim — Python-клиент для Neovim. Большой! Люди любят Python! Я предполагал, что плагинов для Python будет огромное количество. Неправильный. К моему удивлению, их почти не было.

Окей, я понял, Неовим. Я выучу Lua!

Принятие моей судьбы

Согласно Lua.org, Lua был создан как встроенный язык программирования общего назначения, предназначенный для поддержки процедурного программирования со средствами описания данных.

Среда выполнения Neovim для Lua довольно проста, поэтому я понимаю, почему разработчики выбирают ее.

Глобальный объект Vim

Nevim предоставляет глобальный объект vim для взаимодействия со своим API, например:

vim.fn.col(“.”), чтобы получить текущий столбец под курсором.

или vim.api.nvim_buf_set_text для добавления текста в буфер.

Документация этого API великолепна, и ее легко найти с помощью команды :help.

Я также узнал, что в то время как сам Lua пропускает простые операции, такие как array.map или string.split (или таблицы на жаргоне Lua), Neovim предоставляет их, например vim.tbl_map или vim.fn.split.

Простота

В Lua отсутствуют фигурные области видимости, которые мне не нравятся в языках программирования. Но я научился любить его простоту. Синтаксис напоминает другие языки высокого уровня — в отличие от Viml.

Нет причудливого/сложного синтаксиса, к которому вам нужно привыкнуть, что сокращает кривую обучения.

По сути, Lua отлично справляется со своей задачей, которую нужно встроить в другие платформы.

Lua-модули

  • Модули Lua напоминают модули Javascript commonjs
  • У Vim есть понятие пути выполнения, список каталогов, в которых он ищет модули во время выполнения.
  • Vimplug (и другие менеджеры плагинов) загружает плагины в путь выполнения для вас.
  • Когда модуль Lua находится в пути среды выполнения, его можно легко загрузить, используя require(‘module-name’) внутри вашего init.vim/init.lua.

Документация

Vimdocs отлично справляется со всеми функциями Lua в глобальном объекте Vim.

Документация по Lua тоже неплохая. Сайт выглядит что-то из 90-х, но содержание приличное.

Краткое содержание

Я определенно могу понять, почему все выбирают Lua при написании плагинов для Neovim.

Такое ощущение, что клиенты node и Python — это просто неудачный эксперимент команды Neovim по упрощению разработки плагинов, в то время как Lua работает именно так, как и задумывалось.

Кроме того, когда вы преодолеваете кривую изучения нового языка, это даже просто и, осмелюсь сказать, радостно!

Вывод: Используйте Lua при разработке плагинов для Neovim. Возможно, вам даже понравится 🙂

Tabnine для neovim — попробуйте! https://github.com/codota/tabnine-nvim