diff options
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/autocmds.lua | 34 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/keymaps.lua | 16 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/plugins.lua | 14 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/plugins/alpha.lua | 149 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/plugins/gitsigns.lua | 1 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/plugins/rust-tools.lua | 1 | ||||
-rw-r--r-- | nvim/.config/nvim/lua/tobyvin/utils/buffer.lua | 108 |
7 files changed, 218 insertions, 105 deletions
diff --git a/nvim/.config/nvim/lua/tobyvin/autocmds.lua b/nvim/.config/nvim/lua/tobyvin/autocmds.lua index 4b9e3cb..5427c72 100644 --- a/nvim/.config/nvim/lua/tobyvin/autocmds.lua +++ b/nvim/.config/nvim/lua/tobyvin/autocmds.lua @@ -1,40 +1,6 @@ local M = {} M.setup = function() - local augroup = vim.api.nvim_create_augroup("tobyvin_buffers", { clear = true }) - - vim.api.nvim_create_autocmd("User", { - group = augroup, - pattern = "bdelete", - callback = function(opts) - local windows = vim.tbl_filter(function(win) - return vim.api.nvim_win_get_buf(win) == opts.bufnr - end, vim.api.nvim_list_wins()) - - 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 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 == opts.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 - end, - desc = "Sets the window to the alternate buffer for bdelete", - }) - local augroup_hl = vim.api.nvim_create_augroup("tobyvin_hl", { clear = true }) vim.api.nvim_create_autocmd("CmdlineEnter", { diff --git a/nvim/.config/nvim/lua/tobyvin/keymaps.lua b/nvim/.config/nvim/lua/tobyvin/keymaps.lua index 27646b9..3322916 100644 --- a/nvim/.config/nvim/lua/tobyvin/keymaps.lua +++ b/nvim/.config/nvim/lua/tobyvin/keymaps.lua @@ -6,22 +6,18 @@ M.training_wheels = function() end M.setup = function() - vim.keymap.set("n", "<leader>q", utils.buffer.quit, { desc = "Quit" }) - vim.keymap.set("n", "<leader>c", utils.buffer.bdelete, { desc = "Close" }) - vim.keymap.set("n", "<leader>x", utils.buffer.tabclose, { desc = "Close" }) - vim.keymap.set("n", "<leader>w", "<CMD>write<CR>", { desc = "Write" }) - vim.keymap.set("i", "<C-c>", M.training_wheels, { desc = "Helper to quit using <C-c>" }) + vim.keymap.set("n", "<leader>q", "<cmd>qall<cr>", { desc = "quit" }) + vim.keymap.set("n", "<leader>c", utils.buffer.bdelete, { desc = "bdelete" }) + vim.keymap.set("n", "<leader>x", "<cmd>close<cr>", { desc = "close" }) + vim.keymap.set("n", "<leader>z", "<cmd>tabclose<cr>", { desc = "tabclose" }) + vim.keymap.set("n", "<leader>w", "<cmd>write<cr>", { desc = "write" }) vim.keymap.set("n", "<C-u>", "<C-u>zz", { desc = "Up half page and center" }) vim.keymap.set("n", "<C-d>", "<C-d>zz", { desc = "Down half page and center" }) vim.keymap.set("n", "<a-j>", "<CMD>m +1<CR>", { desc = "Move line down" }) vim.keymap.set("n", "<a-k>", "<CMD>m -2<CR>", { desc = "Move line up" }) - vim.keymap.set("v", "<a-k>", "<CMD>m '<-2<CR>gv=gv", { desc = "Move selection up" }) vim.keymap.set("v", "<a-j>", "<CMD>m '>+1<CR>gv=gv", { desc = "Move selection down" }) - - local nmap_run = utils.keymap.group("n", "<leader>r", { desc = "Run" }) - - nmap_run("c", utils.job.cmd, { desc = "Command" }) + vim.keymap.set("i", "<C-c>", M.training_wheels, { desc = "Helper to quit using <C-c>" }) end return M diff --git a/nvim/.config/nvim/lua/tobyvin/plugins.lua b/nvim/.config/nvim/lua/tobyvin/plugins.lua index 2087742..3732be8 100644 --- a/nvim/.config/nvim/lua/tobyvin/plugins.lua +++ b/nvim/.config/nvim/lua/tobyvin/plugins.lua @@ -15,6 +15,14 @@ M.plugins = function(use) use("lewis6991/impatient.nvim") use({ + "goolord/alpha-nvim", + requires = { "kyazdani42/nvim-web-devicons" }, + config = function() + require("tobyvin.plugins.alpha").setup() + end, + }) + + use({ "rcarriga/nvim-notify", config = function() require("tobyvin.plugins.notify").setup() @@ -506,7 +514,11 @@ M.setup = function() "https://github.com/wbthomason/packer.nvim", install_path, }) - vim.notify("Installing packer. Reload neovim to load plugins.", vim.log.levels.INFO, { title = "[packer] Installing" }) + vim.notify( + "Installing packer. Reload neovim to load plugins.", + vim.log.levels.INFO, + { title = "[packer] Installing" } + ) vim.cmd([[packadd packer.nvim]]) end diff --git a/nvim/.config/nvim/lua/tobyvin/plugins/alpha.lua b/nvim/.config/nvim/lua/tobyvin/plugins/alpha.lua new file mode 100644 index 0000000..4ecbc24 --- /dev/null +++ b/nvim/.config/nvim/lua/tobyvin/plugins/alpha.lua @@ -0,0 +1,149 @@ +local M = {} + +M.setup = function() + local status_ok, alpha = pcall(require, "alpha") + if not status_ok then + vim.notify("Failed to load module 'alpha'", vim.log.levels.ERROR) + return + end + + local startify = require("alpha.themes.startify") + local fortune = require("alpha.fortune") + + local logo = { + type = "text", + val = { + " ", + " ███╗ ██╗███████╗ ██████╗ ██╗ ██╗██╗███╗ ███╗ ", + " ████╗ ██║██╔════╝██╔═══██╗██║ ██║██║████╗ ████║ ", + " ██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║██╔████╔██║ ", + " ██║╚██╗██║██╔══╝ ██║ ██║╚██╗ ██╔╝██║██║╚██╔╝██║ ", + " ██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║ ", + " ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═══╝ ╚═╝╚═╝ ╚═╝ ", + }, + opts = { + position = "left", + hl = "DevIconVim", + }, + } + + local function info_value() + local total_plugins = #vim.tbl_keys(packer_plugins) + local datetime = os.date(" %d-%m-%Y") + local v = vim.version() + return "DATE: " + .. datetime + .. " VIM: v" + .. v.major + .. "." + .. v.minor + .. "." + .. v.patch + .. " PLUGINS: " + .. total_plugins + end + + local info = { + type = "text", + val = info_value(), + opts = { + hl = "DevIconVim", + position = "left", + }, + } + + local message = { + type = "text", + val = fortune({ max_width = 60 }), + opts = { + position = "left", + hl = "Statement", + }, + } + + local header = { + type = "group", + val = { + logo, + info, + message, + }, + } + + local mru = { + type = "group", + val = { + { + type = "text", + val = "MRU", + opts = { + hl = "String", + shrink_margin = false, + position = "left", + max_width = 60, + }, + }, + { + type = "group", + val = function() + return { startify.mru(1, vim.fn.getcwd(), 5) } + end, + }, + }, + } + + local buttons = { + type = "group", + val = { + { + type = "text", + val = "CMD", + opts = { + hl = "String", + shrink_margin = false, + position = "left", + }, + }, + { type = "padding", val = 1 }, + startify.button("e", "new", "<cmd>enew<cr>"), + startify.button("s", "session", "<cmd>SessionManager load_current_dir_session<cr>"), + startify.button("q", "quit", "<cmd>qa<cr>"), + }, + opts = { + position = "left", + }, + } + + local config = { + layout = { + header, + { type = "padding", val = 1 }, + mru, + { type = "padding", val = 1 }, + buttons, + }, + opts = { + position = "center", + width = 50, + }, + } + + alpha.setup(config) + + vim.api.nvim_create_autocmd("User", { + group = vim.api.nvim_create_augroup("alpha_user", { clear = true }), + pattern = "BDeletePre", + callback = function() + if + #vim.fn.getbufinfo({ buflisted = 1 }) < 2 + and vim.api.nvim_buf_get_name(0) ~= "" + and vim.api.nvim_buf_get_option(0, "filetype") ~= "Alpha" + then + alpha.start(false) + end + end, + desc = "Run Alpha when last buffer closed", + }) +end + +return M diff --git a/nvim/.config/nvim/lua/tobyvin/plugins/gitsigns.lua b/nvim/.config/nvim/lua/tobyvin/plugins/gitsigns.lua index cc1aabf..4b73f2c 100644 --- a/nvim/.config/nvim/lua/tobyvin/plugins/gitsigns.lua +++ b/nvim/.config/nvim/lua/tobyvin/plugins/gitsigns.lua @@ -52,7 +52,6 @@ M.setup = function() topdelete = { text = "契" }, changedelete = { text = "▎" }, }, - current_line_blame = true, preview_config = { border = "rounded" }, on_attach = M.on_attach, }) diff --git a/nvim/.config/nvim/lua/tobyvin/plugins/rust-tools.lua b/nvim/.config/nvim/lua/tobyvin/plugins/rust-tools.lua index cec90e0..000ce23 100644 --- a/nvim/.config/nvim/lua/tobyvin/plugins/rust-tools.lua +++ b/nvim/.config/nvim/lua/tobyvin/plugins/rust-tools.lua @@ -36,6 +36,7 @@ M.setup = function() utils.job.cmd("cargo") end + utils.keymap.group("n", "<leader>r", { desc = "Run" }) vim.keymap.set("n", "<leader>rr", runnables, { desc = "Runnables", buffer = bufnr }) vim.keymap.set("n", "<leader>rd", debuggables, { desc = "Debug", buffer = bufnr }) vim.keymap.set("n", "<leader>ro", open_cargo_toml, { desc = "Open Cargo.toml", buffer = bufnr }) diff --git a/nvim/.config/nvim/lua/tobyvin/utils/buffer.lua b/nvim/.config/nvim/lua/tobyvin/utils/buffer.lua index 2169e30..b6b0b63 100644 --- a/nvim/.config/nvim/lua/tobyvin/utils/buffer.lua +++ b/nvim/.config/nvim/lua/tobyvin/utils/buffer.lua @@ -37,73 +37,63 @@ M.popup = function(file_path) vim.api.nvim_buf_set_option(0, "modifiable", false) end ----@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.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]) +--- @class BdeleteOptions +--- @field force boolean Force deletion and ignore unsaved changes. +--- @field unload boolean Unloaded only, do not delete. See |:bunload| + +--- Wrapper around nvim_buf_delete that preserves window layout +--- @param buffer number? Buffer handle, or 0 for current buffer +--- @param opts BdeleteOptions? Optional parameters +M.bdelete = function(buffer, opts) + if buffer == nil then + buffer = vim.fn.bufnr() 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 "")) + if opts == nil then + opts = { + force = false, + unload = true, + } end -end - ----@param force boolean -M.bdelete = function(force) - M.kill("bdelete", force) -end ----@param force boolean -M.bwipeout = function(force) - M.kill("bwipeout", force) -end + if not opts.force and vim.bo[buffer].modified then + local bufname = vim.fn.bufname(vim.fn.bufname()) + + return 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") + M.bdelete(buffer) + elseif idx == 2 then + M.bdelete(buffer, { force = 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 force boolean -M.close = function(force) - M.kill("close", force) -end + if vim.fn.buflisted(buffer) == 1 then + local windows = vim.fn.getbufinfo(buffer)[1].windows ----@param force boolean -M.quit = function(force) - M.kill("quit", force) -end + for _, window in ipairs(windows) do + local alt_buffer = vim.fn.bufnr("#") + if vim.fn.buflisted(alt_buffer) == 1 then + vim.api.nvim_win_set_buf(window, alt_buffer) + end + end + end ----@param force boolean -M.tabclose = function(force) - local cmd = "tabclose" - if #vim.api.nvim_list_tabpages() == 1 then - cmd = "qall" + if vim.api.nvim_buf_is_valid(buffer) then + vim.api.nvim_exec_autocmds("User", { pattern = "BDeletePre" }) + vim.api.nvim_buf_set_option(buffer, "buflisted", false) + vim.api.nvim_buf_delete(buffer, opts) end - vim.cmd(cmd .. (force and "!" or "")) end return M |