[Перевод] Вышел NeoVim 0.5.0

43c477a63edf9633840868a32f8c59ff.jpg

Долгожданный релиз NeoVim 0.5.0 наконец-то вышел 2 июля 2021 года. Это заняло больше времени, чем кто-либо ожидал, но это того стоило. Более 4000 коммитов, это так много, что сломало некоторые инструменты выпуска. Поэтому эти заметки не смогут затронуть каждое из многочисленных изменений, которые были внесены в ходе разработки, и будут сосредоточены только на наиболее заметных для пользователя улучшениях, самыми крупными из которых являются:

  • Lua как превосходный язык сценариев и конфигурации.

  • Протокол языкового сервера (Language server protocol) (LSP).

  • Treesitter (ранний доступ).

Lua везде

Neovim 0.5 далеко продвинулся в том, чтобы сделать Lua основным языком сценариев для Neovim, как для разработки плагинов, так и для настройки пользователей.

Напомним, что Lua-это небольшой язык сценариев, предназначенный для встраивания и часто используемый, например, в разработке игр. Кроме того, существует компилятор just-in-time (LuaJIT, который Neovim использует на платформах, где он доступен), который может обеспечить впечатляющую производительность при выполнении соответствующих задач. По сути, Lua был выбран по сравнению с другими языками, потому что это

  • компактный — идеально подходит для встраивания (в отличие от remote plugin host).

  • быстрый — LuaJIT может быть на несколько порядков быстрее, чем в vimscript (и Lua без JIT).

  • простой — небольшой, но выразительный синтаксис (в Lua 5.1) сделан для сценариев. Neovim предоставляет «стандартную библиотеку» внутренних функций с помощью API.

Для получения более подробной информации об этом выборе см. презентацию Джастина М. Кейса на Vim Conf 2019 и презентацию Ти Джея ДеВриса на Vimconf.live.

Lua плагины.

Neovim предоставляет свой API изначально через Lua, например, vim.api.nvim_open_win(). Он также предоставляет методы для доступа к командам и переменным vimscript (ex) например, через vim.cmd("echo 'foo") и vim.g.syntax_on соответственно. Это позволяет писать плагины с теми же возможностями, что и в Vimscript, используя производительность Lua (JIT) при выполнении основных задач языка программирования, таких как циклы. Также можно использовать собственную экосистему плагинов luarocks от Lua.

Соответственно, в течение цикла разработки 0.5 произошел резкий рост числа Lua плагинов, начиная от переписывания популярных плагинов Vimscript до совершенно новых, которые были бы невозможны в Vimscript — часто от авторов, которые были совершенно новичками в разработке (neo)vim плагинов и не хотели изучать Vimscript для этой задачи. В качестве положительного побочного эффекта длительного цикла разработки многие из них уже являются полнофункциональными и стабильными на момент выпуска версии 0.5!

Вот небольшой и нерепрезентативный список плагинов Lua:

  • Plenary — Библиотека полезных утилит для разработки плагинов Neovim (некоторые из которых позже будут интегрированы в ядро).

  • Packer — менеджер пакетов с поддержкой зависимостей плагинов, ленивой загрузки и установки luarocks.

  • Telescope — Очень расширяемый нечеткий искатель по спискам.

  • Gitsigns — плагин для отображения и взаимодействия с изменениями файлов в репозитории git (асинхронный).

  • Nvim-compe — платформа автоматического завершения для различных источников, включая встроенный LSP-клиент Neovim.

  • Nvim-dap — реализация протокола адаптера отладки для пошаговой отладки вашего кода.

  • Colorizer — Высокопроизводительный цветной маркер для Neovim без каких-либо внешних зависимостей.

  • Formatter — для асинхронного запуска внешних инструментов форматирования в текущем буфере или диапазоне.

  • Hop.nvim — плагин для перемещения, подобный EasyMotion, которому не нужно возиться с вашим буфером.

  • Neogit — Интерфейс Git, похожий на Magit .

Гораздо более полный список плагинов Neovim можно найти в наполняемом пользователями Awesome Neovim.

Не все эти плагины на самом деле написаны на Lua: существует множество других языков (некоторые из которых типизированы), которые компилируются в Lua, например

Lua конфиг

