From a3c640de64882b4ce3cc7564336351dab427a94c Mon Sep 17 00:00:00 2001 From: Toby Vincent Date: Wed, 13 Jul 2022 18:50:40 -0500 Subject: feat(nvim): impl improved bdelete and bwipeout commands --- nvim/.config/nvim/lua/tobyvin/init.lua | 2 +- nvim/.config/nvim/lua/tobyvin/mappings.lua | 6 +- nvim/.config/nvim/lua/tobyvin/plugins.lua | 5 +- nvim/.config/nvim/lua/tobyvin/utils.lua | 8 ++- nvim/.config/nvim/lua/tobyvin/utils/bdelete.lua | 95 +++++++++++++++++++++++++ 5 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 nvim/.config/nvim/lua/tobyvin/utils/bdelete.lua (limited to 'nvim') 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 -- cgit v1.2.3-70-g09d2