From b08868cf163866509c9bf08ef29637c41d7879bb Mon Sep 17 00:00:00 2001 From: laily Date: Sat, 27 Jun 2026 14:28:18 +0800 Subject: [PATCH] feat: add sudo write --- nvim/lua/config/autocmds.lua | 4 ++++ nvim/lua/utils/init.lua | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/nvim/lua/config/autocmds.lua b/nvim/lua/config/autocmds.lua index 881274f..5380f43 100644 --- a/nvim/lua/config/autocmds.lua +++ b/nvim/lua/config/autocmds.lua @@ -1,3 +1,7 @@ +vim.api.nvim_create_user_command("W", function() + require("utils").sudo_write() +end, { desc = "Write file with sudo (tee)" }) + -- Turn off paste mode when leaving insert vim.api.nvim_create_autocmd("InsertLeave", { pattern = "*", diff --git a/nvim/lua/utils/init.lua b/nvim/lua/utils/init.lua index aae2e7a..d9f4aca 100644 --- a/nvim/lua/utils/init.lua +++ b/nvim/lua/utils/init.lua @@ -28,4 +28,25 @@ function M.file_exists(name) return false end +--- 无写权限时用 sudo 保存当前文件(对应 :W) +function M.sudo_write() + local name = vim.api.nvim_buf_get_name(0) + if name == "" then + vim.notify("W: 当前 buffer 没有文件名", vim.log.levels.ERROR) + return + end + + local ok, err = pcall(function() + vim.cmd("write !sudo tee % > /dev/null") + vim.cmd("edit!") + end) + if not ok then + local msg = vim.split(tostring(err), "\n", { plain = true })[1] + vim.notify("W: 保存失败 — " .. msg, vim.log.levels.ERROR) + return + end + + vim.notify("W: 已保存 " .. name, vim.log.levels.INFO) +end + return M