Skip to main content
  1. Posts/

I read the nvim v0.12 release note so you don't have to

·587 words·3 mins·
Table of Contents

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.

Related