-- ============================================================================= -- keymaps.lua — 基础键位映射 -- ============================================================================= local keymap = vim.keymap.set -- Leader 键 vim.g.mapleader = " " vim.g.maplocalleader = " " -- 编辑器操作 keymap("n", "w", "w", { desc = "保存" }) -- 关闭当前 buffer / 窗口(VSCode 风格) keymap("n", "q", function() local bt = vim.bo.buftype local ft = vim.bo.filetype -- 统计文件 buffer 数量 local file_bufs = 0 for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do if vim.api.nvim_buf_is_loaded(bufnr) then local b = vim.bo[bufnr] if b.buftype == "" and b.filetype ~= "" and b.filetype ~= "NvimTree" and b.filetype ~= "dashboard" then file_bufs = file_bufs + 1 end end end -- dashboard:无文件直接退出 if ft == "dashboard" then vim.cmd("qa") return end -- nvim-tree:有文件关闭树,无文件退出 if ft == "NvimTree" then if file_bufs == 0 then vim.cmd("qa") else vim.cmd("NvimTreeClose") end return end -- quickfix:cclose if bt == "quickfix" then vim.cmd("cclose") return end -- 其他特殊 buffer:关闭窗口(失败则退出) if bt ~= "" then local ok = pcall(vim.cmd, "close") if not ok then vim.cmd("qa") end return end -- 普通文件:根据数量决定退出或关闭 if file_bufs <= 1 then vim.cmd("qa") else vim.cmd("Bdelete") end end, { desc = "关闭当前 buffer/窗口" }) keymap("n", "/", "noh", { desc = "清除搜索高亮" }) -- 窗口导航 keymap("n", "", "h", { desc = "跳到左边窗口" }) keymap("n", "", "j", { desc = "跳到下面窗口" }) keymap("n", "", "k", { desc = "跳到上面窗口" }) keymap("n", "", "l", { desc = "跳到右边窗口" }) -- 窗口操作 keymap("n", "sv", "vsplit", { desc = "垂直分屏" }) keymap("n", "sh", "split", { desc = "水平分屏" }) keymap("n", "sc", "close", { desc = "关闭窗口" }) -- Buffer 导航 keymap("n", "", "bprevious", { desc = "下一个 buffer" }) keymap("n", "", "bnext", { desc = "上一个 buffer" }) -- Buffer 操作 keymap("n", "bc", "Bdelete", { desc = "关闭当前 buffer" }) keymap("n", "bs", "wall", { desc = "保存全部" }) keymap("n", "bo", function() local current = vim.api.nvim_get_current_buf() local special_ft = { NvimTree = true, dashboard = true, [""] = true } -- 检查是否有未保存的文件 buffer local unsaved = {} for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do if vim.api.nvim_buf_is_loaded(bufnr) then local ft = vim.bo[bufnr].filetype local bt = vim.bo[bufnr].buftype -- 只统计普通文件 buffer if bt == "" and not special_ft[ft] and bufnr ~= current then if vim.bo[bufnr].modified then table.insert(unsaved, bufnr) end end end end local function close_others(force) for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do if vim.api.nvim_buf_is_loaded(bufnr) and bufnr ~= current then local ft = vim.bo[bufnr].filetype local bt = vim.bo[bufnr].buftype -- 只关闭普通文件 buffer,保留 nvim-tree/dashboard 等 if bt == "" and not special_ft[ft] then vim.api.nvim_buf_delete(bufnr, { force = force }) end end end end if #unsaved > 0 then vim.ui.select({ "保存全部", "强制关闭(不保存)", "取消" }, { prompt = "有 " .. #unsaved .. " 个未保存的 buffer" }, function(choice) if not choice then return end if choice == "保存全部" then for _, bufnr in ipairs(unsaved) do vim.api.nvim_buf_call(bufnr, function() vim.cmd("write") end) end close_others(false) elseif choice == "强制关闭(不保存)" then close_others(true) end end) else close_others(false) end end, { desc = "关闭其他 buffer" }) -- 文件树 keymap("n", "e", "NvimTreeToggle", { desc = "文件树" }) -- 终端 keymap("n", "", "ToggleTerm", { desc = "终端" }) keymap("t", "", "ToggleTerm", { desc = "终端" })