Также возможно писать конфиги пользователя в Lua: если есть init.lua, он считывается вместо init.vim (они не могут сосуществовать, и наличие обоих в вашем каталоге конфигурации приведет к ошибке), а файлы .lua в каталогах времени выполнения (plugin/, colorscheme/, after/ и т.д.) будут выполнены в дополнение к (после) файлам Vimscript. Обратите внимание, что это совершенно необязательно и не требуется для использования новых функций, представленных в Neovim 0.5; кроме того, не каждый параметр конфигурации Vimscript имеет эквивалент полностью на Lua. Расширение собственного API для их охвата также является частью цели Neovim 0.6.

Подробное и актуальное руководство по использованию Lua для сценариев и конфигурации Neovim см. в Getting started using Lua in Neovim. Defaults.nvim хороший пример конфига на Lua использующий init.lua.

Language server protocol (LSP).

Протокол языкового сервера Language Server Protocol (LSP) это открытый протокол на основе JSON-RPC для связи между редакторами кода и языковыми серверами, которые предоставляют функции, зависящие от языка программирования, такие как

  • дополнение (completion)

  • всплывающие подсказки

  • переход к определению (go to definition)

  • показ/переход к ссылкам (show/go to references)

  • показ сигнатур методов (show method signatures)

  • переименование

  • действия с кодом (автоматичекое форматирование, упорядочивание импортов).

и другое.

Идея состоит в том, чтобы разделить эти функции на независимый от редактора, но зависящий от языка сервер и независимый от языка, но зависящий от редактора клиент, которые взаимодействуют через language server protocol через RPC. (Следует отметить, что не каждый сервер реализует все функции, и качество ответов может сильно различаться. «Эталонная реализация» в коде VS также часто добавляет нестандартные функции, которые не охватываются самим LSP.)

Neovim 0.5 предоставляет клиент LSP, написанный (в основном) на языке Lua, который обеспечивает легко настраиваемый и расширяемый способ доступа к этим функциям. Он не нацелен на конкуренцию с более многофункциональными и «готовыми» плагинами, такими как CoC.nvim, но предназначен для адаптации к вашим предпочтениям (при этом он все еще может использоваться с разумными значениями по умолчанию). Обзор см. в презентации TJ DeVries на Vimconf.live и его короткое видео.

Для многих языковых серверов Nvim-lspconfig уже предоставляет необходимую конфигурацию, позволяющую легко все настроить. Кроме того, в некоторых языках также есть специальные плагины LSP, которые обеспечивают более интегрированную настройку, например, для Java и Scala .

Чтобы узнать больше о LSP и о том, как его использовать в Neovim, посетите Nvim-lspconfig (включая его Wiki) и прочитайте :h lsp

Ожидайте дополнительной работы над LSP в течение цикла разработки 0.5.x, чтобы обеспечить улучшенные параметры конфигурации и лучшее освещение последней спецификации LSP (версия 3.16 на момент написания), включая семантическую подсветку.

Tree-sitter

Neovim 0.5 добавляет экспериментальную поддержку для tree-sitter, библиотеки, которая преобразует фрагмент кода в синтаксическое дерево инкрементным и устойчивым к ошибкам способом; это означает, что повторная обработка этого кода после редактирования выполняется очень быстро, а ошибки синтаксического анализа, вызванные, например, опечатками, остаются локализованными и не нарушают дальнейший анализ. Затем это дерево можно эффективно запросить для получения синтаксической информации о коде. Это позволяет улучшить и/или ускорить

  • подсветку синтаксиса

  • навигацию по коду

  • рефакторинг

  • работу с text objects и motions

  • поиск и замену

и более. Tree-sitter также позволяет легко выделять части файла по-разному, если они содержат код на другом языке. Чтобы узнать больше о Tree-sitter, посмотрите Tree-sitter — A new parsing system for programming tools — Max Brunsfield.

