147 lines
4.5 KiB
Lua
147 lines
4.5 KiB
Lua
-- =============================================================================
|
||
-- keymaps.lua — 基础键位映射
|
||
-- =============================================================================
|
||
|
||
local keymap = vim.keymap.set
|
||
|
||
-- Leader 键
|
||
vim.g.mapleader = " "
|
||
vim.g.maplocalleader = " "
|
||
|
||
-- 编辑器操作
|
||
keymap("n", "<leader>w", "<cmd>w<cr>", { desc = "保存" })
|
||
|
||
-- 关闭当前 buffer / 窗口(VSCode 风格)
|
||
keymap("n", "<leader>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", "<leader>/", "<cmd>noh<cr>", { desc = "清除搜索高亮" })
|
||
|
||
-- 窗口导航
|
||
keymap("n", "<C-h>", "<C-w>h", { desc = "跳到左边窗口" })
|
||
keymap("n", "<C-j>", "<C-w>j", { desc = "跳到下面窗口" })
|
||
keymap("n", "<C-k>", "<C-w>k", { desc = "跳到上面窗口" })
|
||
keymap("n", "<C-l>", "<C-w>l", { desc = "跳到右边窗口" })
|
||
|
||
-- 窗口操作
|
||
keymap("n", "<leader>sv", "<cmd>vsplit<cr>", { desc = "垂直分屏" })
|
||
keymap("n", "<leader>sh", "<cmd>split<cr>", { desc = "水平分屏" })
|
||
keymap("n", "<leader>sc", "<cmd>close<cr>", { desc = "关闭窗口" })
|
||
|
||
-- Buffer 导航
|
||
keymap("n", "<S-h>", "<cmd>bprevious<cr>", { desc = "下一个 buffer" })
|
||
keymap("n", "<S-l>", "<cmd>bnext<cr>", { desc = "上一个 buffer" })
|
||
|
||
-- Buffer 操作
|
||
keymap("n", "<leader>bc", "<cmd>Bdelete<cr>", { desc = "关闭当前 buffer" })
|
||
keymap("n", "<leader>bs", "<cmd>wall<cr>", { desc = "保存全部" })
|
||
keymap("n", "<leader>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", "<leader>e", "<cmd>NvimTreeToggle<cr>", { desc = "文件树" })
|
||
|
||
-- 终端
|
||
keymap("n", "<c-`>", "<cmd>ToggleTerm<cr>", { desc = "终端" })
|
||
keymap("t", "<c-`>", "<cmd>ToggleTerm<cr>", { desc = "终端" })
|
||
|