Neovim 0.9.0

good-penguin.png

7-го апреля был тихо и незаметно опубликован новый мажорный релиз Neovim 0.9.0. В этой версии было исправлены более 300 ошибок, проведён рефакторинг исходного кода, а также были добавлены новые возможности и удалены устаревшие.

Осторожно, простыня:

Несовместимые изменения:

  • Удалена поддержка cscope:

    • Удалённые команды:
      • :cscope
      • :lcscope
      • :scscope
      • :cstag
    • Удалённые опции:
      • cscopepathcomp
      • cscopeprg
      • cscopequickfix
      • cscoperelative
      • cscopetag
      • cscopetagorder
      • cscopeverbose
    • Удалённые функции:
      • cscope_connection()
  • Удалена команда :hardcopy и соответствующие ей опции:

    • printdevice
    • printencoding
    • printexpr
    • printfont
    • printheader
    • printmbcharset
  • Опция paste помечена как устаревшая, а pastetoggle удалена. paste работает автоматически в графическом и текстовом интерфейсах Nvim.
    Просто вставь.™ [sic.]

  • Изменения в vim.treesitter.get_node_text():

    • Теперь эта функция всегда возвращает строку вместо string|string[]|nil.
    • Опция concat была удалена, так как она применялась непоследовательно.
    • Недействительные диапазоны теперь вызывают ошибку вместо того, чтобы возвращать nil.
  • Treesitter-парсер help был переименован в vimdoc. Единственное изменение, которое затронет пользователей, заключается в том, что специфичные для языков группы подсветки должны быть переименованы из @foo.help в @foo.vimdoc.

  • Значение по умолчанию для переменной commentstring теперь пустое вместо /*%s*/.

  • Теперь для сборки Nvim требуются libiconv и intl.

Новые возможности

  • Подсветка синтаксиса Treesitter для файлов help теперь поддерживает подсвеченные примеры кода. Для включения необходимо создать файл .config/nvim/ftplugin/help.lua со следующим содержимым:
vim.treesitter.start()
  • В клиент LSP добавлена поддержка подсветки семантических токенов. Эта функциональность включена по умолчанию в тех случаях, когда к буферу подключен клиент, поддерживающий эту возможность. Отключить её можно путём удаления semanticTokensProvider из раздела {server_capabilities} в обратном вызове LspAttach.

  • vim.inspect_pos(), vim.show_pos() и :Inspect позволяют получить или показать элементы в указанной позиции в буфере. На текущий момент это работает для объектов, захваченных Treesitter«ом, семантических токенов LSP, синтаксических групп, и расширенных меток (extmarks).

  • vim.treesitter.inspect_tree() и :InspectTree открывают разделённое окно, отображающее текстовое представление узлов в языковом дереве для текущего буфера.

  • Опция statuscolumn для настройки области сбоку от окна, обычно содержащей колонки складок, знаков и номеров строк. Эта новая опция использует синтаксис statusline и может использоваться для преобразований над номерами строк, создания обратных вызовов, для кликов мышкой по знакам, добавления пользовательских отступов и разделителей и т. д.

  • vim.secure.trust() и :trust позволяют управлять файлами в базе данных доверенных файлов. vim.secure.read() читает файл и запрашивает у пользователя, можно ли доверять этому файлу, и, если да, то возвращает содержимое файла. Используется в exrc.

  • Поддержка EditorConfig теперь встроена в Neovim. Она включена по умолчанию и срабатывает автоматически. Для её выключения необходимо добавить

vim.g.editorconfig = false

или Vimscript-эквивалент в файл конфигурации.

  • Новая переменная окружения NVIM_APPNAME позволяет указывать каталоги, в которых Neovim должен искать свои файлы конфигурации и состояния.

  • Добавлена поддержка запуска сценариев Lua из оболочки командной строки при помощи опции -l.

nvim -l foo.lua --arg1 --arg2

Также работает и с stdin:

echo "print(42)" ` nvim -l -
  • Добавлена реализация omnifunc для Lua, vim.lua_omnifunc().

  • Добавлен новый экспериментальный lua-loader, который байт-компилирует и кэширует файлы. Для включения нового загрузчика нужно добавить следующую строку в начало файла init.lua:

vim.loader.enable()
  • Добавлена функция lua-version для разбора и сравнения строк версий, соответствующих спецификации semver.

  • Если Nvim используется в Tmux 3.2 или более новой версии, то поставщик буфера обмена по умолчанию теперь копирует в системный буфер обмена (provider-clipboard).

  • Опция showcmdloc для отображения информации showcmd в строке статуса или заголовке вкладки. Появился новый элемент строки статуса %S для отображения текста showcmd в пользовательской statusline. Полезно в случаях, когда для cmdheight установлено значение 0.

  • Опция splitkeep для контроля поведения прокрутки горизонтально разделённых окон.

  • У diffopt теперь есть опция linematch для включения «второго уровня» diff для индивидуальных участков, что позволяет получать более точные diff«ы. Эта опция также доступна для vim.diff()

  • Добавлена опция --remote-ui для подключения к удалённому экземпляру программы и отображения её в текстовом интерфейсе в локальном терминале. Это позволяет запускать экземпляр Nvim в фоне и отображать его интерфейс по запросу, что ранее было возможно только при использовании сторонних реализаций пользовательского интерфейса.

  • Добавлена функция vim.lsp.codelens.clear() для очистки «линз кода» (codelenses).

  • В клиент LSP добавлена поддержка возможностей willSave и willSaveWaitUntil. willSaveWaitUntil позволяет серверу модифицировать документ перед сохранением. Примером использования для языковых серверов может быть удаление неиспользуемых импортов или форматирование файла.

  • В клиент LSP добавлена начальная поддержка возможности workspace/didChangeWatchedFiles для уведомления серверов об изменениях файла на диске. Эта функция выключена по умолчанию и может быть включена опцией workspace.didChangeWatchedFiles.dynamicRegistration=true.

  • vim.diagnostic теперь поддерживает LSP DiagnosticsTag.

  • vim.diagnostic.is_disabled() проверяет, отключена ли диагностика в данном буфере или пространстве имён.

  • Захваты Treesitter теперь могут быть преобразованы в директивы. Это позволяет более сложные внедрения для динамических языков.

  • vim.treesitter.get_node_text() теперь принимает опцию metadata для записи пользовательских директив при помощи vim.treesitter.query.add_directive().

  • Функция vim.treesitter.language.require_language заменена на vim.treesitter.language.add().

  • vim.treesitter.foldexpr() может использоваться в foldexpr, что позволяет использовать Treesitter для задания складок.

  • API TSNode расширено следующими функциями:

    • TSNode:tree()
    • TSNode:has_changes()
    • TSNode:extra()
    • TSNode:equal()
      Дополнительно, TSNode:range() теперь принимает опциональный аргумент {include_bytes}.
  • Запросы внедрения Treesitter теперь используют формат, описанный здесь. Поддержка предыдущего формата будет удалена в будущем выпуске.

  • Добавлена функция nvim_get_hl() для получения определений групп подсветки в формате, совместимом с nvim_set_hl().

  • Добавлена функция vim.filetype.get_option() для получения значения по умолчанию для конкретного типа файлов. Это кэширующая обёртка вокруг nvim_get_option_value().

  • require'bit' — теперь всегда доступный lua-bit

Изменённые функции.

  • exrc теперь поддерживает файл .nvim.lua.

  • exrc больше не помечена как устаревшая опция.

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

    Ранее TUI мог быть выключен при сборке (опции +tui/-tui), при этом собранный экземпляр мог быть запущен только в режиме без интерфейса (headless) или встроенным во внешний процесс. Начиная с текущей версии, TUI доступен всегда.

  • Функция Vim has('gui_running') теперь поддерживается для плагинов как способ проверки того, что к Nvim присоединён графический, а не текстовый, интерфейс.

  • Опция msgsep теперь всегда включена, даже если display не содержит флага «msgsep». Теперь при отображении сообщений, длина которых больше cmdheight, не будет прокручиваться весь экран.

  • Вызовы API теперь отображают больше информации о том, где возникло исключение.

  • Пользовательский интерфейс win_viewport теперь содержит информацию о виртуальных строках, что позволяет более однообразно реализовать плавную прокрутку.

  • Синтаксис := {expr} можно использовать для выполнения выражений Lua, как более короткую форму :lus ={expr}. := и :[range]= без аргументов оставлены без изменений. Однако, :=# и похожие варианты, использующие ex-flags, больше не поддерживаются.

  • Теперь при закрытии channel-stdio несохраненные изменения сохраняются, а не сбрасываются.

  • Функция nvim_open_win() теперь принимает опцию mouse для открытия плавающего окна, расположенного относительно курсора мыши. Учтите, что мышка редко обновляется, если не задана опция vim.o.mousemoveevent = true.

  • Функция nvim_eval_statusline() поддерживает выполнение statuscolumn через новое поле opts: use_statuscol_lnum.

  • Функция nvim_buf_get_extmarks() теперь принимает -1 в качестве ns_id для запроса расширенных меток из всех пространств имён и добавляет идентификатор пространства имён к массиву details. Остальные недостающие свойства были также добавлены к массиву details, и метки теперь можно фильтровать по типу.

  • Функция vim.diagnostic.open_float() (а, следовательно, и vim.diagnostic.config()) теперь принимают опцию suffix, которая по умолчанию показывает коды ошибок LSP. Конфигурация virtual_text в vim.diagnostic.config() теперь также имеет опцию suffix, которая по умолчанию ничего не делает.

  • Функция vim.fs.dir() теперь принимает аргумент opts, содержащий поле глубины, что делает возможным рекурсивный поиск в дереве каталогов.

  • Функция vim.gsplit() поддерживает все возможности vim.split().

  • Команда :highlight теперь поддерживает дополнительный атрибут altfont.

  • Просмотрщик страниц документации :Man теперь поддерживает имена страниц с пробелами.

  • Функция nvim_select_popupmenu_item() теперь поддерживает всплывающее меню cmdline-completion.

  • Функция nvim_list_uis() сообщает все поля ui-option.

  • Функция nvim_get_option_value() теперь принимает опцию filetype, которая возвращает опцию по умолчанию для конкретного типа файлов.

  • Произведён ряд улучшений сборки, которые повышают детерминистичность скриптов генерации кода, и добавляют параметр сборки LUA_GEN_PRG, позволяющий обойти некоторые оставшиеся проблемы с воспроизводимостью.

Удалённые возможности.

  • filetype.vim удалён в пользу lua-filetype (Учтите, что логика типов файлов и тесты всё ещё согласованы с Vim, поэтому добавления и изменения должны сначала вноситься туда.)

  • Удалены опции hkmap, hkmapp и aleph. Вместо них предлагается использовать опцию keymap.

  • LanguageTree:parse() больше не возвращает изменённые области. Взамен можно использовать обратные вызовы on_changedtree.

  • Удалены функции vim.highlight.create() и vim.highlight.link(), их заменяет функция nvim_set_hl().

  • Удалена функция require'health', вместо неё предлагается использовать vim.health.

Следующие функции объявлены устаревшими и будут удалены в будущем выпуске:

  • Функция vim.treesitter.language.require_language() заменена на vim.treesitter.language.add().

  • Функции vim.treesitter.get_node_at_pos() и vim.treesitter.get_node_at_cursor() объявлены устаревшими в пользу vim.treesitter.get_node().

  • Функции vim.api.nvim_get_hl_by_name() и vim.api.nvim_get_hl_by_id() объявлены устаревшими в пользу nvim_get_hl().

  • Следующие функции верхнего уровня Treesitter были перемещены:

  vim.treesitter.inspect_language()    -> vim.treesitter.language.inspect()  
  vim.treesitter.get_query_files()     -> vim.treesitter.query.get_files()  
  vim.treesitter.set_query()           -> vim.treesitter.query.set()  
  vim.treesitter.query.set_query()     -> vim.treesitter.query.set()  
  vim.treesitter.get_query()           -> vim.treesitter.query.get()  
  vim.treesitter.query.get_query()     -> vim.treesitter.query.get()  
  vim.treesitter.parse_query()         -> vim.treesitter.query.parse()  
  vim.treesitter.query.parse_query()   -> vim.treesitter.query.parse()  
  vim.treesitter.add_predicate()       -> vim.treesitter.query.add_predicate()  
  vim.treesitter.add_directive()       -> vim.treesitter.query.add_directive()  
  vim.treesitter.list_predicates()     -> vim.treesitter.query.list_predicates()  
  vim.treesitter.list_directives()     -> vim.treesitter.query.list_directives()  
  vim.treesitter.query.get_range()     -> vim.treesitter.get_range()  
  vim.treesitter.query.get_node_text() -> vim.treesitter.get_node_text()  
  • Функция nvim_exec() объявлена устаревшей в пользу nvim_exec2().

  • Функция vim.pretty_print переименована в vim.print.

Полный (и весьма внушительный) список изменений, бинарные сборки и исходные коды доступны по ссылке:

>>> подробности

©  Linux.org.ru