Цель состоит в том, чтобы заменить текущий синтаксис на основе регулярных выражений vim на tree-sitter, не только для лучшей и быстрой подсветки синтаксиса, но и для новых и улучшенных способов редактирования структурированного текста. Тем не менее, поддержка tree-sitter в версии 0.5 по-прежнему должна рассматриваться как «ранний доступ»: она работает достаточно хорошо, чтобы протестировать и посмотреть, что возможно, но на нее не следует полагаться для продуктивного использования из-за ряда серьезных ошибок и снижения производительности, которые необходимо устранить, прежде чем tree-sitter в Neovim может быть объявлена стабильной. Обратите также внимание, что включение подсветки на основе дерева для языка в настоящее время полностью отключает внутренний механизм синтаксиса на основе регулярных выражений для этого типа файлов, что может привести к нарушению других функций, которые зависят от него. Устранение этих проблем и улучшение API будет основным направлением цикла разработки, ведущего к выпуску 0.6.

Кроме того, сам Neovim предоставляет только API (Lua) для создания и запроса синтаксического дерева с использованием библиотеки, входящей в комплект; см. :h treesitter. Функции, ориентированные на пользователя, подобные упомянутым выше, реализованы в таких плагинах, как

  • Nvim-treesitter — Подсветка, свертки, инкрементальное выделение.

  • Playground — Служебные функции, позволяющие легко отображать проанализированное дерево и выполнять запросы к нему. .

  • Nvim-treesitter-textobjects — Улучшенные текстовые объекты для движений и операторов в стиле vim. .

  • Nvim-refactor — Выделение определений, навигация, интеллектуальное переименование.

  • Architext — структурное редактирование текста (т. е. поиск и замена с учетом синтаксиса).

Более подробную информацию об использовании этих функций можно найти в Nvim-treesitter README или посмотрев презентацию Thomas Vigouroux«s на Vimconf.live.

В чем разница между LSP и tree-sitter?

Это распространенный вопрос, тем более что LSP начиная с версии 3.16 обеспечивает семантическую подсветку. Короче говоря, tree-sitter работает с одним файлом, разбирая файл в синтаксическое дерево, которое используется для поддержки различных расширенных функций навигации по коду и манипулирования. С другой стороны, языковые серверы работают с несколькими файлами и библиотеками проектов, используя различные, зависящие от сервера методы анализа синтаксического дерева каждого файла. (Конечно, tree-sitter является одним из возможных вариантов для этой цели и фактически используется, например, bash-language-server и wasm-language-server.)

В частности, это означает, что языковые серверы могут использовать семантическую информацию из другого файла для аннотации дерева для текущего файла: например, переменная, объявленная как const в одном файле, может быть выделена красным цветом, если она используется в другом файле, чего не может сделать tree-sitter, поскольку он имеет доступ только к текущему файлу при подсветке.

Для получения более подробной информации смотрите презентацию TJ DeVries на эту тему.

Другие изменения

Конечно, это были не единственные серьезные изменения в 0.5. Вот краткое описание новых функций.

Украшения

Улучшенный API украшений позволяет настраивать и взаимодействовать с extmarks (невидимыми текстовыми маркерами, которые перемещаются при редактировании окружающего текста), виртуальным текстом (наложение текста, которое теперь можно рисовать в любом положении на экране) и выделениями (что в значительной степени используется nvim-treesitter).

Следующие макеты уведомлений, взятые из поста @sunjon, показывают, чего можно достичь с помощью этого API в сочетании с LuaJIT:

image-loader.svgimage-loader.svg

Всплывающие окна

API для всплывающих окон теперь включает z-index (позволяющий контролировать, как накладываются плавающие окна) и поддержку границ.

Подсветка при копировании

