Долгожданный релиз NeoVim 0.5.0 наконец-то вышел 2 июля 2021 года. Это заняло больше времени, чем кто-либо ожидал, но это того стоило. Более 4000 коммитов, это так много, что сломало некоторые инструменты выпуска. Поэтому эти заметки не смогут затронуть каждое из многочисленных изменений, которые были внесены в ходе разработки, и будут сосредоточены только на наиболее заметных для пользователя улучшениях, самыми крупными из которых являются:
Напомним, что Lua-это небольшой язык сценариев, предназначенный для встраивания и часто используемый, например, в разработке игр. Кроме того, существует компилятор just-in-time ( LuaJIT , который Neovim использует на платформах, где он доступен), который может обеспечить впечатляющую производительность при выполнении соответствующих задач. По сути, Lua был выбран по сравнению с другими языками, потому что это
Соответственно, в течение цикла разработки 0.5 произошел резкий рост числа Lua плагинов, начиная от переписывания популярных плагинов Vimscript до совершенно новых, которые были бы невозможны в Vimscript – часто от авторов, которые были совершенно новичками в разработке (neo)vim плагинов и не хотели изучать Vimscript для этой задачи. В качестве положительного побочного эффекта длительного цикла разработки многие из них уже являются полнофункциональными и стабильными на момент выпуска версии 0.5!
Вот небольшой и нерепрезентативный список плагинов Lua:
Не все эти плагины на самом деле написаны на Lua: существует множество других языков (некоторые из которых типизированы), которые компилируются в Lua, например
Подробное и актуальное руководство по использованию Lua для сценариев и конфигурации Neovim см. в Getting started using Lua in Neovim. Defaults.nvim хороший пример конфига на Lua использующий init.lua.
Идея состоит в том, чтобы разделить эти функции на независимый от редактора, но зависящий от языка сервер и независимый от языка, но зависящий от редактора клиент, которые взаимодействуют через 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 на момент написания), включая семантическую подсветку.
Цель состоит в том, чтобы заменить текущий синтаксис на основе регулярных выражений vim на tree-sitter, не только для лучшей и быстрой подсветки синтаксиса, но и для новых и улучшенных способов редактирования структурированного текста. Тем не менее, поддержка tree-sitter в версии 0.5 по-прежнему должна рассматриваться как “ранний доступ”: она работает достаточно хорошо, чтобы протестировать и посмотреть, что возможно, но на нее не следует полагаться для продуктивного использования из-за ряда серьезных ошибок и снижения производительности, которые необходимо устранить, прежде чем tree-sitter в Neovim может быть объявлена стабильной. Обратите также внимание, что включение подсветки на основе дерева для языка в настоящее время полностью отключает внутренний механизм синтаксиса на основе регулярных выражений для этого типа файлов, что может привести к нарушению других функций, которые зависят от него. Устранение этих проблем и улучшение API будет основным направлением цикла разработки, ведущего к выпуску 0.6.
Кроме того, сам Neovim предоставляет только API (Lua) для создания и запроса синтаксического дерева с использованием библиотеки, входящей в комплект; см. :h treesitter. Функции, ориентированные на пользователя, подобные упомянутым выше, реализованы в таких плагинах, как
В частности, это означает, что языковые серверы могут использовать семантическую информацию из другого файла для аннотации дерева для текущего файла: например, переменная, объявленная как const в одном файле, может быть выделена красным цветом, если она используется в другом файле, чего не может сделать tree-sitter, поскольку он имеет доступ только к текущему файлу при подсветке.
Для получения более подробной информации смотрите презентацию TJ DeVries на эту тему.
Следующие макеты уведомлений, взятые из поста @sunjon , показывают, чего можно достичь с помощью этого API в сочетании с LuaJIT:
au TextYankPost * lua vim.highlight.on_yank {higroup="IncSearch", timeout=150, on_visual=true}
См. :h vim.highlight.on_yank() для дополнительных параметров конфигурации.
(Приведенные выше ссылки относятся к комнатам, доступ к которым осуществляется через веб-клиент Matrix Element, вы также можете получить доступ к нему через любой из многих других клиентов Matrix.
Помимо этого, важными целями являются улучшение обнаружения изменений файлов, а также дальнейшее отделение TUI (пользовательского интерфейса терминала) от ядра Neovim с целью обеспечения возможности удаленных экземпляров TUI.
Наконец, мы стремимся к более регулярным и частым выпускам (по крайней мере, для исправлений), которые, надеюсь, устранят необходимость в меме “когда neovim 0.6?” для разнообразия.
Источник статьи: https://habr.com/ru/post/569550/
- 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.
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 .
Не все эти плагины на самом деле написаны на Lua: существует множество других языков (некоторые из которых типизированы), которые компилируются в Lua, например
- Fennel(Lisp) от Aniseed или Fennel-nvim
- Teal
- Amulet ML
- MoonScript от nvim-moonmaker
- Vim9script (в качестве доказательства концепции )
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
- поиск и замену
Цель состоит в том, чтобы заменить текущий синтаксис на основе регулярных выражений 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 - структурное редактирование текста (т. е. поиск и замена с учетом синтаксиса).
В чем разница между 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 стран. Если вы пропустили ее, то вы можете посмотреть лекции в плейлисте YoutubeTwitch
Еще одним последствием пандемии стал рост интереса к прямой трансляции разработок с открытым исходным кодом на 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:- Lua API – Поддержка большего количества объектов в Lua ( autocommands , mappings , commands ).
- LSP – Улучшенный API конфигурации, полное соответствие 3.16 (включая семантическую подсветку).
Помимо этого, важными целями являются улучшение обнаружения изменений файлов, а также дальнейшее отделение TUI (пользовательского интерфейса терминала) от ядра Neovim с целью обеспечения возможности удаленных экземпляров TUI.
Наконец, мы стремимся к более регулярным и частым выпускам (по крайней мере, для исправлений), которые, надеюсь, устранят необходимость в меме “когда neovim 0.6?” для разнообразия.
Благодарности
Большое спасибо всем, кто участвовал в проекте, который помог сделать Neovim 0.5 реальностью, будь то авторы, спонсоры, репортеры или сторонники.Источник статьи: https://habr.com/ru/post/569550/