feat(plugins): add close_win and save_close_buf helpers and update mappings for conditional save/close behavior
This commit is contained in:
1 parent
aff99b89f3
commit
29bac037b3
1 file changed
+30
-26
+30
-26
@@ -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)",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in new issue
Block a user