Вышел NeoVim 0.5.0 +12


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

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

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 становится сильнее вместе!




К сожалению, не доступен сервер mySQL