aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--nvim/.config/nvim/lua/tobyvin/autocmds.lua4
-rw-r--r--nvim/.config/nvim/lua/tobyvin/keymaps.lua37
-rw-r--r--nvim/.config/nvim/lua/tobyvin/utils.lua110
3 files changed, 69 insertions, 82 deletions
diff --git a/nvim/.config/nvim/lua/tobyvin/autocmds.lua b/nvim/.config/nvim/lua/tobyvin/autocmds.lua
index b626c91..71fe5d4 100644
--- a/nvim/.config/nvim/lua/tobyvin/autocmds.lua
+++ b/nvim/.config/nvim/lua/tobyvin/autocmds.lua
@@ -5,7 +5,7 @@ M.setup = function()
vim.api.nvim_create_autocmd("User", {
group = augroup_user,
- pattern = "BDeletePre",
+ pattern = "bdelete",
callback = function(opts)
local windows = vim.tbl_filter(function(win)
return vim.api.nvim_win_get_buf(win) == opts.bufnr
@@ -32,7 +32,7 @@ M.setup = function()
end
end
end,
- desc = "BDeletePre",
+ desc = "Sets the window to the alternate buffer for bdelete",
})
local augroup_default = vim.api.nvim_create_augroup("Default", { clear = true })
diff --git a/nvim/.config/nvim/lua/tobyvin/keymaps.lua b/nvim/.config/nvim/lua/tobyvin/keymaps.lua
index 8e916d3..aa9c8f3 100644
--- a/nvim/.config/nvim/lua/tobyvin/keymaps.lua
+++ b/nvim/.config/nvim/lua/tobyvin/keymaps.lua
@@ -1,40 +1,13 @@
local utils = require("tobyvin.utils")
local M = {}
-M.quit = function()
- vim.cmd("quit")
-end
-
-M.quit_force = function()
- vim.cmd("quit!")
-end
-
-M.write = function()
- vim.cmd("write")
-end
-
-M.write_force = function()
- vim.cmd("write!")
-end
-
-M.close = function()
- utils.bdelete()
- -- vim.cmd("bdelete")
-end
-
-M.close_force = function()
- utils.bdelete({ force = true })
- -- vim.cmd("bdelete!")
-end
-
M.setup = function()
local nmap = utils.create_map_group("n", "<leader>")
- nmap("q", M.quit, { desc = "Quit" })
- nmap("Q", M.quit_force, { desc = "Quit!" })
- nmap("w", M.write, { desc = "Write" })
- nmap("W", M.write_force, { desc = "Write!" })
- nmap("c", M.close, { desc = "Close" })
- nmap("C", M.close_force, { desc = "Close!" })
+ nmap("q", utils.quit, { desc = "quit" })
+ nmap("c", utils.bdelete, { desc = "close" })
+ nmap("w", function()
+ vim.cmd("write")
+ end, { desc = "write" })
end
return M
diff --git a/nvim/.config/nvim/lua/tobyvin/utils.lua b/nvim/.config/nvim/lua/tobyvin/utils.lua
index 5b3e932..dd540da 100644
--- a/nvim/.config/nvim/lua/tobyvin/utils.lua
+++ b/nvim/.config/nvim/lua/tobyvin/utils.lua
@@ -1,5 +1,67 @@
local M = {}
+---@param retry fun(force:boolean?):nil
+M.modified_prompt_retry = function(retry)
+ local bufname = vim.fn.bufname(vim.fn.bufname())
+
+ vim.ui.select({ "write", "discard", "abort" }, {
+ prompt = string.format("No write since last change for buffer %s:", bufname),
+ kind = "select_normal",
+ }, function(_, idx)
+ if idx == 1 then
+ vim.cmd("write")
+ retry()
+ elseif idx == 2 then
+ retry(true)
+ else
+ vim.notify(
+ string.format("No write since last change for buffer %d", bufname),
+ vim.log.levels.ERROR,
+ { title = "Aborting..." }
+ )
+ end
+ end)
+end
+
+---@param cmd string vim command
+---@param force boolean
+M.win_buf_kill = function(cmd, force)
+ local winid = vim.fn.win_getid()
+ local bufnr = vim.fn.winbufnr(winid)
+
+ if not force and vim.bo[bufnr].modified then
+ return M.modified_prompt_retry(M[cmd])
+ end
+
+ vim.api.nvim_exec_autocmds("User", { pattern = cmd })
+
+ if (string.sub(cmd, 1, 1) == "b" and vim.api.nvim_buf_is_valid(bufnr)) or vim.api.nvim_win_is_valid(winid) then
+ vim.cmd(cmd .. (force and "!" or ""))
+ end
+
+ vim.api.nvim_exec_autocmds("User", { pattern = cmd })
+end
+
+---@param force boolean
+M.bdelete = function(force)
+ M.win_buf_kill("bdelete", force)
+end
+
+---@param force boolean
+M.bwipeout = function(force)
+ M.win_buf_kill("bwipeout", force)
+end
+
+---@param force boolean
+M.close = function(force)
+ M.win_buf_kill("close", force)
+end
+
+---@param force boolean
+M.quit = function(force)
+ M.win_buf_kill("quit", force)
+end
+
M.escape = function()
local key = "<ESC>"
vim.api.nvim_replace_termcodes(key, true, false, true)
@@ -17,54 +79,6 @@ M.get_visual_range = function()
-- return { { line = start_pos[2], col = start_pos[3] }, { line = end_pos[2], col = end_pos[3] } }
end
---- Wrapper for bdelete/bwipeout to add a write/discard modified selection and fire autocmd event
----@param opts ?BdeleteOpts
----@return nil
-M.bdelete = function(opts)
- ---@class BdeleteOpts
- ---@field bufnr number Number of the buffer to target
- ---@field force boolean Discard modified buffer
- ---@field wipeout boolean Wipeout buffer
- opts = opts or {}
-
- if opts.bufnr == nil or opts.bufnr == 0 then
- opts.bufnr = vim.api.nvim_get_current_buf()
- end
-
- if not opts.force and vim.bo[opts.bufnr].modified then
- return vim.ui.select({ "write", "discard", "abort" }, {
- prompt = string.format("No write since last change for buffer %d:", opts.bufnr),
- kind = "select_normal",
- }, function(_, idx)
- if idx == 1 then
- vim.cmd("write")
- elseif idx == 2 then
- opts.force = true
- else
- return
- end
- M.bdelete(opts)
- end)
- end
-
- local cmd = "bdelete"
-
- if opts.wipeout then
- cmd = "bwipeout"
- end
-
- if opts.force then
- cmd = cmd .. "!"
- end
-
- vim.api.nvim_exec_autocmds("User", { pattern = "BDeletePre", data = opts })
-
- if vim.api.nvim_buf_is_valid(opts.bufnr) then
- vim.cmd(string.format("%s %d", cmd, opts.bufnr))
- vim.api.nvim_exec_autocmds("User", { pattern = "BDeletePost", data = opts })
- end
-end
-
M.spinner_frames = { "⣷", "⣯", "⣟", "⡿", "⢿", "⣻", "⣽", "⣾" }
M.diagnostic_signs = {