summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorToby Vincent <tobyv13@gmail.com>2022-07-13 18:50:40 -0500
committerToby Vincent <tobyv13@gmail.com>2022-07-13 18:50:40 -0500
commita3c640de64882b4ce3cc7564336351dab427a94c (patch)
tree13e0665e8a1d38f788968d9ad4593461a0d1e557
parent26da8d7769bb12ffc4ec98e58b74765cf18f414e (diff)
feat(nvim): impl improved bdelete and bwipeout commands
-rw-r--r--nvim/.config/nvim/lua/tobyvin/init.lua2
-rw-r--r--nvim/.config/nvim/lua/tobyvin/mappings.lua6
-rw-r--r--nvim/.config/nvim/lua/tobyvin/plugins.lua5
-rw-r--r--nvim/.config/nvim/lua/tobyvin/utils.lua8
-rw-r--r--nvim/.config/nvim/lua/tobyvin/utils/bdelete.lua95
5 files changed, 111 insertions, 5 deletions
diff --git a/nvim/.config/nvim/lua/tobyvin/init.lua b/nvim/.config/nvim/lua/tobyvin/init.lua
index d486c75..704cab3 100644
--- a/nvim/.config/nvim/lua/tobyvin/init.lua
+++ b/nvim/.config/nvim/lua/tobyvin/init.lua
@@ -7,10 +7,10 @@ M.setup = function()
-- end
require("tobyvin.options").setup()
+ require("tobyvin.mappings").setup()
require("tobyvin.plugins").setup()
require("tobyvin.lsp").setup()
require("tobyvin.autocommands").setup()
- require("tobyvin.mappings").setup()
end
return M
diff --git a/nvim/.config/nvim/lua/tobyvin/mappings.lua b/nvim/.config/nvim/lua/tobyvin/mappings.lua
index 78572b8..151fa52 100644
--- a/nvim/.config/nvim/lua/tobyvin/mappings.lua
+++ b/nvim/.config/nvim/lua/tobyvin/mappings.lua
@@ -18,11 +18,13 @@ M.write_force = function()
end
M.close = function()
- vim.cmd("bdelete")
+ utils.bdelete()
+ -- vim.cmd("bdelete")
end
M.close_force = function()
- vim.cmd("bdelete!")
+ utils.bdelete(true)
+ -- vim.cmd("bdelete!")
end
M.setup = function()
diff --git a/nvim/.config/nvim/lua/tobyvin/plugins.lua b/nvim/.config/nvim/lua/tobyvin/plugins.lua
index f4feae3..3007dbe 100644
--- a/nvim/.config/nvim/lua/tobyvin/plugins.lua
+++ b/nvim/.config/nvim/lua/tobyvin/plugins.lua
@@ -29,6 +29,7 @@ M.plugins = function(use)
end,
})
+ -- TODO: implement custom hls using base-16-gruvbox and remove this
use({
"eddyekofo94/gruvbox-flat.nvim",
config = function()
@@ -443,7 +444,8 @@ end
M.setup = function()
local install_path = vim.fn.stdpath("data") .. "/site/pack/packer/start/packer.nvim"
- if vim.fn.empty(vim.fn.glob(install_path, nil, false, nil)) > 0 then
+ ---@diagnostic disable-next-line: missing-parameter
+ if vim.fn.empty(vim.fn.glob(install_path)) > 0 then
PackerBootstrap = vim.fn.system({
"git",
"clone",
@@ -470,6 +472,7 @@ M.setup = function()
},
})
+ -- TODO: either remove this or improve it to properly reload the file before syncing
local augroup_packer = vim.api.nvim_create_augroup("Packer", { clear = true })
vim.api.nvim_create_autocmd("BufWritePost", {
group = augroup_packer,
diff --git a/nvim/.config/nvim/lua/tobyvin/utils.lua b/nvim/.config/nvim/lua/tobyvin/utils.lua
index d053a9b..97a7504 100644
--- a/nvim/.config/nvim/lua/tobyvin/utils.lua
+++ b/nvim/.config/nvim/lua/tobyvin/utils.lua
@@ -1,4 +1,10 @@
-local M = {}
+local bdelete = require("tobyvin.utils.bdelete")
+bdelete.setup()
+
+local M = {
+ bdelete = bdelete.bdelete,
+ bwipeout = bdelete.bwipeout,
+}
M.spinner_frames = { "⣷", "⣯", "⣟", "⡿", "⢿", "⣻", "⣽", "⣾" }
diff --git a/nvim/.config/nvim/lua/tobyvin/utils/bdelete.lua b/nvim/.config/nvim/lua/tobyvin/utils/bdelete.lua
new file mode 100644
index 0000000..84cd6d8
--- /dev/null
+++ b/nvim/.config/nvim/lua/tobyvin/utils/bdelete.lua
@@ -0,0 +1,95 @@
+local M = {}
+
+-- Common kill function for bdelete and bwipeout
+M._bdelete = function(wipeout, bufnr, force)
+ -- If buffer is modified and force isn't true, print error and abort
+
+ if type(bufnr) == "boolean" and force == nil then
+ force = bufnr
+ bufnr = nil
+ end
+
+ if bufnr == 0 or bufnr == nil then
+ bufnr = vim.api.nvim_get_current_buf()
+ end
+
+ local base_cmd = "bdelete"
+
+ if wipeout then
+ base_cmd = "bwipeout"
+ end
+
+ local cmd
+ if not force and vim.bo[bufnr].modified then
+ vim.ui.select({ "write", "discard" }, {
+ prompt = string.format("No write since last change for buffer %d:", bufnr),
+ }, function(n)
+ if n == 1 then
+ vim.cmd("write")
+ cmd = base_cmd
+ elseif n == 2 then
+ cmd = base_cmd .. "!"
+ else
+ vim.notify("[bdelete] Aborting...")
+ end
+ end)
+ end
+
+ if not cmd then
+ return
+ end
+
+ -- Get list of windows IDs with the buffer to close
+ local windows = vim.tbl_filter(function(win)
+ return vim.api.nvim_win_get_buf(win) == bufnr
+ end, vim.api.nvim_list_wins())
+
+ -- Get list of valid and listed buffers
+ local buffers = vim.tbl_filter(function(buf)
+ return vim.api.nvim_buf_is_valid(buf) and vim.bo[buf].buflisted
+ end, vim.api.nvim_list_bufs())
+
+ -- If there is only one buffer (which has to be the current one), Neovim will automatically
+ -- create a new buffer on :bd.
+ -- For more than one buffer, pick the next buffer (wrapping around if necessary)
+ if buffers ~= nil and #buffers > 1 then
+ local next_buffer = vim.fn.winbufnr(vim.fn.winnr("#"))
+
+ if not next_buffer then
+ for i, v in ipairs(buffers) do
+ if v == bufnr then
+ next_buffer = buffers[i % #buffers + 1]
+ break
+ end
+ end
+ end
+
+ for _, win in ipairs(windows) do
+ vim.api.nvim_win_set_buf(win, next_buffer)
+ end
+ end
+
+ -- Check if buffer still exists, to ensure the target buffer wasn't killed
+ -- due to options like bufhidden=wipe.
+ if vim.api.nvim_buf_is_valid(bufnr) then
+ -- Execute the BDeletePre and BDeletePost autocommands before and after deleting the buffer
+ vim.api.nvim_exec_autocmds("User", { pattern = "BDeletePre" })
+ vim.cmd(string.format("%s %d", cmd, bufnr))
+ vim.api.nvim_exec_autocmds("User", { pattern = "BDeletePost" })
+ end
+end
+
+M.bdelete = function(...)
+ M._bdelete(false, ...)
+end
+
+M.bwipeout = function(...)
+ M._bdelete(true, ...)
+end
+
+M.setup = function()
+ vim.api.nvim_create_user_command("Bdelete", M.bdelete, { nargs = "?", bang = true, desc = "Bdelete" })
+ vim.api.nvim_create_user_command("Bwipeout", M.bwipeout, { nargs = "?", bang = true, desc = "Bwipeout" })
+end
+
+return M