A small Neovim plugin that provides a command for LSP renaming with immediate visual feedback thanks to Neovim's command preview feature.
inc_rename_demo.mp4
This plugin requires at least Neovim 0.8
Install using your favorite package manager and call the setup function.
lazy.nvim
{
"smjonas/inc-rename.nvim",
opts = {}
}packer.nvim
use {
"smjonas/inc-rename.nvim",
config = function()
require("inc_rename").setup()
end,
}vim-plug
Plug 'smjonas/inc-rename.nvim'Somewhere in your init.lua, you will need to call the setup function:
require("inc_rename").setup()Simply type :IncRename <new_name> while your cursor is on an LSP identifier.
You could also create a keymap that types out the command name for you so you only have to
enter the new name:
vim.keymap.set("n", "<leader>rn", ":IncRename ")If you want to fill in the word under the cursor you can use the following:
vim.keymap.set("n", "<leader>rn", function()
return ":IncRename " .. vim.fn.expand("<cword>")
end, { expr = true })💥 noice.nvim support
If you are using noice.nvim, you can enable the inc_rename preset like this:
require("noice").setup {
presets = { inc_rename = true }
}Then simply type the :IncRename command (or use the keymap mentioned above).
🌸 dressing.nvim support
If you are using dressing.nvim,
set the input_buffer_type option to "dressing":
require("inc_rename").setup {
input_buffer_type = "dressing",
}Then simply type the :IncRename command and the new name you enter will automatically be updated in the input buffer as you type.
The result should look something like this:
💡 Tip - Try these
dressing.nvimsettings to position the input box above the cursor to not cover the word being renamed (thank you @RaafatTurki for the suggestion!):
require("dressing").setup {
input = {
override = function(conf)
conf.col = -1
conf.row = 0
return conf
end,
},
}🍿 snacks.nvim support
If you are using snacks.nvim and have enabled input, you can set the input_buffer_type option to "snacks":
require("inc_rename").setup {
input_buffer_type = "snacks",
}Then simply type the :IncRename command and the new name you enter will automatically be updated in the input buffer as you type.
The result should look something like this:
There have been reports of inc-rename not working with certain plugins and language servers:
Make sure to uninstall these if you are experiencing issues.
You can override the default settings by passing a Lua table to the setup function.
The default options are:
require("inc_rename").setup {
-- the name of the command
cmd_name = "IncRename",
-- the highlight group used for highlighting the identifier's new name
hl_group = "Substitute",
-- whether an empty new name should be previewed; if false the command preview will be cancelled instead
preview_empty_name = false,
-- whether to display a `Renamed m instances in n files` message after a rename operation
show_message = true,
-- whether to save the "IncRename" command in the commandline history (set to false to prevent issues with
-- navigating to older entries that may arise due to the behavior of command preview)
save_in_cmdline_history = true,
-- the type of the external input buffer to use (currently supports "dressing" or "snacks")
input_buffer_type = nil,
-- callback to run after renaming, receives the result table (from LSP handler) as an argument
post_hook = nil,
}💡 Renaming across multiple files
When renaming across multiple files, make sure to save all affected buffers with
:wa. If the Nvim option inccommand is set to split (:set inccommand=split),
a buffer with information about all identifiers to be renamed will be shown as you type.
Here is an example of how this could look like:
💡 Tip - Use
:set cmdwinheight=20to change the height of the preview window.



