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.
Полный (и весьма внушительный) список изменений, бинарные сборки и исходные коды доступны по ссылке:
>>> подробности














