initial commit

This commit is contained in:
2026-04-17 04:46:48 -04:00
commit 444b5739bd
7 changed files with 459 additions and 0 deletions
+139
View File
@@ -0,0 +1,139 @@
--[[
┌────────────────────────────────────────────────────────────────┐
│ Keymaps │
└────────────────────────────────────────────────────────────────┘
--]]
-- System Clipboard Integration
-- This makes 'y' and 'p' (and all other yank/paste operations)
-- use the system clipboard by default.
vim.opt.clipboard = 'unnamedplus'
----------------------------------------------------------
-- Redirect 'delete' and 'change' operations to the 'd' register
-- This keeps your system clipboard (unnamedplus) clean
local delete_keys = { 'd', 'D', 'c', 'C', 'x', 'X' }
for _, key in ipairs(delete_keys) do
vim.keymap.set({ 'n', 'v' }, key, '"d' .. key, { noremap = true, silent = true })
end
-- If you ever need to paste what you just deleted:
-- Type "dp (instead of just p)
----------------------------------------------------------
-- Quit and Save All with :Q
-- Replaces safety-checked :xa with a forced write-all-and-quit.
vim.api.nvim_create_user_command('Q', 'xa!', { desc = 'Write all and quit (forced)' })
----------------------------------------------------------
-- Snacks Keymaps
-- Top Pickers & Explorer
vim.keymap.set("n", "<leader><space>", function() Snacks.picker.smart() end, { desc = "Smart Find Files" })
vim.keymap.set("n", "<leader>,", function() Snacks.picker.buffers() end, { desc = "Buffers" })
vim.keymap.set("n", "<leader>/", function() Snacks.picker.grep() end, { desc = "Grep" })
vim.keymap.set("n", "<leader>:", function() Snacks.picker.command_history() end, { desc = "Command History" })
vim.keymap.set("n", "<leader>n", function() Snacks.picker.notifications() end, { desc = "Notification History" })
vim.keymap.set("n", "<leader>e", function() Snacks.explorer() end, { desc = "File Explorer" })
-- Find
vim.keymap.set("n", "<leader>fb", function() Snacks.picker.buffers() end, { desc = "Buffers" })
vim.keymap.set("n", "<leader>fc", function() Snacks.picker.files({ cwd = vim.fn.stdpath("config") }) end, { desc = "Find Config File" })
vim.keymap.set("n", "<leader>ff", function() Snacks.picker.files() end, { desc = "Find Files" })
vim.keymap.set("n", "<leader>fg", function() Snacks.picker.git_files() end, { desc = "Find Git Files" })
vim.keymap.set("n", "<leader>fp", function() Snacks.picker.projects() end, { desc = "Projects" })
vim.keymap.set("n", "<leader>fr", function() Snacks.picker.recent() end, { desc = "Recent" })
-- Git
vim.keymap.set("n", "<leader>gb", function() Snacks.picker.git_branches() end, { desc = "Git Branches" })
vim.keymap.set("n", "<leader>gl", function() Snacks.picker.git_log() end, { desc = "Git Log" })
vim.keymap.set("n", "<leader>gL", function() Snacks.picker.git_log_line() end, { desc = "Git Log Line" })
vim.keymap.set("n", "<leader>gs", function() Snacks.picker.git_status() end, { desc = "Git Status" })
vim.keymap.set("n", "<leader>gS", function() Snacks.picker.git_stash() end, { desc = "Git Stash" })
vim.keymap.set("n", "<leader>gd", function() Snacks.picker.git_diff() end, { desc = "Git Diff (Hunks)" })
vim.keymap.set("n", "<leader>gf", function() Snacks.picker.git_log_file() end, { desc = "Git Log File" })
-- GH
vim.keymap.set("n", "<leader>gi", function() Snacks.picker.gh_issue() end, { desc = "GitHub Issues (open)" })
vim.keymap.set("n", "<leader>gI", function() Snacks.picker.gh_issue({ state = "all" }) end, { desc = "GitHub Issues (all)" })
vim.keymap.set("n", "<leader>gp", function() Snacks.picker.gh_pr() end, { desc = "GitHub Pull Requests (open)" })
vim.keymap.set("n", "<leader>gP", function() Snacks.picker.gh_pr({ state = "all" }) end, { desc = "GitHub Pull Requests (all)" })
-- Grep
vim.keymap.set("n", "<leader>sb", function() Snacks.picker.lines() end, { desc = "Buffer Lines" })
vim.keymap.set("n", "<leader>sB", function() Snacks.picker.grep_buffers() end, { desc = "Grep Open Buffers" })
vim.keymap.set("n", "<leader>sg", function() Snacks.picker.grep() end, { desc = "Grep" })
vim.keymap.set({ "n", "x" }, "<leader>sw", function() Snacks.picker.grep_word() end, { desc = "Visual selection or word" })
-- Search
vim.keymap.set("n", '<leader>s"', function() Snacks.picker.registers() end, { desc = "Registers" })
vim.keymap.set("n", '<leader>s/', function() Snacks.picker.search_history() end, { desc = "Search History" })
vim.keymap.set("n", "<leader>sa", function() Snacks.picker.autocmds() end, { desc = "Autocmds" })
vim.keymap.set("n", "<leader>sc", function() Snacks.picker.command_history() end, { desc = "Command History" })
vim.keymap.set("n", "<leader>sC", function() Snacks.picker.commands() end, { desc = "Commands" })
vim.keymap.set("n", "<leader>sd", function() Snacks.picker.diagnostics() end, { desc = "Diagnostics" })
vim.keymap.set("n", "<leader>sD", function() Snacks.picker.diagnostics_buffer() end, { desc = "Buffer Diagnostics" })
vim.keymap.set("n", "<leader>sh", function() Snacks.picker.help() end, { desc = "Help Pages" })
vim.keymap.set("n", "<leader>sH", function() Snacks.picker.highlights() end, { desc = "Highlights" })
vim.keymap.set("n", "<leader>si", function() Snacks.picker.icons() end, { desc = "Icons" })
vim.keymap.set("n", "<leader>sj", function() Snacks.picker.jumps() end, { desc = "Jumps" })
vim.keymap.set("n", "<leader>sk", function() Snacks.picker.keymaps() end, { desc = "Keymaps" })
vim.keymap.set("n", "<leader>sl", function() Snacks.picker.loclist() end, { desc = "Location List" })
vim.keymap.set("n", "<leader>sm", function() Snacks.picker.marks() end, { desc = "Marks" })
vim.keymap.set("n", "<leader>sM", function() Snacks.picker.man() end, { desc = "Man Pages" })
vim.keymap.set("n", "<leader>sp", function() Snacks.picker.lazy() end, { desc = "Search for Plugin Spec" })
vim.keymap.set("n", "<leader>sq", function() Snacks.picker.qflist() end, { desc = "Quickfix List" })
vim.keymap.set("n", "<leader>sR", function() Snacks.picker.resume() end, { desc = "Resume" })
vim.keymap.set("n", "<leader>su", function() Snacks.picker.undo() end, { desc = "Undo History" })
vim.keymap.set("n", "<leader>uC", function() Snacks.picker.colorschemes() end, { desc = "Colorschemes" })
-- LSP
vim.keymap.set("n", "gd", function() Snacks.picker.lsp_definitions() end, { desc = "Goto Definition" })
vim.keymap.set("n", "gD", function() Snacks.picker.lsp_declarations() end, { desc = "Goto Declaration" })
vim.keymap.set("n", "gr", function() Snacks.picker.lsp_references() end, { nowait = true, desc = "References" })
vim.keymap.set("n", "gI", function() Snacks.picker.lsp_implementations() end, { desc = "Goto Implementation" })
vim.keymap.set("n", "gy", function() Snacks.picker.lsp_type_definitions() end, { desc = "Goto T[y]pe Definition" })
vim.keymap.set("n", "gai", function() Snacks.picker.lsp_incoming_calls() end, { desc = "C[a]lls Incoming" })
vim.keymap.set("n", "gao", function() Snacks.picker.lsp_outgoing_calls() end, { desc = "C[a]lls Outgoing" })
vim.keymap.set("n", "<leader>ss", function() Snacks.picker.lsp_symbols() end, { desc = "LSP Symbols" })
vim.keymap.set("n", "<leader>sS", function() Snacks.picker.lsp_workspace_symbols() end, { desc = "LSP Workspace Symbols" })
-- Other
vim.keymap.set("n", "<leader>z", function() Snacks.zen() end, { desc = "Toggle Zen Mode" })
vim.keymap.set("n", "<leader>Z", function() Snacks.zen.zoom() end, { desc = "Toggle Zoom" })
vim.keymap.set("n", "<leader>.", function() Snacks.scratch() end, { desc = "Toggle Scratch Buffer" })
vim.keymap.set("n", "<leader>S", function() Snacks.scratch.select() end, { desc = "Select Scratch Buffer" })
vim.keymap.set("n", "<leader>n", function() Snacks.notifier.show_history() end, { desc = "Notification History" })
vim.keymap.set("n", "<leader>bd", function() Snacks.bufdelete() end, { desc = "Delete Buffer" })
vim.keymap.set("n", "<leader>cR", function() Snacks.rename.rename_file() end, { desc = "Rename File" })
vim.keymap.set({ "n", "v" }, "<leader>gB", function() Snacks.gitbrowse() end, { desc = "Git Browse" })
vim.keymap.set("n", "<leader>gg", function() Snacks.lazygit() end, { desc = "Lazygit" })
vim.keymap.set("n", "<leader>un", function() Snacks.notifier.hide() end, { desc = "Dismiss All Notifications" })
vim.keymap.set("n", "<c-/>", function() Snacks.terminal() end, { desc = "Toggle Terminal" })
vim.keymap.set("n", "<c-_>", function() Snacks.terminal() end, { desc = "which_key_ignore" })
vim.keymap.set({ "n", "t" }, "]]", function() Snacks.words.jump(vim.v.count1) end, { desc = "Next Reference" })
vim.keymap.set({ "n", "t" }, "[[", function() Snacks.words.jump(-vim.v.count1) end, { desc = "Prev Reference" })
vim.keymap.set("n", "<leader>N", function()
Snacks.win({
file = vim.api.nvim_get_runtime_file("doc/news.txt", false)[1],
width = 0.6,
height = 0.6,
wo = {
spell = false,
wrap = false,
signcolumn = "yes",
statuscolumn = " ",
conceallevel = 3,
},
})
end, { desc = "Neovim News" })
----------------------------------------------------------
-- Persistence Keymaps
vim.keymap.set("n", "<leader>qs", function() require("persistence").load() end, { desc = "Restore Session" })
vim.keymap.set("n", "<leader>qS", function() require("persistence").select() end, { desc = "Select Session" })
vim.keymap.set("n", "<leader>ql", function() require("persistence").load({ last = true }) end, { desc = "Restore Last Session" })
vim.keymap.set("n", "<leader>qd", function() require("persistence").stop() end, { desc = "Don't Save Current Session" })
+87
View File
@@ -0,0 +1,87 @@
-- Lazyload queues for phased plugin loading.
--
-- on_vim_enter(fn): async fire-and-forget via vim.schedule() (default)
-- on_vim_enter(fn, { sync = true }): synchronous, must complete before next phase
-- on_override(fn): runs after all on_vim_enter callbacks (for .nvim.lua overrides)
local M = {}
local vim_enter_queue = {}
local override_queue = {}
---@param queue { fn: fun(), sync: boolean }[]
local function drain(queue)
for _, entry in ipairs(queue) do
if not entry.sync then
vim.schedule(entry.fn)
end
end
for _, entry in ipairs(queue) do
if entry.sync then
entry.fn()
end
end
end
local function drain_override()
if not override_queue then
return
end
for _, entry in ipairs(override_queue) do
vim.schedule(function()
local ok, err = pcall(entry.fn)
if not ok then
vim.notify((".nvim.lua override error:\n%s"):format(err), vim.log.levels.ERROR)
end
end)
end
override_queue = nil
end
vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
drain(vim_enter_queue)
vim_enter_queue = nil
drain_override()
end,
})
--- Run at VimEnter. Async by default. Pass { sync = true } to run synchronously.
---@param fn fun()
---@param opts? { sync?: boolean }
function M.on_vim_enter(fn, opts)
local sync = opts and opts.sync or false
if vim_enter_queue then
table.insert(vim_enter_queue, { fn = fn, sync = sync })
elseif sync then
fn()
else
vim.schedule(fn)
end
end
--- Run after all on_vim_enter callbacks (including async ones) have executed.
--- Intended for project-local overrides from .nvim.lua that need to patch
--- plugin state after setup() has run. Exrc runs at step 7c — before plugin/
--- files — so it cannot override plugin setup directly; this queue bridges
--- that gap by registering a callback that runs after the VimEnter drain.
---@param fn fun()
function M.on_override(fn)
if override_queue then
table.insert(override_queue, { fn = fn })
else
vim.schedule(fn)
end
end
-- Call function only once.
function M.call_once(fn)
local id = tostring(fn)
if fn and not Config.called[id] then
fn()
Config.called[id] = true
end
end
return M
+24
View File
@@ -0,0 +1,24 @@
--[[
┌────────────────────────────────────────────────────────────────┐
│ Options │
└────────────────────────────────────────────────────────────────┘
--]]
-- Autowrite/Autosave
-- This ensures changes are saved on every buffer change or when leaving insert mode.
vim.api.nvim_create_autocmd({ "InsertLeave", "TextChanged" }, {
group = vim.api.nvim_create_augroup("autosave", { clear = true }),
pattern = { "*" },
callback = function()
local buftype = vim.api.nvim_get_option_value("buftype", { buf = 0 })
if buftype == "" and vim.bo.modified then
vim.cmd("silent! update")
end
end,
})
-- Performance and UI defaults
vim.opt.updatetime = 200 -- Faster completion and CursorHold events
vim.opt.autowrite = true -- Enable auto write
vim.opt.number = true -- Show line numbers
vim.opt.relativenumber = true -- Relative line numbers
+135
View File
@@ -0,0 +1,135 @@
--[[
┌────────────────────────────────────────────────────────────────┐
│ Plugins │
└────────────────────────────────────────────────────────────────┘
--]]
-- Catppuccin.nvim
-- Eagerly load the colorscheme plugin.
vim.pack.add { { src = "https://github.com/catppuccin/nvim", name = "catppuccin" } }
-- Catppuccin Config
Config.plugins.catppuccin = {
flavour = "mocha",
}
vim.cmd.colorscheme "catppuccin"
-- Snacks.nvim
-- Eagerly load snacks for dashboard and performance features.
vim.pack.add { { src = "https://github.com/folke/snacks.nvim", name = "snacks" } }
-- Snacks Config
-- Store opts in the registry first.
Config.plugins.snacks = {
bigfile = { enabled = true },
dashboard = {
enabled = true,
sections = {
{ section = "header" },
{ section = "keys", gap = 1, padding = 1 },
},
},
explorer = { enabled = true },
indent = { enabled = true },
input = { enabled = true },
picker = { enabled = true },
notifier = { enabled = true },
quickfile = { enabled = true },
scope = { enabled = true },
scroll = { enabled = true },
statuscolumn = { enabled = true },
words = { enabled = true },
}
-- Setup Snacks with the registered opts.
require("snacks").setup(Config.plugins.snacks)
-- Persistence.nvim
-- Simple session management.
vim.pack.add { { src = "https://github.com/folke/persistence.nvim", name = "persistence" } }
-- Persistence Config
Config.plugins.persistence = {
dir = vim.fn.stdpath("state") .. "/sessions/",
need = 1,
branch = true,
}
require("persistence").setup(Config.plugins.persistence)
-- Lazy-loaded Plugins
local lazyload = require("lazyload")
lazyload.on_vim_enter(function()
-- Gitsigns.nvim
vim.pack.add { { src = "https://github.com/lewis6991/gitsigns.nvim", name = "gitsigns" } }
require("gitsigns").setup({
numhl = true, -- Enable line number highlighting
})
-- Grug-far.nvim
vim.pack.add { { src = "https://github.com/MagicDuck/grug-far.nvim", name = "grug-far" } }
require("grug-far").setup()
-- Flash.nvim
vim.pack.add { { src = "https://github.com/folke/flash.nvim", name = "flash" } }
require("flash").setup()
-- Which-key.nvim
vim.pack.add { { src = "https://github.com/folke/which-key.nvim", name = "which-key" } }
require("which-key").setup()
-- Mini.ai
vim.pack.add { { src = "https://github.com/echasnovski/mini.ai", name = "mini.ai" } }
Config.plugins.mini_ai = {
custom_textobjects = {
g = function()
local n_lines = vim.api.nvim_buf_line_count(0)
return {
from = { line = 1, col = 1 },
to = { line = n_lines, col = math.max(vim.fn.getline(n_lines):len(), 1) },
}
end,
},
}
require("mini.ai").setup(Config.plugins.mini_ai)
-- Icons
vim.pack.add { { src = "https://github.com/nvim-tree/nvim-web-devicons", name = "nvim-web-devicons" } }
-- Lualine
vim.pack.add { { src = "https://github.com/nvim-lualine/lualine.nvim", name = "lualine" } }
require("lualine").setup({
options = {
theme = "auto",
globalstatus = true,
},
sections = {
lualine_b = { "branch", "diff", "diagnostics" },
}
})
-- Noice dependencies
vim.pack.add { { src = "https://github.com/MunifTanjim/nui.nvim", name = "nui" } }
-- Noice.nvim
vim.pack.add { { src = "https://github.com/folke/noice.nvim", name = "noice" } }
require("noice").setup({
lsp = {
-- override markdown rendering so that **cmp** and other plugins use **Treesitter**
override = {
["vim.lsp.util.convert_input_to_markdown_lines"] = true,
["vim.lsp.util.set_autocmds"] = true,
["vim.ui.codelens.display_inline"] = true,
},
},
-- you can enable a preset for easier configuration
presets = {
bottom_search = true, -- use a classic bottom cmdline for search
command_palette = true, -- position the cmdline and popupmenu together
long_message_to_split = true, -- long messages will be sent to a split
inc_rename = false, -- enables an input dialog for inc-rename.nvim
lsp_doc_border = false, -- add a border to hover docs and signature help
},
})
end)