rename_file.lua (1279B)
1 local M = {} 2 3 local function make_rename_files_params(old_fname, new_fname) 4 return { 5 files = -- 6 { -- 7 { -- 8 oldUri = vim.uri_from_fname(old_fname), 9 newUri = vim.uri_from_fname(new_fname), 10 }, 11 }, 12 } 13 end 14 15 function M.rename_file() 16 local old_fname = vim.api.nvim_buf_get_name(0) 17 18 vim.ui.input({ -- 19 prompt = 'filename', 20 default = old_fname, 21 completion = 'file', 22 }, function(new_fname) 23 if not new_fname then 24 return 25 end 26 27 local alreadyRenamed = false 28 for _, client in pairs(vim.lsp.get_clients()) do 29 if vim.tbl_get(client.server_capabilities, 'workspace', 'fileOperations', 'willRename') then 30 local params = make_rename_files_params(old_fname, new_fname) 31 local response = client.request_sync('workspace/willRenameFiles', params, nil, 0) 32 local result = response.result 33 if result then 34 for _, change in ipairs(result.documentChanges) do 35 if change.kind == 'rename' then 36 alreadyRenamed = true 37 end 38 end 39 vim.lsp.util.apply_workspace_edit(result, client.offset_encoding) 40 end 41 end 42 end 43 44 if not alreadyRenamed then 45 vim.lsp.util.rename(old_fname, new_fname) 46 end 47 end) 48 end 49 50 return M