diff --git a/lua/symbols-outline.lua b/lua/symbols-outline.lua index 3f23601..41ccaab 100644 --- a/lua/symbols-outline.lua +++ b/lua/symbols-outline.lua @@ -136,6 +136,10 @@ local function setup_keymaps(bufnr) vim.api.nvim_buf_set_keymap(bufnr, "n", "", ":lua require('symbols-outline.hover').show_hover()", {}) + -- rename symbol + vim.api.nvim_buf_set_keymap(bufnr, "n", "r", + ":lua require('symbols-outline.rename').rename()", + {}) -- close outline when escape is pressed vim.api.nvim_buf_set_keymap(bufnr, "n", "", ":bw!", {}) end diff --git a/lua/symbols-outline/rename.lua b/lua/symbols-outline/rename.lua new file mode 100644 index 0000000..0401155 --- /dev/null +++ b/lua/symbols-outline/rename.lua @@ -0,0 +1,37 @@ +local vim = vim + +local state = require('symbols-outline').state + +local M = {} + +local function get_rename_params(node, winnr) + local bufnr = vim.api.nvim_win_get_buf(winnr) + local fn = "file://" .. vim.api.nvim_buf_get_name(bufnr) + + return { + textDocument = {uri = fn}, + position = {line = node.line, character = node.character}, + bufnr = bufnr + } +end + +function M.rename() + local current_line = vim.api.nvim_win_get_cursor(state.outline_win)[1] + local node = state.flattened_outline_items[current_line] + + local params = get_rename_params(node, state.code_win) + + local new_name = vim.fn.input("New Name: ", node.name) + if not new_name or new_name == "" or new_name == node.name then return end + + params.newName = new_name + + vim.lsp.buf_request(params.bufnr, "textDocument/rename", params, + function(_, _, result) + if result ~= nil then + vim.lsp.util.apply_workspace_edit(result) + end + end) +end + +return M