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