feat(plugins): add close_win and save_close_buf helpers and update mappings for conditional save/close behavior

This commit is contained in:
Prad Nukala committed 2026-10-13 18:27:45 -04:00
1 parent aff99b89f3
commit 29bac037b3
1 file changed
+30 -26
+30 -26
View File
@@ -6,6 +6,21 @@ local ignore_patterns = require "config.ignore_patterns"
local file_filter = ignore_patterns.create_picker_filter() local file_filter = ignore_patterns.create_picker_filter()
-- <C-q>: close the window; only quit (saving all) when it's the last one
local function close_win()
local ok, err = pcall(vim.cmd.close)
if ok then return end
-- E444: last window; E5601: only floating windows would remain
if not tostring(err):find "E444" and not tostring(err):find "E5601" then error(err, 0) end
vim.cmd "wqa"
end
-- <C-c>: save the current buffer only if it has unsaved changes, then close it
local function save_close_buf()
if vim.bo.buftype == "" then vim.cmd "update" end
require("snacks").bufdelete()
end
-- <C-f>e: two-stage find-by-extension. Stage 1 scans the repo with fd -- <C-f>e: two-stage find-by-extension. Stage 1 scans the repo with fd
-- (respects .gitignore) and shows every file extension ranked by count; -- (respects .gitignore) and shows every file extension ranked by count;
-- stage 2 opens fff prefilled with a `*.<ext> ` glob constraint so the -- stage 2 opens fff prefilled with a `*.<ext> ` glob constraint so the
@@ -231,18 +246,11 @@ return {
mappings = { mappings = {
n = { n = {
-- overrides AstroNvim's default <C-q> = force quit (:q!) ["<C-q>"] = { close_win, desc = "Close window (quit if last)" },
["<C-q>"] = { "<Cmd>wqa<CR>", desc = "Save all buffers and quit Neovim" },
["<C-!>"] = { "<Cmd>suspend<CR>", desc = "Suspend nvim (return with 'fg')" }, ["<C-!>"] = { "<Cmd>suspend<CR>", desc = "Suspend nvim (return with 'fg')" },
["ZZ"] = { "<Cmd>wqa<CR>", desc = "Save all buffers and quit Neovim" }, ["ZZ"] = { "<Cmd>wqa<CR>", desc = "Save all buffers and quit Neovim" },
["<A-q>"] = { "<Cmd>wqa<CR>", desc = "Save all buffers and quit Neovim" }, ["<A-q>"] = { "<Cmd>wqa<CR>", desc = "Save all buffers and quit Neovim" },
["<C-c>"] = { ["<C-c>"] = { save_close_buf, desc = "Save (if modified) and close buffer" },
function()
vim.cmd "wa"
require("snacks").bufdelete()
end,
desc = "Save and close buffer",
},
["F"] = { "za", desc = "Toggle fold under cursor" }, ["F"] = { "za", desc = "Toggle fold under cursor" },
-- v6: vim.diagnostic.goto_next/goto_prev deprecated in 0.11, use jump() -- v6: vim.diagnostic.goto_next/goto_prev deprecated in 0.11, use jump()
["J"] = { ["J"] = {
@@ -296,14 +304,17 @@ return {
desc = "Find in line", desc = "Find in line",
}, },
["<C-g>o"] = { function() require("snacks").gitbrowse() end, desc = "Open Repo on Web" }, ["<C-g>o"] = { function() require("snacks").gitbrowse() end, desc = "Open Repo on Web" },
["<C-s>"] = { "<cmd>w<CR>", desc = "Save buffer" }, ["<C-s>"] = {
["<C-w>"] = {
function() function()
vim.cmd "w" if vim.bo.modified and vim.bo.buftype == "" then
require("snacks").bufdelete() vim.cmd "write"
else
require("snacks").picker.buffers()
end
end, end,
desc = "Save and close buffer", desc = "Save if modified, else find buffers",
}, },
["<C-w>"] = { "<Cmd>w<CR>", desc = "Save buffer" },
["<C-Tab>"] = { "<cmd>tabnext<CR>", desc = "Next Tab" }, ["<C-Tab>"] = { "<cmd>tabnext<CR>", desc = "Next Tab" },
["<C-g><C-i>"] = { ["<C-g><C-i>"] = {
function() require("snacks").picker.gh_issue() end, function() require("snacks").picker.gh_issue() end,
@@ -490,10 +501,9 @@ return {
["<C-c>"] = { ["<C-c>"] = {
function() function()
vim.cmd "stopinsert" vim.cmd "stopinsert"
vim.cmd "wa" save_close_buf()
require("snacks").bufdelete()
end, end,
desc = "Save, close buffer, and return to normal mode", desc = "Save (if modified), close buffer, and return to normal mode",
}, },
["<C-x>"] = { ["<C-x>"] = {
function() function()
@@ -505,13 +515,7 @@ return {
}, },
}, },
v = { v = {
["<C-c>"] = { ["<C-c>"] = { save_close_buf, desc = "Save (if modified) and close buffer" },
function()
vim.cmd "w"
require("snacks").bufdelete()
end,
desc = "Save and close buffer",
},
["<C-x>"] = { ["<C-x>"] = {
function() function()
vim.cmd "w" vim.cmd "w"
@@ -568,9 +572,9 @@ return {
["<C-q>"] = { ["<C-q>"] = {
function() function()
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes([[<C-\><C-n>]], true, false, true), "n", false) vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes([[<C-\><C-n>]], true, false, true), "n", false)
vim.cmd "close" close_win()
end, end,
desc = "Exit terminal and close window", desc = "Exit terminal and close window (quit if last)",
}, },
}, },
}, },