Neovim теперь имеет встроенную функцию для краткого выделения выделенной области (аналогично https://github.com/machakann/vim-highlightedyank), настраивается с помощью Lua. Чтобы использовать его, вы можете добавить в свой init.vim:

   au TextYankPost * lua vim.highlight.on_yank {higroup="IncSearch", timeout=150, on_visual=true}

См. :h vim.highlight.on_yank() для дополнительных параметров конфигурации.

Исправления Vim

Из более чем 4000 коммитов в этом выпуске около 1000 были исправлениями и обновлениями, перенесенными из Vim — почти все они были сделаны удивительным @janlazo или с его помощью. В частности, файлы среды выполнения (файлы синтаксиса, документация и т.д.) полностью синхронизированы с Vim до мая 2021 года, причем многие более поздние изменения также уже включены.

Сообщество

В соответствии с вступлением этого информационного бюллетеня, одним из наиболее заметных позитивных изменений стал рост сообщества и новых способов взаимодействия с ним.

Discourse

Ранее запросы на поддержку и обсуждения были распространены в обсуждениях Reddit, Gitter и GitHub и были либо эфемерными, либо труднодоступными для поиска. Теперь мы объединились вокруг нового [Neovim Discourse](https://neovim.discourse.group/] , который представляет собой бесплатную платформу форума с открытым исходным кодом с функциями списков рассылки и RSS, в дополнение к приятному веб-интерфейсу. Neovim Discourse является официальным основным проектом и модерируется членами основной команды.

Matrix

Официальный чат для Neovim находится на Gitter. После интеграции Gitter в Matrix доступ к этой комнате теперь также можно получить из Matrix; она также подключена к IRC-сети Libera.chat. В связи с увеличением числа пользователей в настоящее время существуют дополнительные, более специалзированные комнаты для разработки и использования neovim, графических интерфейсов и off-topic chat.

(Приведенные выше ссылки относятся к комнатам, доступ к которым осуществляется через веб-клиент Matrix Element, вы также можете получить доступ к нему через любой из многих других клиентов Matrix.

Vimconf.live

Ксожалению Из-за глобальной пандемии COVID-19, VimConf 2020 пришлось отменить. В место нее появилась виртуальная конференция Vimconf.live, в которой приняли участие 16 докладчиков и более 1000 зарегистрированных участников из 12 стран. Если вы пропустили ее, то вы можете посмотреть лекции в плейлисте Youtube

Twitch

Еще одним последствием пандемии стал рост интереса к прямой трансляции разработок с открытым исходным кодом на Twitch. Многие из выступавших на Vimconf.live — активные стримеры; в частности, TJ DeVries регулярно транслирует свою работу над Neovim как «открытый открытый исходный код», а выпуск Neovim 0.5 транслировался в прямом эфире на его канале.

Разработка NeoVim

Число людей, активно участвующих в разработке Neovim, также выросло. В период с 0.4.4 по 0.5.0 было зарегистрировано 301 уникальных авторов, по сравнению со 112 в период с 0.3.8 по 0.4.4 (сопоставимые временные рамки).

Спонсорство

Теперь вы можете спонсировать Neovim через Github Sponsors или OpenCollective. (BountySource начал вносить тревожные изменения в свое соглашение об условиях предоставления услуг и поэтому больше не рекомендуется).

Что дальше?

Как уже упоминалось, дальнейшие улучшения основных функций, представленных в версии 0.5, произойдут в течение цикла выпуска 0.5.x:

Основной целью выпуска 0.6.0 является обеспечение стабильной и быстрой работы tree-sitter, предназначенного для замены подсветки синтаксиса (и не только). Это включает в себя фундаментальную работу над API украшений, позволяющую выполнять такие вещи, как in-line folding или вставка виртуальных строк и столбцов («антискрытие»).

Помимо этого, важными целями являются улучшение обнаружения изменений файлов, а также дальнейшее отделение TUI (пользовательского интерфейса терминала) от ядра Neovim с целью обеспечения возможности удаленных экземпляров TUI.

Наконец, мы стремимся к более регулярным и частым выпускам (по крайней мере, для исправлений), которые, надеюсь, устранят необходимость в меме «когда neovim 0.6?» для разнообразия.

Благодарности

Большое спасибо всем, кто участвовал в проекте, который помог сделать Neovim 0.5 реальностью, будь то авторы, спонсоры, репортеры или сторонники. Вместо полных кредитов, вот некоторые из людей, которых вы можете поблагодарить за функции, перечисленные в этом письме:

  • @tjdevries, @h-michael, @norcalli, и @mjlbach за клиент LSP;

  • @vigoux, @bfredl, @theHamsta и команду nvim-treesitter за интеграцию tree-sitter;

  • @janlazo за неустанную (и часто неблагодарную) работу по переносу исправлений и обновлений из vim

  • и последнее, но не менее важное: @bfredl за API для украшений, плавающие окна, множество подвигов в магии C-кода и за то что относился серьезно к :smile

Наконец, спасибо @justinmk и @brammool за вашу основополагающую работу и ваши взгляды — сообщество *vim становится сильнее вместе!

© Habrahabr.ru