Долгожданный релиз 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, которому не нужно возиться с вашим буфером.
Гораздо более полный список плагинов Neovim можно найти в наполняемом пользователями Awesome Neovim.
Не все эти плагины на самом деле написаны на Lua: существует множество других языков (некоторые из которых типизированы), которые компилируются в Lua, например
Fennel(Lisp) от Aniseed или Fennel-nvim
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
поиск и замену
и более. 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:
Lua API – Поддержка большего количества объектов в Lua ( autocommands , mappings , commands ).
LSP – Улучшенный API конфигурации, полное соответствие 3.16 (включая семантическую подсветку).
Основной целью выпуска 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 становится сильнее вместе!
Thisnickname2019
Вот что удивительно, оно не работает))
То есть vim работает, а nvim с этим же конфигом нет. Вот планирую избавится от этого чуда и работать в vim.
0xd34df00d
А я как раз два дня назад перешёл на neovim, после того, как потратил примерно полдня на попытки настройки undercurl в виме. Потребовалось ровно ноль изменений в конфиге. Все плагины работают так же хорошо, как и раньше.
Thisnickname2019
Странно. У меня в основном ругань на отсутствие питона, но я все отключил, питон, руби и перл. Причём только одно решение в гугле переустановить pyvim и всё. Дня два упражняюсь в установках, плагинах, настройках.
0xd34df00d
А, ну у меня нет ничего, связанного с питоном. Собственно,
sheshanaag
Аналогично, перешёл с vim на nvim 2 недели назад, но старые плагины не оставил, хотя они и работали, потому что очень уж древние. Адаптировал .vimrc в init.vim, установил lsp, treesitter, compe, из языковых серверов установил clangd и hls, смотрю на это и не вижу причин для возврата к vim
0xd34df00d
В hls, кстати, у вас ренейминг работает? Я для lsp использую coc (его ридмишка по hls рекомендует), и coc ругается, что мой language server не поддерживает ренеймы.
sheshanaag
Похоже что не работает:
```
RPC[Error] code_name = MethodNotFound, message = "method textDocument/rename is not supported by any of the servers registered for the current buffer"
```
См. https://github.com/haskell/haskell-language-server/issues/190 и (follow up) https://github.com/haskell/haskell-language-server/issues/282.
Но компиляция и hlint работают замечательно (кстати, hls кажется еще не поддерживает ghc 9.0.1)
0xd34df00d
О, а я 282 (номер-то какой) не нашёл при беглом поиске по ишшуезам. Ну что ж, ждём.
wingman (или hls-tactics-plugin) пробовали, кстати? Прикольно кейс-сплиттить.
sheshanaag
Раньше не пробовал, сейчас попробовал )) Да, type-holes удобно разворачивать без стороннего запуска ghc. LSP вообще довольно новая фича (по крайней мере, для меня, я ею только 2 недели пользуюсь), так что там много чего интересного еще можно нарыть.
csl
Как с поддержкой LaTex, Idris 2, Agda?
0xd34df00d
Всё просто работает (правда, idris 2 пока не пробовал).