7-го апреля был тихо и незаметно опубликован новый мажорный релиз Neovim 0.9.0. В этой версии были исправлены более 300 ошибок, проведён рефакторинг исходного кода, а также были добавлены новые возможности и удалены устаревшие.
Осторожно, простыня:
Несовместимые изменения:
-
Удалена поддержка cscope:
- Удалённые команды:
:cscope:lcscope:scscope:cstag
- Удалённые опции:
cscopepathcompcscopeprgcscopequickfixcscoperelativecscopetagcscopetagordercscopeverbose
- Удалённые функции:
cscope_connection()
- Удалённые команды:
-
Удалена команда
:hardcopyи соответствующие ей опции:printdeviceprintencodingprintexprprintfontprintheaderprintmbcharset
-
Опция
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.
Полный (и весьма внушительный) список изменений, бинарные сборки и исходные коды доступны по ссылке:
>>> подробности













