Вышел NeoVim 0.5.0

Kate

Administrator
Команда форума
Долгожданный релиз 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:

f8948a7d300009e91e3377e743c84c5d.gif
29a8e0696aad01950f3b7a9078416bb1.gif

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

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 реальностью, будь то авторы, спонсоры, репортеры или сторонники.

Источник статьи: https://habr.com/ru/post/569550/
 
Сверху