smjonas / inc-rename.nvim

Incremental LSP renaming based on Neovim's command-preview feature.
MIT License
667 stars 9 forks source link
neovim neovim-plugin

inc-rename.nvim

A small Neovim plugin that provides a command for LSP renaming with immediate visual feedback thanks to Neovim's command preview feature.

Installation

This plugin requires at least Neovim 0.8

Install using your favorite package manager and call the setup function.

lazy.nvim ```lua { "smjonas/inc-rename.nvim", config = function() require("inc_rename").setup() end, } ```
packer.nvim ```lua use { "smjonas/inc-rename.nvim", config = function() require("inc_rename").setup() end, } ```
vim-plug ```vim Plug 'smjonas/inc-rename.nvim' ``` Somewhere in your init.lua, you will need to call the setup function: ```lua require("inc_rename").setup() ```

Usage

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](https://github.com/folke/noice.nvim), you can enable the `inc_rename` preset like this: ```lua 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](https://github.com/stevearc/dressing.nvim), set the `input_buffer_type` option to `"dressing"`: ```lua 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:

> :bulb: Tip - try these `dressing.nvim` settings to position the input box above the > cursor to not cover the word being renamed (thank you > [@RaafatTurki](https://github.com/RaafatTurki) for the suggestion!): ```lua require("dressing").setup { input = { override = function(conf) conf.col = -1 conf.row = 0 return conf end, }, } ```

Known issues

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.

Customization

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 (the only supported value is currently "dressing")
  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: