local M = {} local formatFx = function() require("conform").format({ async = true }) end local renameCurrentBuffer = function() local old_name = vim.fn.expand("%:p") local new_name = vim.fn.input("New name: ", vim.fn.expand("%:p:h") .. "/") if new_name == "" then print("No new name provided") return elseif new_name == old_name then return end vim.cmd("write") local success, err = os.rename(old_name, new_name) if not success then print("Error renaming file: " .. err) return end vim.cmd("edit " .. new_name) vim.cmd("bdelete " .. old_name) end -- 通用映射函数 local function apply_mappings(maps, prefix) for _, map in ipairs(maps) do local new_map = { keys = prefix .. map.keys, cmd = map.cmd, opts = map.opts, } table.insert(M, new_map) end end vim.api.nvim_create_user_command("Rename", renameCurrentBuffer, {}) local leader_mappings = { general = { { keys = "-", cmd = ":split", opts = { desc = "Split to down" } }, { keys = "\\", cmd = ":vsplit", opts = { desc = "Split to right" } }, { keys = "|", cmd = ":vsplit", opts = { desc = "Split to right" } }, { keys = "h", cmd = "h", opts = { desc = "Left Window" } }, { keys = "n", cmd = "j", opts = { desc = "Down Window" } }, { keys = "e", cmd = "k", opts = { desc = "Up Window" } }, { keys = "i", cmd = "l", opts = { desc = "Right Window" } }, { keys = "", cmd = "b#", opts = { desc = "Switch to last buffer" } }, { keys = '"', cmd = ":!wezterm-gui &", pots = { desc = "Open External Terminal(wezterm)" } }, }, b = { -- +buffer { keys = "0", cmd = "b#", opts = { desc = "Switch to last buffer" } }, { keys = "1", cmd = ":BufferLineGotoBuffer 1", opts = { desc = "Switch to Buffer #1" } }, { keys = "2", cmd = ":BufferLineGotoBuffer 2", opts = { desc = "Switch to Buffer #2" } }, { keys = "3", cmd = ":BufferLineGotoBuffer 3", opts = { desc = "Switch to Buffer #3" } }, { keys = "4", cmd = ":BufferLineGotoBuffer 4", opts = { desc = "Switch to Buffer #4" } }, { keys = "5", cmd = ":BufferLineGotoBuffer 5", opts = { desc = "Switch to Buffer #5" } }, { keys = "6", cmd = ":BufferLineGotoBuffer 6", opts = { desc = "Switch to Buffer #6" } }, { keys = "7", cmd = ":BufferLineGotoBuffer 7", opts = { desc = "Switch to Buffer #7" } }, { keys = "8", cmd = ":BufferLineGotoBuffer 8", opts = { desc = "Switch to Buffer #8" } }, { keys = "9", cmd = ":BufferLineGotoBuffer 9", opts = { desc = "Switch to Buffer #9" } }, { keys = "b", cmd = ":BufferLinePick", opts = { desc = "Quick Switch Buffers" } }, { keys = "d", cmd = ":bdelete", opts = { desc = "Delete Buffer" } }, { keys = "D", cmd = ":BufferLineCloseOthers", opts = { desc = "Delete Other Buffers" } }, { keys = "xx", cmd = ":BufferLineCloseOthers", opts = { desc = "Delete Other Buffers" } }, { keys = "xh", cmd = ":BufferLineCloseLeft", opts = { desc = "Delete Buffers Left" } }, { keys = "xi", cmd = ":BufferLineCloseRight", opts = { desc = "Delete Buffers Right" } }, { keys = "X", cmd = ":BufferLineCloseOthers", opts = { desc = "Delete Other Buffers" } }, { keys = "h", cmd = ":bprevious", opts = { desc = "Previous Buffer" } }, { keys = "i", cmd = ":bnext", opts = { desc = "Next Buffer" } }, { keys = "H", cmd = ":bfirst", opts = { desc = "First Buffer" } }, { keys = "I", cmd = ":blast", opts = { desc = "Last Buffer" } }, { keys = "0", cmd = ":bfirst", opts = { desc = "First Buffer" } }, { keys = "^", cmd = ":bfirst", opts = { desc = "First Buffer" } }, { keys = "$", cmd = ":blast", opts = { desc = "Last Buffer" } }, { keys = "s", cmd = ":new", opts = { desc = "Scratch buffers" } }, { keys = "t", cmd = ":BufferLineTogglePin", opts = { desc = "Pin Buffer" } }, { keys = "y", cmd = ":%y+", opts = { desc = "Copy Buffer to Clipboard" } }, }, c = { -- +code/compile { keys = "R", cmd = vim.lsp.buf.rename, opts = { desc = "Rename symbol under cursor" } }, { keys = "f", cmd = formatFx, opts = { desc = "Format buffer" } }, }, f = { -- +file/find { keys = "n", cmd = ":new", opts = { desc = "New File" } }, { keys = "s", cmd = ":write", opts = { desc = "Save File" } }, { keys = "S", cmd = ":wall", opts = { desc = "Save All Files" } }, { keys = "D", cmd = "!trash-rm %", opts = { desc = "Delete current file" } }, -- { keys = "t", cmd = ":NvimTreeFindFileToggle", opts = { desc = "Toggle File Tree" } }, -- { keys = "o", cmd = ":!open %", opts = { desc = "Open file in default program" } }, { keys = "R", cmd = renameCurrentBuffer, opts = { desc = "Rename current file" } }, { keys = "x", cmd = ":Lazy", opts = { desc = "Open extension view" } }, { keys = "yy", cmd = ":let @+ = expand('%:p')", opts = { desc = "Copy file path" } }, { keys = "yY", cmd = ":let @+ = expand('%')", opts = { desc = "Copy relative file path" } }, { keys = "yn", cmd = ":let @+ = expand('%:t')", opts = { desc = "Copy file name" } }, { keys = "yN", cmd = ":let @+ = expand('%:t:r')", opts = { desc = "Copy file name without extension" } }, { keys = "yd", cmd = ":let @+ = expand('%:p:h')", opts = { desc = "Copy directory path" } }, { keys = "yl", cmd = ":let @+ = expand('%:p') . ':' . line('.')", opts = { desc = "Copy file path with line number" }, }, { keys = "yL", cmd = ":let @+ = expand('%') . ':' . line('.')", opts = { desc = "Copy relative file path with line number" }, }, }, g = { -- +git/version control }, j = { -- +lsp { keys = "r", cmd = vim.lsp.buf.references, opts = { desc = "Show current reference" } }, }, p = { -- +project }, q = { -- +quit { keys = "q", cmd = ":q", opts = { desc = "Quit" } }, { keys = "Q", cmd = ":qa!", opts = { desc = "Force Quit" } }, { keys = "w", cmd = ":wq", opts = { desc = "Write and Quit" } }, { keys = "W", cmd = ":wall:qa!", opts = { desc = "Write all and Force Quit" } }, }, t = { -- +toggle/test { keys = "f", cmd = ":NvimTreeToggle", opts = { desc = "Toggle File Explorer" } }, { keys = "F", cmd = ":FormatToggle", opts = { desc = "Toggle autoformat-on-save" } }, }, u = { -- +ui { keys = " ", cmd = ":set list!", opts = { desc = "Toggle show all symbols" } }, }, w = { -- +window { keys = "h", cmd = "h", opts = { desc = "Left Window" } }, { keys = "j", cmd = "j", opts = { desc = "Down Window" } }, { keys = "k", cmd = "k", opts = { desc = "Up Window" } }, { keys = "l", cmd = "l", opts = { desc = "Right Window" } }, { keys = "H", cmd = "H", opts = { desc = "Move Window Left" } }, { keys = "J", cmd = "J", opts = { desc = "Move Window Down" } }, { keys = "K", cmd = "K", opts = { desc = "Move Window Up" } }, { keys = "L", cmd = "L", opts = { desc = "Move Window Right" } }, { keys = "-", cmd = ":split", opts = { desc = "Split to down" } }, { keys = "|", cmd = ":vsplit", opts = { desc = "Split to right" } }, { keys = "/", cmd = ":vsplit", opts = { desc = "Split to right" } }, { keys = "d", cmd = "c", opts = { desc = "Close Window" } }, { keys = "D", cmd = "o", opts = { desc = "Close Other Windows" } }, { keys = "r", cmd = "r", opts = { desc = "Rotate Windows" } }, { keys = "R", cmd = "R", opts = { desc = "Reverse Rotate Windows" } }, { keys = "t", cmd = "T", opts = { desc = "Move Window to New Tab" } }, { keys = "]", cmd = ":resize +5", opts = { desc = "Increase Window Size" } }, { keys = "[", cmd = ":resize -5", opts = { desc = "Decrease Window Size" } }, { keys = "M", cmd = ":resize:vertical resize", opts = { desc = "Maximize window size" } }, }, } for key, maps in pairs(leader_mappings) do if key == "general" then apply_mappings(maps, "") else apply_mappings(maps, "" .. key) end end return M