update dotfiles

This commit is contained in:
2026-07-19 20:39:54 +08:00
parent aef001a855
commit 88c9035c43
18 changed files with 337 additions and 294 deletions
+107 -35
View File
@@ -2,7 +2,7 @@
-- keymaps.lua — 基础键位映射
-- =============================================================================
local keymap = vim.keymap.set
local keymap = vim.keymap.set
-- Leader 键
vim.g.mapleader = " "
@@ -12,41 +12,58 @@ vim.g.maplocalleader = " "
keymap("n", "<leader>w", "<cmd>w<cr>", { desc = "保存" })
-- 关闭当前 buffer / 窗口(VSCode 风格)
-- - quickfix 窗口:cclosecmake-tools 输出窗口)
-- - 普通文件:统计文件 buffer 数量
-- - 只剩 1 个文件 buffer → 退出 nvim(不留下 "no name" 空白)
-- - 多个文件 buffer → Bdelete 关闭当前标签
-- - 其他特殊 buffer(终端等):直接关闭窗口
keymap("n", "<leader>q", function()
local bt = vim.bo.buftype
local ft = vim.bo.filetype
local bt = vim.bo.buftype
local ft = vim.bo.filetype
if bt == "quickfix" then
vim.cmd("cclose")
return
end
if bt ~= "" then
vim.cmd("close")
return
end
-- 统计文件 buffer 数量(排除 nvim-tree/dashboard/quickfix/terminal 等)
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 ~= "" then
file_bufs = file_bufs + 1
end
-- 统计文件 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
end
if file_bufs <= 1 then
vim.cmd("qa")
else
vim.cmd("Bdelete")
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
-- quickfixcclose
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 = "清除搜索高亮" })
@@ -63,12 +80,67 @@ keymap("n", "<leader>sh", "<cmd>split<cr>", { desc = "水平分屏" })
keymap("n", "<leader>sc", "<cmd>close<cr>", { desc = "关闭窗口" })
-- Buffer 导航
keymap("n", "<S-h>", "<cmd>bnext<cr>", { desc = "下一个 buffer" })
keymap("n", "<S-l>", "<cmd>bprevious<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 = "终端" })
keymap("t", "<c-`>", "<cmd>ToggleTerm<cr>", { desc = "终端" })