A major Neovim release (version 0.12) has been released a few days ago, after more than one year from the last major release (version 0.11). The following is a list of feature I am interested. For a complete set of features, check full changelog and news.
builtin package manager vim.pack#
Now you can use the builtin vim.pack API to manage your plugins.
Check this detailed post if you want to migrate to vim.pack.
restart command#
Now you can restart nvim without quitting with :restart command.
It makes sense to work with a session management plugin,
otherwise you are just going to the start page.
lsp command#
There is now a :lsp command with sub-command to control LSP behavior.
However, the command LspInfo, LspRestart, LspLog are not there any more.
Here is a snippet to define them:
vim.api.nvim_create_user_command("LspInfo", "checkhealth vim.lsp", {
desc = "Show LSP Info",
})
vim.api.nvim_create_user_command("LspLog", function(_)
local state_path = vim.fn.stdpath("state")
local log_path = vim.fs.joinpath(state_path, "lsp.log")
vim.cmd(string.format("edit %s", log_path))
end, {
desc = "Show LSP log",
})
vim.api.nvim_create_user_command("LspRestart", "lsp restart", {
desc = "Restart LSP",
})showing lsp progress with nvim_echo and LspProgress#
It works on Ghostty terminal:
vim.api.nvim_create_autocmd("LspProgress", {
callback = function(ev)
vim.print(ev.data)
local value = ev.data.params.value
vim.api.nvim_echo({ { value.message or "done" } }, false, {
id = "lsp." .. ev.data.client_id,
kind = "progress",
source = "vim.lsp",
title = value.title,
status = value.kind ~= "end" and "running" or "success",
percent = value.percentage,
})
end,
})See also this discussion.
UI2: no more press Enter#
With UI2, there is not more annoying “Press Enter” prompt after you run a command. To enable it:
require("vim._core.ui2").enable {
enable = true,
msg = { -- Options related to the message module.
---@type 'cmd'|'msg' Default message target, either in the
---cmdline or in a separate ephemeral message window.
---@type string|table<string, 'cmd'|'msg'|'pager'> Default message target
---or table mapping |ui-messages| kinds and triggers to a target.
targets = "cmd",
cmd = { -- Options related to messages in the cmdline window.
height = 0.5, -- Maximum height while expanded for messages beyond 'cmdheight'.
},
dialog = { -- Options related to dialog window.
height = 0.5, -- Maximum height.
},
msg = { -- Options related to msg window.
height = 0.5, -- Maximum height.
timeout = 4000, -- Time a message is visible in the message window.
},
pager = { -- Options related to message window.
height = 0.5, -- Maximum height.
},
},
}You can check the output of command output in real buffer!
If you have ever dealth with the output of :highlight or :map, you know how convenient the new UI is.
Default mapping g< to check the full message (make sure this mapping is not taken by other plugins)
builtin undo tree and diff tool#
These are not enabled by default, you need to enable them manually.
packadd nvim.undotree
Once enabled, you can use :Undotree to check your undo history interactively.
packadd nvim.difftool
Once enabled, you can use :DiffTool to compare two files or directories.
update highlight#
The method nvim_set_hl now has an update option to update a certain attribute of a highlight group.
vim.api.nvim_set_hl(0, "FloatBorder", { fg = "LightGreen", update = true })The above code will update the fg attribute of FloatBorder without affecting other attributes.
This is useful if you want to “fix” a highlight.
making get request#
With vim.net.request(), it is possible to make get request and handle it.
You can now “edit” a URL: :edit https://api.github.com/repos/neovim/neovim,
which is powered by this API.