aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/dot_config/nvim
diff options
context:
space:
mode:
authorLibravatar sommerfeld <sommerfeld@sommerfeld.dev>2026-04-21 01:23:18 +0100
committerLibravatar sommerfeld <sommerfeld@sommerfeld.dev>2026-04-21 01:23:18 +0100
commitd00bf2cb2d5087164fa509a4f20a2be62a519044 (patch)
treee788986ca341fa7a9d7327b48c58d2e0c0c43115 /dot_config/nvim
parent9b2af4dd6c73ea57cc921f41120db7a2700e806d (diff)
downloaddotfiles-d00bf2cb2d5087164fa509a4f20a2be62a519044.tar.gz
dotfiles-d00bf2cb2d5087164fa509a4f20a2be62a519044.tar.bz2
dotfiles-d00bf2cb2d5087164fa509a4f20a2be62a519044.zip
refactor: restructure to chezmoi source state
Rename home/ contents to chezmoi naming conventions: - dot_ prefix for dotfiles and dot-dirs - private_dot_ for .gnupg and .ssh directories - private_ for 0600 files (nym.pub) - executable_ for scripts in .local/bin and display-toggle.sh - symlink_ for mimeapps.list symlink
Diffstat (limited to 'dot_config/nvim')
-rw-r--r--dot_config/nvim/after/ftplugin/gitcommit.lua3
-rw-r--r--dot_config/nvim/after/ftplugin/gitrebase.lua16
-rw-r--r--dot_config/nvim/after/ftplugin/mail.lua1
-rw-r--r--dot_config/nvim/after/ftplugin/markdown.lua1
-rw-r--r--dot_config/nvim/after/ftplugin/text.lua3
-rw-r--r--dot_config/nvim/after/lsp/clangd.lua57
-rw-r--r--dot_config/nvim/after/lsp/fortls.lua10
-rw-r--r--dot_config/nvim/after/lsp/lua_ls.lua9
-rw-r--r--dot_config/nvim/filetype.lua14
-rw-r--r--dot_config/nvim/init.lua126
-rw-r--r--dot_config/nvim/lua/config/autocmds.lua128
-rw-r--r--dot_config/nvim/lua/config/keymaps.lua136
-rw-r--r--dot_config/nvim/lua/config/options.lua114
-rw-r--r--dot_config/nvim/lua/plugins/ai.lua34
-rw-r--r--dot_config/nvim/lua/plugins/completion.lua86
-rw-r--r--dot_config/nvim/lua/plugins/debug.lua75
-rw-r--r--dot_config/nvim/lua/plugins/editing.lua61
-rw-r--r--dot_config/nvim/lua/plugins/git.lua123
-rw-r--r--dot_config/nvim/lua/plugins/init.lua58
-rw-r--r--dot_config/nvim/lua/plugins/lsp.lua280
-rw-r--r--dot_config/nvim/lua/plugins/runner.lua77
-rw-r--r--dot_config/nvim/lua/plugins/search.lua60
-rw-r--r--dot_config/nvim/lua/plugins/session.lua77
-rw-r--r--dot_config/nvim/lua/plugins/treesitter.lua83
-rw-r--r--dot_config/nvim/lua/plugins/ui.lua58
-rw-r--r--dot_config/nvim/nvim-pack-lock.json222
26 files changed, 1912 insertions, 0 deletions
diff --git a/dot_config/nvim/after/ftplugin/gitcommit.lua b/dot_config/nvim/after/ftplugin/gitcommit.lua
new file mode 100644
index 0000000..e670035
--- /dev/null
+++ b/dot_config/nvim/after/ftplugin/gitcommit.lua
@@ -0,0 +1,3 @@
+vim.wo.spell = true
+vim.b.undo_ftplugin = (vim.b.undo_ftplugin or "") .. "|setlocal spell<"
+vim.cmd([[match ErrorMsg /\%1l.\%>50v/]])
diff --git a/dot_config/nvim/after/ftplugin/gitrebase.lua b/dot_config/nvim/after/ftplugin/gitrebase.lua
new file mode 100644
index 0000000..1bfcd69
--- /dev/null
+++ b/dot_config/nvim/after/ftplugin/gitrebase.lua
@@ -0,0 +1,16 @@
+local function nvmap(l, r, desc)
+ vim.keymap.set(
+ { "n", "v" },
+ l,
+ ":" .. r .. "<CR>",
+ { buffer = 0, desc = "[G]it rebase " .. desc }
+ )
+end
+
+nvmap("gc", "Cycle", "[C]ycle")
+nvmap("gp", "Pick", "[P]ick")
+nvmap("ge", "Edit", "[E]dit")
+nvmap("gf", "Fixup", "[F]ixup")
+nvmap("gd", "Drop", "[D]rop")
+nvmap("gs", "Squash", "[S]quash")
+nvmap("gr", "Reword", "[R]eword")
diff --git a/dot_config/nvim/after/ftplugin/mail.lua b/dot_config/nvim/after/ftplugin/mail.lua
new file mode 100644
index 0000000..9fe1500
--- /dev/null
+++ b/dot_config/nvim/after/ftplugin/mail.lua
@@ -0,0 +1 @@
+vim.wo.spell = true
diff --git a/dot_config/nvim/after/ftplugin/markdown.lua b/dot_config/nvim/after/ftplugin/markdown.lua
new file mode 100644
index 0000000..9fe1500
--- /dev/null
+++ b/dot_config/nvim/after/ftplugin/markdown.lua
@@ -0,0 +1 @@
+vim.wo.spell = true
diff --git a/dot_config/nvim/after/ftplugin/text.lua b/dot_config/nvim/after/ftplugin/text.lua
new file mode 100644
index 0000000..2179c42
--- /dev/null
+++ b/dot_config/nvim/after/ftplugin/text.lua
@@ -0,0 +1,3 @@
+vim.wo.spell = true
+vim.bo.formatoptions = vim.bo.formatoptions .. "t"
+vim.bo.commentstring = "# %s"
diff --git a/dot_config/nvim/after/lsp/clangd.lua b/dot_config/nvim/after/lsp/clangd.lua
new file mode 100644
index 0000000..e9868ae
--- /dev/null
+++ b/dot_config/nvim/after/lsp/clangd.lua
@@ -0,0 +1,57 @@
+local function validate_bufnr(bufnr)
+ vim.validate("bufnr", bufnr, "number")
+ return bufnr == 0 and vim.api.nvim_get_current_buf() or bufnr
+end
+
+local function switch_source_header_splitcmd(bufnr, splitcmd)
+ local method_name = "textDocument/switchSourceHeader"
+ bufnr = validate_bufnr(bufnr)
+ local client = vim.lsp.get_clients({ bufnr = bufnr, name = "clangd" })[1]
+ if not client then
+ return vim.notify(
+ ("method %s is not supported by any servers active on the current buffer"):format(
+ method_name
+ )
+ )
+ end
+ local params = vim.lsp.util.make_text_document_params(bufnr)
+ client.request(method_name, params, function(err, result)
+ if err then
+ error(tostring(err))
+ end
+ if not result then
+ vim.notify("corresponding file cannot be determined")
+ return
+ end
+ vim.api.nvim_cmd({
+ cmd = splitcmd,
+ args = { vim.uri_to_fname(result) },
+ }, {})
+ end, bufnr)
+end
+
+return {
+ capabilities = {
+ offsetEncoding = { "utf-16" },
+ },
+ on_attach = function(_, bufnr)
+ local function nmap(l, r, desc)
+ vim.keymap.set("n", l, r, { buffer = bufnr, desc = desc })
+ end
+ nmap("gH", function()
+ switch_source_header_splitcmd(bufnr, "edit")
+ end, "[G]o to [H]eader")
+ nmap("gvH", function()
+ switch_source_header_splitcmd(bufnr, "vsplit")
+ end, "[G]o in a [V]ertical split to [H]eader")
+ nmap("gxH", function()
+ switch_source_header_splitcmd(bufnr, "split")
+ end, "[G]o in a [X]horizontal split to [H]eader")
+ nmap("gtH", function()
+ switch_source_header_splitcmd(bufnr, "tabedit")
+ end, "[G]o in a [T]ab to [H]eader")
+ end,
+ init_options = {
+ clangdFileStatus = true,
+ },
+}
diff --git a/dot_config/nvim/after/lsp/fortls.lua b/dot_config/nvim/after/lsp/fortls.lua
new file mode 100644
index 0000000..8899dd2
--- /dev/null
+++ b/dot_config/nvim/after/lsp/fortls.lua
@@ -0,0 +1,10 @@
+return {
+ cmd = {
+ "fortls",
+ "--notify_init",
+ "--hover_signature",
+ "--hover_language=fortran",
+ "--use_signature_help",
+ "--autocomplete_no_snippets",
+ },
+}
diff --git a/dot_config/nvim/after/lsp/lua_ls.lua b/dot_config/nvim/after/lsp/lua_ls.lua
new file mode 100644
index 0000000..af0e681
--- /dev/null
+++ b/dot_config/nvim/after/lsp/lua_ls.lua
@@ -0,0 +1,9 @@
+return {
+ settings = {
+ Lua = {
+ diagnostics = {
+ disable = { "missing-fields" },
+ },
+ },
+ },
+}
diff --git a/dot_config/nvim/filetype.lua b/dot_config/nvim/filetype.lua
new file mode 100644
index 0000000..51f8646
--- /dev/null
+++ b/dot_config/nvim/filetype.lua
@@ -0,0 +1,14 @@
+vim.filetype.add({
+ extension = {
+ eml = "mail",
+ inc = "cpp",
+ def = "cpp",
+ Jenkinsfile = "groovy",
+ },
+ filename = {
+ [".devcontainer.json"] = "jsonc",
+ },
+ pattern = {
+ [".*/.github/workflows/.*%.ya?ml"] = "yaml.ghaction",
+ },
+})
diff --git a/dot_config/nvim/init.lua b/dot_config/nvim/init.lua
new file mode 100644
index 0000000..fc3271b
--- /dev/null
+++ b/dot_config/nvim/init.lua
@@ -0,0 +1,126 @@
+require("config.options")
+
+_G.P = function(v)
+ print(vim.inspect(v))
+ return v
+end
+
+-- Pre-load globals (must be set before plugins load)
+vim.g.copilot_nes_debounce = 500
+
+-- Build hooks for plugins that need post-install steps
+vim.api.nvim_create_autocmd("User", {
+ pattern = "PackChanged",
+ callback = function(ev)
+ if ev.data.kind ~= "install" and ev.data.kind ~= "update" then
+ return
+ end
+ if ev.data.spec.name == "markdown-preview.nvim" then
+ vim.system({ "yarn", "install" }, { cwd = ev.data.path .. "/app" })
+ end
+ end,
+})
+
+local gh = function(x)
+ return "https://github.com/" .. x
+end
+
+vim.pack.add({
+ -- UI
+ gh("ellisonleao/gruvbox.nvim"),
+ gh("saghen/blink.indent"),
+ gh("nvim-lualine/lualine.nvim"),
+ gh("AndreM222/copilot-lualine"),
+
+ -- Treesitter
+ { src = gh("nvim-treesitter/nvim-treesitter"), version = "main" },
+ gh("RRethy/nvim-treesitter-endwise"),
+ gh("nvim-treesitter/nvim-treesitter-context"),
+ gh("JoosepAlviste/nvim-ts-context-commentstring"),
+ gh("aaronik/treewalker.nvim"),
+ gh("LiadOz/nvim-dap-repl-highlights"),
+
+ -- Completion
+ gh("saghen/blink.compat"),
+ { src = gh("saghen/blink.cmp"), version = vim.version.range("*") },
+ gh("rafamadriz/friendly-snippets"),
+ gh("fang2hou/blink-copilot"),
+ gh("rcarriga/cmp-dap"),
+ gh("xzbdmw/colorful-menu.nvim"),
+ { src = gh("saghen/blink.pairs"), version = vim.version.range("*") },
+ { src = gh("saghen/blink.download"), version = "main" },
+
+ -- Editing
+ gh("nmac427/guess-indent.nvim"),
+ gh("kylechui/nvim-surround"),
+ gh("chrisgrieser/nvim-various-textobjs"),
+ gh("monaqa/dial.nvim"),
+ gh("ThePrimeagen/refactoring.nvim"),
+ gh("nvim-lua/plenary.nvim"),
+
+ -- Git
+ gh("akinsho/git-conflict.nvim"),
+ gh("NeogitOrg/neogit"),
+ gh("ruifm/gitlinker.nvim"),
+ gh("lewis6991/gitsigns.nvim"),
+
+ -- LSP
+ gh("folke/lazydev.nvim"),
+ gh("neovim/nvim-lspconfig"),
+ gh("j-hui/fidget.nvim"),
+ gh("williamboman/mason.nvim"),
+ gh("williamboman/mason-lspconfig.nvim"),
+ gh("WhoIsSethDaniel/mason-tool-installer.nvim"),
+ gh("stevearc/conform.nvim"),
+ gh("mrcjkb/rustaceanvim"),
+ gh("mfussenegger/nvim-lint"),
+ gh("rachartier/tiny-inline-diagnostic.nvim"),
+
+ -- Debug
+ { src = gh("miroshQa/debugmaster.nvim"), version = "dashboard" },
+ gh("mfussenegger/nvim-dap"),
+ gh("theHamsta/nvim-dap-virtual-text"),
+ gh("jay-babu/mason-nvim-dap.nvim"),
+
+ -- Runner
+ gh("stevearc/overseer.nvim"),
+
+ -- Search
+ { src = gh("ibhagwan/fzf-lua"), version = "main" },
+
+ -- Session
+ gh("rmagatti/auto-session"),
+
+ -- AI
+ gh("zbirenbaum/copilot.lua"),
+ gh("copilotlsp-nvim/copilot-lsp"),
+
+ -- Misc
+ gh("iamcco/markdown-preview.nvim"),
+ gh("mrjones2014/smart-splits.nvim"),
+ gh("folke/which-key.nvim"),
+ gh("stevearc/quicker.nvim"),
+ gh("stevearc/oil.nvim"),
+}, { confirm = false })
+
+-- Colorscheme (must be set immediately after plugins are on rtp)
+require("gruvbox").setup({})
+vim.o.background = "dark"
+vim.cmd.colorscheme("gruvbox")
+
+-- Plugin configurations (order matters for dependencies)
+require("plugins.ui")
+require("plugins.treesitter")
+require("plugins.completion")
+require("plugins.editing")
+require("plugins.git")
+require("plugins.lsp")
+require("plugins.debug")
+require("plugins.runner")
+require("plugins.search")
+require("plugins.session")
+require("plugins.ai")
+require("plugins.init")
+
+require("config.keymaps")
+require("config.autocmds")
diff --git a/dot_config/nvim/lua/config/autocmds.lua b/dot_config/nvim/lua/config/autocmds.lua
new file mode 100644
index 0000000..2d1ea9b
--- /dev/null
+++ b/dot_config/nvim/lua/config/autocmds.lua
@@ -0,0 +1,128 @@
+local function augroup(name)
+ return vim.api.nvim_create_augroup(name, { clear = true })
+end
+
+local autocmd = vim.api.nvim_create_autocmd
+
+-- Check if we need to reload the file when it changed
+autocmd({ "FocusGained", "TermClose", "TermLeave" }, {
+ group = augroup("checktime"),
+ callback = function()
+ if vim.o.buftype ~= "nofile" then
+ vim.cmd("checktime")
+ end
+ end,
+})
+
+-- Highlight on yank
+autocmd("TextYankPost", {
+ group = augroup("highlight_yank"),
+ callback = vim.hl.on_yank,
+})
+
+-- go to last loc when opening a buffer
+autocmd("BufReadPost", {
+ group = augroup("last_loc"),
+ callback = function(event)
+ local exclude = { "gitcommit" }
+ local buf = event.buf
+ if
+ vim.tbl_contains(exclude, vim.bo[buf].filetype) or vim.b[buf].last_loc
+ then
+ return
+ end
+ vim.b[buf].last_loc = true
+ local mark = vim.api.nvim_buf_get_mark(buf, '"')
+ local lcount = vim.api.nvim_buf_line_count(buf)
+ if mark[1] > 0 and mark[1] <= lcount then
+ pcall(vim.api.nvim_win_set_cursor, 0, mark)
+ end
+ end,
+})
+
+-- close some filetypes with <q>
+autocmd("FileType", {
+ group = augroup("close_with_q"),
+ pattern = {
+ "PlenaryTestPopup",
+ "checkhealth",
+ "dbout",
+ "gitsigns-blame",
+ "help",
+ "lspinfo",
+ "notify",
+ "qf",
+ "startuptime",
+ },
+ callback = function(event)
+ vim.bo[event.buf].buflisted = false
+ vim.schedule(function()
+ vim.keymap.set("n", "q", function()
+ vim.cmd("close")
+ pcall(vim.api.nvim_buf_delete, event.buf, { force = true })
+ end, {
+ buffer = event.buf,
+ silent = true,
+ desc = "Quit buffer",
+ })
+ end)
+ end,
+})
+
+-- make it easier to close man-files when opened inline
+autocmd("FileType", {
+ group = augroup("man_unlisted"),
+ pattern = { "man" },
+ callback = function(event)
+ vim.bo[event.buf].buflisted = false
+ end,
+})
+
+-- Auto create dir when saving a file, in case some intermediate directory does not exist
+autocmd({ "BufWritePre" }, {
+ group = augroup("auto_create_dir"),
+ callback = function(event)
+ if event.match:match("^%w%w+:[\\/][\\/]") then
+ return
+ end
+ local file = vim.uv.fs_realpath(event.match) or event.match
+ vim.fn.mkdir(vim.fn.fnamemodify(file, ":p:h"), "p")
+ end,
+})
+
+autocmd("BufWritePost", {
+ group = augroup("sway"),
+ pattern = "*/sway/config",
+ command = "!swaymsg reload",
+})
+autocmd("BufWritePost", {
+ group = augroup("waybar"),
+ pattern = "*/waybar/*",
+ command = "!killall -SIGUSR2 waybar",
+})
+autocmd("BufWritePost", {
+ group = augroup("xdg-user-dirs"),
+ pattern = "user-dirs.dirs,user-dirs.locale",
+ command = "!xdg-user-dirs-update",
+})
+autocmd("BufWritePost", {
+ group = augroup("mako"),
+ pattern = "*/mako/config",
+ command = "!makoctl reload",
+})
+autocmd("BufWritePost", {
+ group = augroup("fc-cache"),
+ pattern = "fonts.conf",
+ command = "!fc-cache",
+})
+
+autocmd("FileType", {
+ group = augroup("treesitter_start"),
+ pattern = { "*" },
+ callback = function()
+ if pcall(vim.treesitter.start) then
+ vim.wo.foldexpr = "v:lua.vim.treesitter.foldexpr()"
+ vim.bo.indentexpr = "v:lua.vim.treesitter.indentexpr()"
+ end
+ end,
+})
diff --git a/dot_config/nvim/lua/config/keymaps.lua b/dot_config/nvim/lua/config/keymaps.lua
new file mode 100644
index 0000000..366a37e
--- /dev/null
+++ b/dot_config/nvim/lua/config/keymaps.lua
@@ -0,0 +1,136 @@
+local function map(mode, l, r, desc)
+ vim.keymap.set(mode, l, r, { desc = desc })
+end
+local function cmd(mode, l, r, desc)
+ map(mode, l, "<cmd>" .. r .. "<cr>", desc)
+end
+local function cmdi(mode, l, r, desc)
+ map(mode, l, ":" .. r, desc)
+end
+local function nmap(l, r, desc)
+ map("n", l, r, desc)
+end
+local function vmap(l, r, desc)
+ map("v", l, r, desc)
+end
+local function nvmap(l, r, desc)
+ map({ "n", "v" }, l, r, desc)
+end
+local function ncmd(l, r, desc)
+ cmd("n", l, r, desc)
+end
+local function ncmdi(l, r, desc)
+ cmdi("n", l, r, desc)
+end
+local function vcmdi(l, r, desc)
+ cmdi("v", l, r, desc)
+end
+
+ncmd("<esc>", "nohlsearch")
+
+-- highlight last inserted text
+nmap("gV", "`[v`]")
+
+nmap("<down>", "<c-e>")
+nmap("<up>", "<c-y>")
+
+-- paste over selection without clobbering registers
+vmap("p", '"_dP')
+
+-- Find and Replace binds
+ncmdi("<localleader>s", "%s/")
+vcmdi("<localleader>s", "s/")
+
+ncmd("<leader>x", "wall")
+ncmd("<leader>z", "wqall")
+ncmd("<leader>q", "quitall")
+
+vim.keymap.set(
+ "t",
+ "<esc><esc>",
+ "<c-\\><c-n>",
+ { silent = true, noremap = true, desc = "Exit terminal mode" }
+)
+
+nmap("[w", function()
+ vim.diagnostic.jump({
+ count = -vim.v.count1,
+ severity = { min = vim.diagnostic.severity.WARN },
+ })
+end)
+nmap("]w", function()
+ vim.diagnostic.jump({
+ count = vim.v.count1,
+ severity = { min = vim.diagnostic.severity.WARN },
+ })
+end)
+nmap("[e", function()
+ vim.diagnostic.jump({
+ count = -vim.v.count1,
+ severity = vim.diagnostic.severity.ERROR,
+ })
+end)
+nmap("]e", function()
+ vim.diagnostic.jump({
+ count = vim.v.count1,
+ severity = vim.diagnostic.severity.ERROR,
+ })
+end)
+
+nmap("yp", function()
+ vim.fn.setreg("+", vim.fn.expand("%"))
+end, "[Y]ank [P]ath")
+
+local doas_exec = function(_cmd)
+ vim.fn.inputsave()
+ local password = vim.fn.inputsecret("Password: ")
+ vim.fn.inputrestore()
+ if not password or #password == 0 then
+ vim.notify("Invalid password, doas aborted", vim.log.levels.WARN)
+ return false
+ end
+ local out = vim.fn.system(string.format("doas -S %s", _cmd), password .. "\n")
+ if vim.v.shell_error ~= 0 then
+ print("\r\n")
+ vim.notify(out, vim.log.levels.ERROR)
+ return false
+ end
+ return true
+end
+
+vim.api.nvim_create_user_command("DoasWrite", function(opts)
+ local tmpfile = vim.fn.tempname()
+ local filepath
+ if #opts.fargs == 1 then
+ filepath = opts.fargs[1]
+ else
+ filepath = vim.fn.expand("%")
+ end
+ if not filepath or #filepath == 0 then
+ vim.notify("E32: No file name", vim.log.levels.ERROR)
+ return
+ end
+ -- `bs=1048576` is equivalent to `bs=1M` for GNU dd or `bs=1m` for BSD dd
+ -- Both `bs=1M` and `bs=1m` are non-POSIX
+ local _cmd = string.format(
+ "dd if=%s of=%s bs=1048576",
+ vim.fn.shellescape(tmpfile),
+ vim.fn.shellescape(filepath)
+ )
+ -- no need to check error as this fails the entire function
+ vim.api.nvim_exec2(string.format("write! %s", tmpfile), { output = true })
+ if doas_exec(_cmd) then
+ -- refreshes the buffer and prints the "written" message
+ vim.cmd.checktime()
+ -- exit command mode
+ vim.api.nvim_feedkeys(
+ vim.api.nvim_replace_termcodes("<Esc>", true, false, true),
+ "n",
+ true
+ )
+ end
+ vim.fn.delete(tmpfile)
+end, {
+ nargs = "?",
+ desc = "Write using doas permissions",
+})
diff --git a/dot_config/nvim/lua/config/options.lua b/dot_config/nvim/lua/config/options.lua
new file mode 100644
index 0000000..b2409b5
--- /dev/null
+++ b/dot_config/nvim/lua/config/options.lua
@@ -0,0 +1,114 @@
+local opt = vim.o
+
+-- Persistence
+opt.undofile = true -- persist undo history across sessions
+opt.swapfile = false -- no swap files; rely on undofile for recovery
+
+-- Gutter
+opt.number = true -- show line numbers
+opt.cursorline = true -- highlight current line
+opt.signcolumn = "auto:2" -- up to 2 sign columns, auto-hide when empty
+opt.laststatus = 3 -- single global statusline
+
+-- Indentation (defaults; guess-indent overrides per-buffer)
+opt.expandtab = true -- spaces instead of tabs
+opt.shiftround = true -- round indent to shiftwidth multiples
+opt.shiftwidth = 0 -- follow tabstop value
+opt.softtabstop = -1 -- follow shiftwidth value
+opt.tabstop = 4 -- 4-space tabs
+
+-- Search
+opt.gdefault = true -- substitute all matches per line by default
+opt.ignorecase = true -- case-insensitive search
+opt.smartcase = true -- ...unless query has uppercase
+
+-- Splits
+opt.splitbelow = true -- horizontal splits open below
+opt.splitright = true -- vertical splits open right
+opt.splitkeep = "screen" -- keep text position stable on split
+
+-- Line wrapping
+opt.linebreak = true -- wrap at word boundaries
+opt.breakindent = true -- indent wrapped lines
+opt.textwidth = 80 -- wrap column for formatting
+opt.colorcolumn = "+1" -- highlight column after textwidth
+vim.opt.formatoptions:remove("t") -- don't auto-wrap text while typing
+
+-- Messages
+opt.messagesopt = "wait:5000,history:500" -- message display timing and history depth
+
+vim.opt.shortmess:append({ a = true }) -- abbreviate all file messages
+
+-- Timing
+opt.updatetime = 250 -- CursorHold delay (ms); affects gitsigns, diagnostics
+opt.timeoutlen = 300 -- key sequence timeout (ms); affects which-key popup delay
+
+-- Completion and scrolling
+vim.opt.completeopt = { "menuone", "noselect", "popup", "fuzzy", "nearest" }
+opt.scrolloff = 999 -- keep cursor vertically centered
+opt.sidescrolloff = 5 -- horizontal scroll margin
+
+-- Clipboard (deferred to avoid blocking startup on clipboard detection)
+vim.schedule(function()
+ opt.clipboard = vim.env.SSH_TTY and "" or "unnamedplus"
+end)
+
+opt.mouse = "a" -- enable mouse in all modes
+
+vim.opt.wildmode = { "longest", "full" } -- cmdline completion: longest match, then full menu
+
+vim.opt.cpoptions:remove({ "_" }) -- cw changes to end of word (not compatible vi behavior)
+
+-- Visible whitespace
+vim.opt.listchars = {
+ tab = "> ",
+ space = "ยท",
+ extends = ">",
+ precedes = "<",
+ nbsp = "+",
+}
+opt.list = true -- show whitespace characters
+
+opt.confirm = true -- confirm before closing unsaved buffers
+
+opt.virtualedit = "block" -- allow cursor past end of line in visual block
+opt.spelloptions = "camel" -- treat camelCase words as separate words for spell check
+
+-- Disable unused providers
+vim.g.loaded_node_provider = 0
+vim.g.loaded_perl_provider = 0
+vim.g.loaded_python3_provider = 0
+
+-- Diff
+vim.opt.diffopt:append({
+ hiddenoff = true, -- disable diff on hidden buffers
+ iblank = true, -- ignore blank line changes
+ iwhiteall = true, -- ignore all whitespace changes
+ algorithm = "histogram", -- better diff algorithm
+})
+
+-- Use ripgrep for :grep
+if vim.fn.executable("rg") then
+ opt.grepprg = "rg\\ --vimgrep"
+ opt.grepformat = "%f:%l:%c:%m"
+end
+
+-- Popup and window borders
+opt.pumblend = 20 -- popup menu transparency
+opt.pumborder = "rounded"
+opt.winborder = "rounded" -- default border for floating windows
+
+-- Folding: set up treesitter-based folds but start with them closed.
+-- Autocmd in autocmds.lua sets foldexpr per-buffer when treesitter is available.
+vim.o.foldmethod = "expr"
+vim.o.foldenable = false
+
+vim.g.mapleader = " "
+vim.g.maplocalleader = ","
+
+-- Session persistence (for auto-session)
+opt.sessionoptions =
+ "blank,buffers,curdir,help,tabpages,winsize,winpos,terminal,localoptions"
+
+opt.exrc = true -- source project-local .nvim.lua files
+
diff --git a/dot_config/nvim/lua/plugins/ai.lua b/dot_config/nvim/lua/plugins/ai.lua
new file mode 100644
index 0000000..8c213b5
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/ai.lua
@@ -0,0 +1,34 @@
+require("copilot").setup({
+ suggestion = { enabled = false },
+ panel = { enabled = false },
+ server_opts_overrides = {
+ settings = {
+ telemetry = {
+ telemetryLevel = "off",
+ },
+ },
+ },
+ nes = {
+ enabled = true,
+ keymap = {
+ accept_and_goto = "<leader>p",
+ accept = false,
+ dismiss = "<Esc>",
+ },
+ },
+})
+
+-- Accept NES in insert mode (copilot.lua only binds normal mode)
+vim.keymap.set("i", "<C-f>", function()
+ local ok, nes = pcall(require, "copilot-lsp.nes")
+ if ok and nes.apply_pending_nes() then
+ return
+ end
+ -- Fallback: native <C-f> (scroll window forward)
+ local key = vim.api.nvim_replace_termcodes("<C-f>", true, false, true)
+ vim.api.nvim_feedkeys(key, "n", false)
+end, { desc = "Accept Copilot NES / scroll forward" })
+
+vim.keymap.set("n", "<leader>tc", function()
+ require("copilot.command").toggle()
+end, { desc = "[T]oggle [C]opilot attachment" })
diff --git a/dot_config/nvim/lua/plugins/completion.lua b/dot_config/nvim/lua/plugins/completion.lua
new file mode 100644
index 0000000..df24a5d
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/completion.lua
@@ -0,0 +1,86 @@
+require("blink.compat").setup({})
+
+require("blink.cmp").setup({
+ keymap = {
+ preset = "cmdline",
+ ["<CR>"] = { "accept", "fallback" },
+ },
+ appearance = {
+ use_nvim_cmp_as_default = true,
+ },
+ completion = {
+ menu = {
+ draw = {
+ columns = { { "kind_icon" }, { "label", gap = 1 } },
+ components = {
+ label = {
+ text = function(ctx)
+ return require("colorful-menu").blink_components_text(ctx)
+ end,
+ highlight = function(ctx)
+ return require("colorful-menu").blink_components_highlight(ctx)
+ end,
+ },
+ },
+ },
+ },
+ list = {
+ selection = {
+ preselect = function()
+ return not require("blink.cmp").snippet_active({ direction = 1 })
+ end,
+ },
+ },
+ documentation = { auto_show = true },
+ },
+ signature = {
+ enabled = true,
+ trigger = {
+ enabled = true,
+ show_on_keyword = true,
+ show_on_insert = true,
+ },
+ },
+ sources = {
+ default = { "lazydev", "lsp", "copilot", "snippets", "path", "buffer" },
+ per_filetype = {
+ ["dap-repl"] = { "dap" },
+ },
+ providers = {
+ path = {
+ opts = {
+ get_cwd = vim.fn.getcwd,
+ },
+ },
+ copilot = {
+ name = "copilot",
+ module = "blink-copilot",
+ score_offset = 100,
+ async = true,
+ },
+ lazydev = {
+ name = "LazyDev",
+ module = "lazydev.integrations.blink",
+ score_offset = 100,
+ },
+ dap = { name = "dap", module = "blink.compat.source" },
+ },
+ },
+})
+
+require("blink.pairs").setup({
+ mappings = {
+ disabled_filetypes = {},
+ },
+ highlights = {
+ groups = {
+ "BlinkIndentOrange",
+ "BlinkIndentViolet",
+ "BlinkIndentBlue",
+ "BlinkIndentRed",
+ "BlinkIndentCyan",
+ "BlinkIndentYellow",
+ "BlinkIndentGreen",
+ },
+ },
+})
diff --git a/dot_config/nvim/lua/plugins/debug.lua b/dot_config/nvim/lua/plugins/debug.lua
new file mode 100644
index 0000000..bef0d1c
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/debug.lua
@@ -0,0 +1,75 @@
+vim.keymap.set("n", "<leader>td", function()
+ require("debugmaster").mode.toggle()
+end, { desc = "[T]oggle [D]ebug mode" })
+
+local dap = require("dap")
+
+local function get_env_vars()
+ local variables = vim.fn.environ()
+ table.insert(variables, { ASAN_OPTIONS = "detect_leaks=0" })
+ return variables
+end
+
+dap.adapters.lldb = {
+ type = "executable",
+ command = "lldb-dap",
+ name = "lldb",
+ env = get_env_vars,
+}
+dap.adapters.gdb = {
+ type = "executable",
+ command = "gdb",
+ args = { "--interpreter=dap" },
+ env = get_env_vars,
+}
+dap.adapters.codelldb = {
+ type = "executable",
+ command = "codelldb",
+ env = get_env_vars,
+}
+
+local function get_program()
+ local _program
+ vim.ui.input({
+ prompt = "Program: ",
+ complete = "file_in_path",
+ }, function(res)
+ _program = res
+ end)
+ return vim.fn.system("which " .. _program):gsub("\n$", "")
+end
+
+local function get_args()
+ local _args
+ vim.ui.input({
+ prompt = "Args: ",
+ default = vim.fn.getreg("+"),
+ complete = "file",
+ }, function(res)
+ _args = res
+ end)
+ return require("dap.utils").splitstr(_args)
+end
+
+dap.configurations.cpp = {
+ {
+ name = "codelldb Launch",
+ type = "codelldb",
+ request = "launch",
+ cwd = "${workspaceFolder}",
+ program = get_program,
+ args = get_args,
+ stopOnEntry = true,
+ console = "integratedTerminal",
+ },
+}
+
+dap.configurations.c = dap.configurations.cpp
+dap.configurations.rust = dap.configurations.cpp
+
+require("nvim-dap-virtual-text").setup({})
+require("mason-nvim-dap").setup({
+ automatic_installation = false,
+ handlers = {},
+ ensure_installed = {},
+})
diff --git a/dot_config/nvim/lua/plugins/editing.lua b/dot_config/nvim/lua/plugins/editing.lua
new file mode 100644
index 0000000..5175516
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/editing.lua
@@ -0,0 +1,61 @@
+require("guess-indent").setup({})
+
+require("various-textobjs").setup({
+ keymaps = {
+ useDefaults = true,
+ },
+})
+
+-- dial.nvim: enhanced increment/decrement on standard vim keys
+vim.keymap.set("n", "<C-a>", function()
+ return require("dial.map").inc_normal()
+end, { expr = true, desc = "Increment" })
+vim.keymap.set("n", "<C-x>", function()
+ return require("dial.map").dec_normal()
+end, { expr = true, desc = "Decrement" })
+vim.keymap.set("v", "<C-a>", function()
+ return require("dial.map").inc_visual()
+end, { expr = true, desc = "Increment" })
+vim.keymap.set("v", "<C-x>", function()
+ return require("dial.map").dec_visual()
+end, { expr = true, desc = "Decrement" })
+vim.keymap.set("v", "g<C-a>", function()
+ return require("dial.map").inc_gvisual()
+end, { expr = true, desc = "Increment (sequential)" })
+vim.keymap.set("v", "g<C-x>", function()
+ return require("dial.map").dec_gvisual()
+end, { expr = true, desc = "Decrement (sequential)" })
+
+-- refactoring.nvim
+require("refactoring").setup({})
+
+vim.keymap.set("x", "<leader>re", function()
+ require("refactoring").refactor("Extract Function")
+end, { desc = "[R]efactor [E]xtract function" })
+vim.keymap.set("x", "<leader>rf", function()
+ require("refactoring").refactor("Extract Function To File")
+end, { desc = "[R]efactor extract function to [F]ile" })
+vim.keymap.set("x", "<leader>rv", function()
+ require("refactoring").refactor("Extract Variable")
+end, { desc = "[R]efactor extract [V]ariable" })
+vim.keymap.set("n", "<leader>rI", function()
+ require("refactoring").refactor("Inline Function")
+end, { desc = "[R]efactor [I]nline function" })
+vim.keymap.set({ "x", "n" }, "<leader>ri", function()
+ require("refactoring").refactor("Inline Variable")
+end, { desc = "[R]efactor [I]nline variable" })
+vim.keymap.set("n", "<leader>rb", function()
+ require("refactoring").refactor("Extract Block")
+end, { desc = "[R]efactor extract [B]lock" })
+vim.keymap.set("n", "<leader>rB", function()
+ require("refactoring").refactor("Extract Block To File")
+end, { desc = "[R]efactor extract [B]lock to file" })
+vim.keymap.set("n", "<leader>rp", function()
+ require("refactoring").debug.printf({})
+end, { desc = "[R]efactor [P]rint" })
+vim.keymap.set({ "x", "n" }, "<leader>rV", function()
+ require("refactoring").debug.print_var({})
+end, { desc = "[R]efactor [P]rint [V]ariable" })
+vim.keymap.set("n", "<leader>rc", function()
+ require("refactoring").debug.cleanup({})
+end, { desc = "[R]efactor [C]leanup" })
diff --git a/dot_config/nvim/lua/plugins/git.lua b/dot_config/nvim/lua/plugins/git.lua
new file mode 100644
index 0000000..b052c33
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/git.lua
@@ -0,0 +1,123 @@
+require("git-conflict").setup({
+ disable_diagnostics = true,
+ default_mappings = {
+ next = "]x",
+ prev = "[x",
+ },
+})
+
+require("neogit").setup({
+ disable_commit_confirmation = true,
+ kind = "split",
+ console_timeout = 5000,
+ auto_show_console = false,
+})
+
+vim.keymap.set("n", "<leader>go", function()
+ require("neogit").open()
+end, { desc = "neo[G]it [O]pen" })
+
+require("gitlinker").setup({
+ callbacks = {
+ ["git.sommerfeld.dev"] = function(url_data)
+ local url = require("gitlinker.hosts").get_base_https_url(url_data)
+ url = url .. "/tree/" .. url_data.file .. "?id=" .. url_data.rev
+ if url_data.lstart then
+ url = url .. "#n" .. url_data.lstart
+ end
+ return url
+ end,
+ },
+})
+
+vim.keymap.set("n", "<leader>gy", function()
+ require("gitlinker").get_buf_range_url("n")
+end)
+vim.keymap.set("v", "<leader>gy", function()
+ require("gitlinker").get_buf_range_url("v")
+end)
+
+require("gitsigns").setup({
+ signs = {
+ change = { show_count = true },
+ delete = { show_count = true },
+ topdelete = { show_count = true },
+ changedelete = { show_count = true },
+ },
+ numhl = true,
+ on_attach = function(bufnr)
+ local gs = require("gitsigns")
+ local function map(mode, l, r, desc)
+ vim.keymap.set(mode, l, r, { buffer = bufnr, desc = desc })
+ end
+ local function nmap(l, r, desc)
+ map("n", l, r, desc)
+ end
+ local function vmap(l, r, desc)
+ map("v", l, r, desc)
+ end
+ -- Navigation
+ nmap("]c", function()
+ if vim.wo.diff then
+ vim.cmd.normal({ "]c", bang = true })
+ else
+ gs.nav_hunk("next")
+ end
+ end, "Jump to next git [c]hange")
+
+ nmap("[c", function()
+ if vim.wo.diff then
+ vim.cmd.normal({ "[c", bang = true })
+ else
+ gs.nav_hunk("prev")
+ end
+ end, "Jump to previous git [c]hange")
+
+ -- Actions
+ nmap("<leader>hs", gs.stage_hunk, "git [s]tage hunk")
+ nmap("<leader>hr", gs.reset_hunk, "git [r]eset hunk")
+ vmap("<leader>hs", function()
+ gs.stage_hunk({ vim.fn.line("."), vim.fn.line("v") })
+ end, "git [s]tage hunk")
+ vmap("<leader>hr", function()
+ gs.reset_hunk({ vim.fn.line("."), vim.fn.line("v") })
+ end, "git [r]eset hunk")
+ nmap("<leader>hS", gs.stage_buffer, "git [S]tage buffer")
+ nmap("<leader>hR", gs.reset_buffer, "git [R]eset buffer")
+ nmap("<leader>hp", gs.preview_hunk, "git [p]review hunk")
+ nmap("<leader>hb", function()
+ gs.blame_line({ full = true })
+ end, "git [b]lame line")
+ nmap(
+ "<leader>tb",
+ gs.toggle_current_line_blame,
+ "[T]oggle git show [b]lame line"
+ )
+ nmap("<leader>hd", gs.diffthis, "git [d]iff against index")
+ nmap("<leader>hD", function()
+ gs.diffthis("~")
+ end, "git [D]iff against last commit")
+ nmap("<leader>hc", gs.change_base, "git [C]hange base to index")
+ nmap("<leader>hC", function()
+ gs.change_base("~")
+ end, "git [C]hange base to HEAD")
+ nmap(
+ "<leader>tgd",
+ gs.preview_hunk_inline,
+ "[T]oggle [G]it show [D]eleted"
+ )
+ nmap("<leader>tgw", gs.toggle_word_diff, "[T]oggle [G]it [W]ord diff")
+ nmap(
+ "<leader>tgl",
+ gs.toggle_linehl,
+ "[T]oggle [G]it [L]ine highlighting"
+ )
+ -- Text object
+ map(
+ { "o", "x" },
+ "ih",
+ ":<C-U>Gitsigns select_hunk<CR>",
+ "git [H]unk text object"
+ )
+ end,
+})
diff --git a/dot_config/nvim/lua/plugins/init.lua b/dot_config/nvim/lua/plugins/init.lua
new file mode 100644
index 0000000..b106b6e
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/init.lua
@@ -0,0 +1,58 @@
+-- Seamless navigation between neovim splits and zellij panes
+require("smart-splits").setup({})
+vim.keymap.set("n", "<C-h>", require("smart-splits").move_cursor_left, { desc = "Move to left split/pane" })
+vim.keymap.set("n", "<C-j>", require("smart-splits").move_cursor_down, { desc = "Move to below split/pane" })
+vim.keymap.set("n", "<C-k>", require("smart-splits").move_cursor_up, { desc = "Move to above split/pane" })
+vim.keymap.set("n", "<C-l>", require("smart-splits").move_cursor_right, { desc = "Move to right split/pane" })
+
+require("which-key").setup({
+ spec = {
+ { "g", group = "[G]oto" },
+ { "yo", group = "Toggle options" },
+ { "]", group = "Navigate to next" },
+ { "[", group = "Navigate to previous" },
+ { "<leader>c", group = "[C]ode", mode = { "n", "x" } },
+ { "<leader>g", group = "[G]it" },
+ { "<leader>h", group = "Git [H]unk", mode = { "n", "v" } },
+ { "<leader>o", group = "[O]verseer" },
+ { "<leader>r", group = "[R]efactor" },
+ { "<leader>w", group = "[W]orkspace" },
+ { "<leader>t", group = "[T]oggle" },
+ },
+})
+
+vim.keymap.set("n", "<leader>?", function()
+ require("which-key").show({ global = false })
+end, { desc = "Buffer Local Keymaps (which-key)" })
+
+require("quicker").setup({
+ keys = {
+ {
+ ">",
+ function()
+ require("quicker").expand({
+ before = 2,
+ after = 2,
+ add_to_existing = true,
+ })
+ end,
+ desc = "Expand quickfix context",
+ },
+ {
+ "<",
+ function()
+ require("quicker").collapse()
+ end,
+ desc = "Collapse quickfix context",
+ },
+ },
+})
+
+vim.keymap.set("n", "<leader>tq", function()
+ require("quicker").toggle()
+end, { desc = "[T]oggle [Q]uickfix" })
+vim.keymap.set("n", "<leader>tl", function()
+ require("quicker").toggle({ loclist = true })
+end, { desc = "[T]oggle [L]oclist" })
+
+require("oil").setup({})
diff --git a/dot_config/nvim/lua/plugins/lsp.lua b/dot_config/nvim/lua/plugins/lsp.lua
new file mode 100644
index 0000000..ddd5bea
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/lsp.lua
@@ -0,0 +1,280 @@
+require("lazydev").setup({
+ library = {
+ { path = "${3rd}/luv/library", words = { "vim%.uv" } },
+ },
+})
+
+vim.lsp.enable("just")
+pcall(vim.lsp.enable, "tblgen_lsp_server")
+
+require("fidget").setup({})
+require("mason").setup({})
+require("mason-lspconfig").setup({
+ ensure_installed = {},
+ automatic_installation = false,
+ handlers = {
+ function(server_name)
+ vim.lsp.enable(server_name)
+ end,
+ },
+})
+require("mason-tool-installer").setup({
+ ensure_installed = {
+ "actionlint",
+ "autotools-language-server",
+ "basedpyright",
+ "bash-language-server",
+ "clangd",
+ "codelldb",
+ "codespell",
+ "css-lsp",
+ "dockerfile-language-server",
+ "gh",
+ "gh-actions-language-server",
+ "groovy-language-server",
+ "hadolint",
+ "html-lsp",
+ "jq",
+ "json-lsp",
+ "jsonlint",
+ "just-lsp",
+ "lua-language-server",
+ "markdownlint",
+ "mdformat",
+ "neocmakelsp",
+ "nginx-config-formatter",
+ "nginx-language-server",
+ "npm-groovy-lint",
+ "prettier",
+ "ruff",
+ "rust-analyzer",
+ "shellcheck",
+ "shellharden",
+ "shfmt",
+ "stylelint",
+ "stylua",
+ "systemd-lsp",
+ "systemdlint",
+ "typescript-language-server",
+ "typos",
+ "yaml-language-server",
+ "yamllint",
+ "yq",
+ },
+})
+
+vim.api.nvim_create_autocmd("LspAttach", {
+ group = vim.api.nvim_create_augroup("lsp-attach", { clear = true }),
+ callback = function(event)
+ local bufnr = event.buf
+
+ local function map(mode, l, r, desc)
+ vim.keymap.set(mode, l, r, { buffer = bufnr, desc = "LSP: " .. desc })
+ end
+ local function nmap(l, r, desc)
+ map("n", l, r, desc)
+ end
+ nmap("<c-]>", vim.lsp.buf.definition, "Goto definition")
+ nmap("gD", vim.lsp.buf.declaration, "[G]oto [D]eclaration")
+
+ local fzf = require("fzf-lua")
+ nmap("gd", fzf.lsp_definitions, "[G]oto [D]efinition")
+ nmap("gvd", function()
+ fzf.lsp_definitions({ jump1_action = fzf.actions.file_vsplit })
+ end, "[G]oto in a [V]ertical split to [D]efinition")
+ nmap("gxd", function()
+ fzf.lsp_definitions({ jump1_action = fzf.actions.file_split })
+ end, "[G]oto in a [X]horizontal split to [D]efinition")
+ nmap("gtd", function()
+ fzf.lsp_definitions({ jump1_action = fzf.actions.file_tabedit })
+ end, "[G]oto in a [T]ab to [D]efinition")
+ nmap("gvt", function()
+ fzf.lsp_typedefs({ jump1_action = fzf.actions.file_vsplit })
+ end, "[G]oto in a [V]ertical split to [T]ype definition")
+ nmap("gxt", function()
+ fzf.lsp_typedefs({ jump1_action = fzf.actions.file_split })
+ end, "[G]oto in a [X]horizontal split to [T]ype definition")
+ nmap("gtt", function()
+ fzf.lsp_typedefs({ jump1_action = fzf.actions.file_tabedit })
+ end, "[G]oto in a [T]ab to [T]ype definition")
+ nmap("gri", fzf.lsp_implementations, "[G]oto [I]mplementation")
+ nmap("grvi", function()
+ fzf.lsp_implementations({ jump1_action = fzf.actions.file_vsplit })
+ end, "[G]oto in a [V]ertical split to [I]mplementation")
+ nmap("grxi", function()
+ fzf.lsp_implementations({ jump1_action = fzf.actions.file_split })
+ end, "[G]oto in a [X]horizontal split to [I]mplementation")
+ nmap("grti", function()
+ fzf.lsp_implementations({ jump1_action = fzf.actions.file_tabedit })
+ end, "[G]oto in a [T]ab to [I]mplementation")
+ nmap("grr", fzf.lsp_references, "[G]oto [R]eferences")
+ nmap("gvr", function()
+ fzf.lsp_references({ jump1_action = fzf.actions.file_vsplit })
+ end, "[G]oto in a [V]ertical split to [R]eferences")
+ nmap("gxr", function()
+ fzf.lsp_references({ jump1_action = fzf.actions.file_split })
+ end, "[G]oto in a [X]horizontal split to [R]eferences")
+ nmap("gtr", function()
+ fzf.lsp_references({ jump1_action = fzf.actions.file_tabedit })
+ end, "[G]oto in a [T]ab to [R]eferences")
+ nmap("<leader>ci", fzf.lsp_incoming_calls, "[C]ode [I]ncoming calls")
+ nmap("<leader>co", fzf.lsp_outgoing_calls, "[C]ode [O]utgoing calls")
+ nmap("gO", fzf.lsp_document_symbols, "d[O]ocument symbols")
+ nmap(
+ "<leader>ws",
+ fzf.lsp_live_workspace_symbols,
+ "[W]orkspace [S]ymbols"
+ )
+ nmap(
+ "<leader>wd",
+ fzf.diagnostics_workspace,
+ "[W]orkspace [D]iagnostics"
+ )
+
+ local client = vim.lsp.get_client_by_id(event.data.client_id)
+ if
+ client
+ and client:supports_method(
+ vim.lsp.protocol.Methods.textDocument_documentHighlight,
+ event.buf
+ )
+ then
+ local highlight_augroup =
+ vim.api.nvim_create_augroup("lsp-highlight", { clear = false })
+ vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, {
+ buffer = event.buf,
+ group = highlight_augroup,
+ callback = vim.lsp.buf.document_highlight,
+ })
+
+ vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, {
+ buffer = event.buf,
+ group = highlight_augroup,
+ callback = vim.lsp.buf.clear_references,
+ })
+
+ vim.api.nvim_create_autocmd("LspDetach", {
+ group = vim.api.nvim_create_augroup(
+ "lsp-detach",
+ { clear = true }
+ ),
+ callback = function(event2)
+ vim.lsp.buf.clear_references()
+ vim.api.nvim_clear_autocmds({
+ group = "lsp-highlight",
+ buffer = event2.buf,
+ })
+ end,
+ })
+ end
+
+ if
+ client
+ and client:supports_method(
+ vim.lsp.protocol.Methods.textDocument_codeLens,
+ event.buf
+ )
+ then
+ vim.lsp.codelens.enable(true, { bufnr = bufnr })
+ end
+
+ if
+ client
+ and client:supports_method(
+ vim.lsp.protocol.Methods.textDocument_inlayHint,
+ event.buf
+ )
+ then
+ nmap("<leader>th", function()
+ vim.lsp.inlay_hint.enable(
+ not vim.lsp.inlay_hint.is_enabled(event.buf)
+ )
+ end, "[T]oggle Inlay [H]ints")
+ end
+ end,
+})
+
+require("conform").setup({
+ formatters_by_ft = {
+ awk = { "gawk" },
+ bash = { "shfmt" },
+ cmake = { "cmake_format" },
+ css = { "prettier", "stylelint" },
+ groovy = { "npm-groovy-lint" },
+ html = { "prettier" },
+ javascript = { "prettier" },
+ typescript = { "prettier" },
+ jenkins = { "npm-groovy-lint" },
+ json = { "jq", "jsonlint" },
+ jsonc = { "prettier" },
+ just = { "just" },
+ markdown = { "mdformat" },
+ nginx = { "nginxfmt" },
+ lua = { "stylua" },
+ python = { "ruff_format", "ruff_fix", "ruff_organize_imports" },
+ rust = { "rustfmt" },
+ sh = { "shfmt", "shellcheck", "shellharden" },
+ yaml = { "yamllint" },
+ zsh = { "shfmt", "shellcheck", "shellharden" },
+ },
+ default_format_opts = {
+ lsp_format = "fallback",
+ },
+ formatters = {
+ shfmt = {
+ prepend_args = { "-i", "2" },
+ },
+ },
+})
+vim.o.formatexpr = "v:lua.require'conform'.formatexpr()"
+
+vim.keymap.set("", "<leader>f", function()
+ require("conform").format({ async = true, lsp_fallback = true })
+end, { desc = "[F]ormat buffer" })
+
+local lint = require("lint")
+lint.linters_by_ft = {
+ css = { "stylelint" },
+ dockerfile = { "hadolint" },
+ groovy = { "npm-groovy-lint" },
+ jenkins = { "npm-groovy-lint" },
+ json = { "jsonlint" },
+ markdown = { "markdownlint" },
+ makefile = { "checkmake" },
+ systemd = { "systemdlint" },
+ yaml = { "yamllint", "yq" },
+ ghaction = { "actionlint" },
+ zsh = { "zsh" },
+ ["*"] = { "codespell", "typos" },
+}
+vim.api.nvim_create_autocmd({ "BufReadPost", "BufWritePost" }, {
+ group = vim.api.nvim_create_augroup("lint", { clear = true }),
+ callback = function()
+ if vim.opt_local.modifiable:get() then
+ lint.try_lint()
+ end
+ end,
+})
+
+require("tiny-inline-diagnostic").setup({
+ options = {
+ show_source = {
+ if_many = true,
+ },
+ set_arrow_to_diag_color = true,
+ multilines = {
+ enabled = true,
+ },
+ show_all_diags_on_cursorline = true,
+ enable_on_select = true,
+ break_line = {
+ enabled = true,
+ },
+ severity = {
+ vim.diagnostic.severity.ERROR,
+ vim.diagnostic.severity.WARN,
+ vim.diagnostic.severity.INFO,
+ vim.diagnostic.severity.HINT,
+ },
+ },
+})
diff --git a/dot_config/nvim/lua/plugins/runner.lua b/dot_config/nvim/lua/plugins/runner.lua
new file mode 100644
index 0000000..28e4e5f
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/runner.lua
@@ -0,0 +1,77 @@
+local overseer = require("overseer")
+overseer.setup({})
+overseer.add_template_hook({ name = ".*" }, function(task_defn, util)
+ util.add_component(task_defn, {
+ "open_output",
+ on_start = "never",
+ on_complete = "failure",
+ direction = "vertical",
+ })
+end)
+
+vim.keymap.set("n", "<leader>to", function()
+ overseer.toggle()
+end, { desc = "[T]oggle [O]verseer" })
+vim.keymap.set("n", "<leader>ob", function()
+ overseer.run_task({ name = "just build", disallow_prompt = true })
+end, { desc = "[O]verseer [B]uild" })
+vim.keymap.set("n", "<leader>oB", function()
+ overseer.run_task({ name = "just build" })
+end, { desc = "[O]verseer [B]uild" })
+vim.keymap.set("n", "<leader>ot", function()
+ overseer.run_task({ name = "just test", disallow_prompt = true })
+end, { desc = "[O]verseer [J]ust [T]est" })
+vim.keymap.set("n", "<leader>oT", function()
+ overseer.run_task({ name = "just test" })
+end, { desc = "[O]verseer [J]ust [T]est" })
+vim.keymap.set("n", "<leader>of", function()
+ overseer.run_task({
+ name = "just test",
+ disallow_prompt = true,
+ params = { target = vim.fn.expand("%") },
+ })
+end, { desc = "[O]verseer test [F]ile" })
+vim.keymap.set("n", "<leader>oF", function()
+ overseer.run_task({
+ name = "just test",
+ params = { target = vim.fn.expand("%") },
+ })
+end, { desc = "[O]verseer test [F]ile" })
+vim.keymap.set("n", "<leader>od", function()
+ overseer.run_task({
+ name = "just debug=true test",
+ disallow_prompt = true,
+ params = { target = vim.fn.expand("%") },
+ })
+end, { desc = "[O]verseer [d]ebug test file" })
+vim.keymap.set("n", "<leader>oD", function()
+ overseer.run_task({
+ name = "just debug=true test",
+ params = { target = vim.fn.expand("%") },
+ })
+end, { desc = "[O]verseer [D]ebug test file" })
+vim.keymap.set("n", "<leader>oa", function()
+ overseer.run_task({
+ name = "just test_autofix",
+ disallow_prompt = true,
+ params = { target = vim.fn.expand("%") },
+ })
+end, { desc = "[O]verseer [A]utofix" })
+vim.keymap.set("n", "<leader>or", function()
+ overseer.run_task()
+end, { desc = "[O]verseer [R]un" })
+vim.keymap.set("n", "<leader>os", function()
+ vim.cmd("OverseerShell")
+end, { desc = "[O]verseer [S]hell" })
+vim.keymap.set("n", "<leader>ol", function()
+ local tasks = overseer.list_tasks({
+ sort = function(a, b)
+ return a.id > b.id
+ end,
+ })
+ if vim.tbl_isempty(tasks) then
+ vim.notify("No tasks found", vim.log.levels.WARN)
+ else
+ overseer.run_action(tasks[1], "restart")
+ end
+end, { desc = "[O]verseer run [L]ast" })
diff --git a/dot_config/nvim/lua/plugins/search.lua b/dot_config/nvim/lua/plugins/search.lua
new file mode 100644
index 0000000..a36cddc
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/search.lua
@@ -0,0 +1,60 @@
+local fzflua = require("fzf-lua")
+fzflua.setup({
+ keymap = {
+ builtin = {
+ true,
+ ["<M-p>"] = "toggle-preview",
+ },
+ },
+ grep = {
+ hidden = true,
+ RIPGREP_CONFIG_PATH = "~/.config/ripgrep/ripgreprc",
+ },
+ lsp = {
+ includeDeclaration = false,
+ },
+ actions = {
+ files = {
+ true,
+ ["ctrl-x"] = fzflua.actions.file_split,
+ },
+ },
+})
+fzflua.register_ui_select()
+
+vim.keymap.set("n", "<localleader>b", function()
+ fzflua.buffers()
+end, { desc = "fzf-lua [B]uffers" })
+vim.keymap.set("n", "<localleader>/", function()
+ fzflua.live_grep()
+end, { desc = "fzf-lua live grep" })
+vim.keymap.set("n", "<localleader>f", function()
+ fzflua.files()
+end, { desc = "fzf-lua [F]iles" })
+vim.keymap.set("n", "<leader><leader>", function()
+ fzflua.global()
+end, { desc = "fzf-lua global picker" })
+vim.keymap.set("n", "<localleader>d", function()
+ fzflua.diagnostics()
+end, { desc = "fzf-lua [D]iagnostics" })
+vim.keymap.set("n", "<localleader>r", function()
+ fzflua.resume()
+end, { desc = "fzf-lua [R]esume" })
+vim.keymap.set("n", "<localleader>gc", function()
+ fzflua.git_bcommits()
+end, { desc = "[G]it buffer [C]commits" })
+vim.keymap.set("v", "<localleader>gc", function()
+ fzflua.git_bcommits_range()
+end, { desc = "[G]it [C]commits for selected range" })
+vim.keymap.set("n", "<localleader>gC", function()
+ fzflua.git_commits()
+end, { desc = "[G]it (all) [C]commits" })
+vim.keymap.set("n", "<localleader>gb", function()
+ fzflua.git_branches()
+end, { desc = "[G]it [B]ranches" })
+vim.keymap.set("n", "<localleader>gs", function()
+ fzflua.git_status()
+end, { desc = "[G]it [S]tatus" })
+vim.keymap.set("n", "<localleader>gS", function()
+ fzflua.git_stash()
+end, { desc = "[G]it [S]tash" })
diff --git a/dot_config/nvim/lua/plugins/session.lua b/dot_config/nvim/lua/plugins/session.lua
new file mode 100644
index 0000000..a094727
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/session.lua
@@ -0,0 +1,77 @@
+local function get_cwd_as_name()
+ local dir = vim.fn.getcwd(0)
+ return dir:gsub("[^A-Za-z0-9]", "_")
+end
+local overseer = require("overseer")
+
+require("auto-session").setup({
+ use_git_branch = true,
+ pre_save_cmds = {
+ function()
+ overseer.save_task_bundle(
+ get_cwd_as_name(),
+ nil,
+ { on_conflict = "overwrite" }
+ )
+ end,
+ },
+ pre_restore_cmds = {
+ function()
+ for _, task in ipairs(overseer.list_tasks({})) do
+ task:dispose(true)
+ end
+ end,
+ },
+ post_restore_cmds = {
+ function()
+ overseer.load_task_bundle(
+ get_cwd_as_name(),
+ { ignore_missing = true, autostart = false }
+ )
+ end,
+ },
+ save_extra_data = function(_)
+ local ok, breakpoints = pcall(require, "dap.breakpoints")
+ if not ok or not breakpoints then
+ return
+ end
+
+ local bps = {}
+ local breakpoints_by_buf = breakpoints.get()
+ for buf, buf_bps in pairs(breakpoints_by_buf) do
+ bps[vim.api.nvim_buf_get_name(buf)] = buf_bps
+ end
+ if vim.tbl_isempty(bps) then
+ return
+ end
+ local extra_data = {
+ breakpoints = bps,
+ }
+ return vim.fn.json_encode(extra_data)
+ end,
+
+ restore_extra_data = function(_, extra_data)
+ local json = vim.fn.json_decode(extra_data)
+
+ if json.breakpoints then
+ local ok, breakpoints = pcall(require, "dap.breakpoints")
+
+ if not ok or not breakpoints then
+ return
+ end
+ vim.notify("restoring breakpoints")
+ for buf_name, buf_bps in pairs(json.breakpoints) do
+ for _, bp in pairs(buf_bps) do
+ local line = bp.line
+ local opts = {
+ condition = bp.condition,
+ log_message = bp.logMessage,
+ hit_condition = bp.hitCondition,
+ }
+ breakpoints.set(opts, vim.fn.bufnr(buf_name), line)
+ end
+ end
+ end
+ end,
+ suppressed_dirs = { "~/", "/" },
+})
diff --git a/dot_config/nvim/lua/plugins/treesitter.lua b/dot_config/nvim/lua/plugins/treesitter.lua
new file mode 100644
index 0000000..a4a488c
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/treesitter.lua
@@ -0,0 +1,83 @@
+require("treewalker").setup({})
+
+vim.keymap.set({ "n", "v" }, "<a-k>", "<cmd>Treewalker Up<cr>", { silent = true, desc = "Moves up to the previous neighbor node" })
+vim.keymap.set({ "n", "v" }, "<a-j>", "<cmd>Treewalker Down<cr>", { silent = true, desc = "Moves up to the next neighbor node" })
+vim.keymap.set({ "n", "v" }, "<a-h>", "<cmd>Treewalker Left<cr>", { silent = true, desc = "Moves to the first ancestor node that's on a different line from the current node" })
+vim.keymap.set({ "n", "v" }, "<a-l>", "<cmd>Treewalker Right<cr>", { silent = true, desc = "Moves to the next node down that's indented further than the current node" })
+vim.keymap.set("n", "<s-a-k>", "<cmd>Treewalker SwapUp<cr>", { silent = true, desc = "Swaps the highest node on the line upwards in the document" })
+vim.keymap.set("n", "<s-a-j>", "<cmd>Treewalker SwapDown<cr>", { silent = true, desc = "Swaps the biggest node on the line downward in the document" })
+vim.keymap.set("n", "<s-a-h>", "<cmd>Treewalker SwapLeft<cr>", { silent = true, desc = "Swap the node under the cursor with its previous neighbor" })
+vim.keymap.set("n", "<s-a-l>", "<cmd>Treewalker SwapRight<cr>", { silent = true, desc = "Swap the node under the cursor with its next neighbor" })
+
+require("nvim-treesitter").install({
+ "awk",
+ "bash",
+ "c",
+ "cmake",
+ "comment",
+ "cpp",
+ "css",
+ "csv",
+ "diff",
+ "dockerfile",
+ "doxygen",
+ "editorconfig",
+ "fortran",
+ "git_config",
+ "git_rebase",
+ "gitattributes",
+ "gitcommit",
+ "gitignore",
+ "groovy",
+ "gpg",
+ "hlsplaylist",
+ "html",
+ "http",
+ "ini",
+ "javascript",
+ "jq",
+ "jsdoc",
+ "json",
+ "just",
+ "llvm",
+ "lua",
+ "luadoc",
+ "luap",
+ "make",
+ "markdown",
+ "markdown_inline",
+ "query",
+ "passwd",
+ "printf",
+ "python",
+ "regex",
+ "readline",
+ "requirements",
+ "rust",
+ "sql",
+ "ssh_config",
+ "strace",
+ "tablegen",
+ "todotxt",
+ "toml",
+ "typescript",
+ "vim",
+ "vimdoc",
+ "xcompose",
+ "xml",
+ "xresources",
+ "yaml",
+})
+
+require("nvim-dap-repl-highlights").setup({})
+require("treesitter-context").setup({})
+
+require("ts_context_commentstring").setup({
+ enable_autocmd = false,
+})
+local get_option = vim.filetype.get_option
+vim.filetype.get_option = function(filetype, option)
+ return option == "commentstring"
+ and require("ts_context_commentstring.internal").calculate_commentstring()
+ or get_option(filetype, option)
+end
diff --git a/dot_config/nvim/lua/plugins/ui.lua b/dot_config/nvim/lua/plugins/ui.lua
new file mode 100644
index 0000000..50a2114
--- /dev/null
+++ b/dot_config/nvim/lua/plugins/ui.lua
@@ -0,0 +1,58 @@
+-- blink.indent (gruvbox setup is in init.lua)
+require("blink.indent").setup({
+ scope = {
+ highlights = {
+ "BlinkIndentOrange",
+ "BlinkIndentViolet",
+ "BlinkIndentBlue",
+ "BlinkIndentRed",
+ "BlinkIndentCyan",
+ "BlinkIndentYellow",
+ "BlinkIndentGreen",
+ },
+ underline = {
+ enabled = true,
+ highlights = {
+ "BlinkIndentOrangeUnderline",
+ "BlinkIndentVioletUnderline",
+ "BlinkIndentBlueUnderline",
+ "BlinkIndentRedUnderline",
+ "BlinkIndentCyanUnderline",
+ "BlinkIndentYellowUnderline",
+ "BlinkIndentGreenUnderline",
+ },
+ },
+ },
+})
+
+require("lualine").setup({
+ options = {
+ icons_enabled = false,
+ theme = "gruvbox_dark",
+ component_separators = "",
+ section_separators = "|",
+ disabled_filetypes = {
+ winbar = {
+ "dap-view",
+ "dap-repl",
+ "dap-view-term",
+ },
+ },
+ },
+ sections = {
+ lualine_a = { "filetype", { "filename", path = 1 } },
+ lualine_b = { "%l/%L:%c:%o" },
+ lualine_c = { "diff" },
+ lualine_x = { "searchcount", "selectioncount" },
+ lualine_y = { "overseer", "copilot" },
+ lualine_z = { "diagnostics" },
+ },
+ inactive_sections = {
+ lualine_a = {},
+ lualine_b = {},
+ lualine_c = { "filename" },
+ lualine_x = {},
+ lualine_y = {},
+ lualine_z = {},
+ },
+})
diff --git a/dot_config/nvim/nvim-pack-lock.json b/dot_config/nvim/nvim-pack-lock.json
new file mode 100644
index 0000000..6b17553
--- /dev/null
+++ b/dot_config/nvim/nvim-pack-lock.json
@@ -0,0 +1,222 @@
+{
+ "plugins": {
+ "auto-session": {
+ "rev": "62437532b38495551410b3f377bcf4aaac574ebe",
+ "src": "https://github.com/rmagatti/auto-session"
+ },
+ "blink-copilot": {
+ "rev": "7ad8209b2f880a2840c94cdcd80ab4dc511d4f39",
+ "src": "https://github.com/fang2hou/blink-copilot"
+ },
+ "blink.cmp": {
+ "rev": "78336bc89ee5365633bcf754d93df01678b5c08f",
+ "src": "https://github.com/saghen/blink.cmp",
+ "version": ">=0.0.0"
+ },
+ "blink.compat": {
+ "rev": "1454f14a8d855a578ceeba77c62538fa1459a67c",
+ "src": "https://github.com/saghen/blink.compat"
+ },
+ "blink.download": {
+ "rev": "a459c8fbf51359902971874b5ebe05f6602db8b4",
+ "src": "https://github.com/saghen/blink.download",
+ "version": "'main'"
+ },
+ "blink.indent": {
+ "rev": "9c80820ca77218a8d28e70075d6f44a1609911fe",
+ "src": "https://github.com/saghen/blink.indent"
+ },
+ "blink.pairs": {
+ "rev": "4e43012356d33a26f69eae475f746fbe9f325f44",
+ "src": "https://github.com/saghen/blink.pairs",
+ "version": ">=0.0.0"
+ },
+ "cmp-dap": {
+ "rev": "ea92773e84c0ad3288c3bc5e452ac91559669087",
+ "src": "https://github.com/rcarriga/cmp-dap"
+ },
+ "colorful-menu.nvim": {
+ "rev": "b51a659459df8d078201aefc995db8175ed55e84",
+ "src": "https://github.com/xzbdmw/colorful-menu.nvim"
+ },
+ "conform.nvim": {
+ "rev": "086a40dc7ed8242c03be9f47fbcee68699cc2395",
+ "src": "https://github.com/stevearc/conform.nvim"
+ },
+ "copilot-lsp": {
+ "rev": "1b6d8273594643f51bb4c0c1d819bdb21b42159d",
+ "src": "https://github.com/copilotlsp-nvim/copilot-lsp"
+ },
+ "copilot-lualine": {
+ "rev": "222e90bd8dcdf16ca1efc4e784416afb5f011c31",
+ "src": "https://github.com/AndreM222/copilot-lualine"
+ },
+ "copilot.lua": {
+ "rev": "ad7e729e9a6348f7da482be0271d452dbc4c8e2c",
+ "src": "https://github.com/zbirenbaum/copilot.lua"
+ },
+ "debugmaster.nvim": {
+ "rev": "c2a07077bebfb97bc8dd4ab300d7734a453683e3",
+ "src": "https://github.com/miroshQa/debugmaster.nvim",
+ "version": "'dashboard'"
+ },
+ "dial.nvim": {
+ "rev": "f2634758455cfa52a8acea6f142dcd6271a1bf57",
+ "src": "https://github.com/monaqa/dial.nvim"
+ },
+ "fidget.nvim": {
+ "rev": "889e2e96edef4e144965571d46f7a77bcc4d0ddf",
+ "src": "https://github.com/j-hui/fidget.nvim"
+ },
+ "friendly-snippets": {
+ "rev": "6cd7280adead7f586db6fccbd15d2cac7e2188b9",
+ "src": "https://github.com/rafamadriz/friendly-snippets"
+ },
+ "fzf-lua": {
+ "rev": "5bf93b12f70c7cc89a2cc6ee026b82f111815be8",
+ "src": "https://github.com/ibhagwan/fzf-lua",
+ "version": "'main'"
+ },
+ "git-conflict.nvim": {
+ "rev": "a1badcd070d176172940eb55d9d59029dad1c5a6",
+ "src": "https://github.com/akinsho/git-conflict.nvim"
+ },
+ "gitlinker.nvim": {
+ "rev": "cc59f732f3d043b626c8702cb725c82e54d35c25",
+ "src": "https://github.com/ruifm/gitlinker.nvim"
+ },
+ "gitsigns.nvim": {
+ "rev": "8d82c240f190fc33723d48c308ccc1ed8baad69d",
+ "src": "https://github.com/lewis6991/gitsigns.nvim"
+ },
+ "gruvbox.nvim": {
+ "rev": "154eb5ff5b96d0641307113fa385eaf0d36d9796",
+ "src": "https://github.com/ellisonleao/gruvbox.nvim"
+ },
+ "guess-indent.nvim": {
+ "rev": "84a4987ff36798c2fc1169cbaff67960aed9776f",
+ "src": "https://github.com/nmac427/guess-indent.nvim"
+ },
+ "lazydev.nvim": {
+ "rev": "ff2cbcba459b637ec3fd165a2be59b7bbaeedf0d",
+ "src": "https://github.com/folke/lazydev.nvim"
+ },
+ "lualine.nvim": {
+ "rev": "a905eeebc4e63fdc48b5135d3bf8aea5618fb21c",
+ "src": "https://github.com/nvim-lualine/lualine.nvim"
+ },
+ "markdown-preview.nvim": {
+ "rev": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee",
+ "src": "https://github.com/iamcco/markdown-preview.nvim"
+ },
+ "mason-lspconfig.nvim": {
+ "rev": "0a3b42c3e503df87aef6d6513e13148381495c3a",
+ "src": "https://github.com/williamboman/mason-lspconfig.nvim"
+ },
+ "mason-nvim-dap.nvim": {
+ "rev": "9a10e096703966335bd5c46c8c875d5b0690dade",
+ "src": "https://github.com/jay-babu/mason-nvim-dap.nvim"
+ },
+ "mason-tool-installer.nvim": {
+ "rev": "443f1ef8b5e6bf47045cb2217b6f748a223cf7dc",
+ "src": "https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim"
+ },
+ "mason.nvim": {
+ "rev": "b03fb0f20bc1d43daf558cda981a2be22e73ac42",
+ "src": "https://github.com/williamboman/mason.nvim"
+ },
+ "neogit": {
+ "rev": "e06745228600a585b88726fc9fba44a373c15a47",
+ "src": "https://github.com/NeogitOrg/neogit"
+ },
+ "nvim-dap": {
+ "rev": "45a69eba683a2c448dd9ecfc4de89511f0646b5f",
+ "src": "https://github.com/mfussenegger/nvim-dap"
+ },
+ "nvim-dap-repl-highlights": {
+ "rev": "f31deba47fe3ee6ff8d2f13d9dbd06b2d1ae06b5",
+ "src": "https://github.com/LiadOz/nvim-dap-repl-highlights"
+ },
+ "nvim-dap-virtual-text": {
+ "rev": "fbdb48c2ed45f4a8293d0d483f7730d24467ccb6",
+ "src": "https://github.com/theHamsta/nvim-dap-virtual-text"
+ },
+ "nvim-lint": {
+ "rev": "eab58b48eb11d7745c11c505e0f3057165902461",
+ "src": "https://github.com/mfussenegger/nvim-lint"
+ },
+ "nvim-lspconfig": {
+ "rev": "d10ce09e42bb0ca8600fd610c3bb58676e61208d",
+ "src": "https://github.com/neovim/nvim-lspconfig"
+ },
+ "nvim-surround": {
+ "rev": "9291040de8cd8a4439eb64c441e8d5d2bf884a5a",
+ "src": "https://github.com/kylechui/nvim-surround"
+ },
+ "nvim-treesitter": {
+ "rev": "4916d6592ede8c07973490d9322f187e07dfefac",
+ "src": "https://github.com/nvim-treesitter/nvim-treesitter",
+ "version": "'main'"
+ },
+ "nvim-treesitter-context": {
+ "rev": "b0c45cefe2c8f7b55fc46f34e563bc428ef99636",
+ "src": "https://github.com/nvim-treesitter/nvim-treesitter-context"
+ },
+ "nvim-treesitter-endwise": {
+ "rev": "8fe8a95630f4f2c72a87ba1927af649e0bfaa244",
+ "src": "https://github.com/RRethy/nvim-treesitter-endwise"
+ },
+ "nvim-ts-context-commentstring": {
+ "rev": "6141a40173c6efa98242dc951ed4b6f892c97027",
+ "src": "https://github.com/JoosepAlviste/nvim-ts-context-commentstring"
+ },
+ "nvim-various-textobjs": {
+ "rev": "ad78e9d925c95d675b32dd7ba6d253f96ce063fe",
+ "src": "https://github.com/chrisgrieser/nvim-various-textobjs"
+ },
+ "oil.nvim": {
+ "rev": "0fcc83805ad11cf714a949c98c605ed717e0b83e",
+ "src": "https://github.com/stevearc/oil.nvim"
+ },
+ "overseer.nvim": {
+ "rev": "f818eefff81f4b12fb7cf236f1b6c16768a2fcbc",
+ "src": "https://github.com/stevearc/overseer.nvim"
+ },
+ "plenary.nvim": {
+ "rev": "74b06c6c75e4eeb3108ec01852001636d85a932b",
+ "src": "https://github.com/nvim-lua/plenary.nvim"
+ },
+ "quicker.nvim": {
+ "rev": "063cc44da1eef8681bbd653b29d3bc961780886a",
+ "src": "https://github.com/stevearc/quicker.nvim"
+ },
+ "refactoring.nvim": {
+ "rev": "6784b54587e6d8a6b9ea199318512170ffb9e418",
+ "src": "https://github.com/ThePrimeagen/refactoring.nvim"
+ },
+ "rustaceanvim": {
+ "rev": "2497c7b2a61d4eb5dad716371a64ea82fb068bee",
+ "src": "https://github.com/mrcjkb/rustaceanvim"
+ },
+ "smart-splits.nvim": {
+ "rev": "ba2850ff3d3b09785a7105c69d06a12117d4b97d",
+ "src": "https://github.com/mrjones2014/smart-splits.nvim"
+ },
+ "tiny-inline-diagnostic.nvim": {
+ "rev": "57a0eb84b2008c76e77930639890d9874195b1e1",
+ "src": "https://github.com/rachartier/tiny-inline-diagnostic.nvim"
+ },
+ "tmux.nvim": {
+ "rev": "32ceaf2793582955ef9576809730878c4d2d9426",
+ "src": "https://github.com/aserowy/tmux.nvim"
+ },
+ "treewalker.nvim": {
+ "rev": "6fbceceb8966620da8970b727b6daa358b982805",
+ "src": "https://github.com/aaronik/treewalker.nvim"
+ },
+ "which-key.nvim": {
+ "rev": "3aab2147e74890957785941f0c1ad87d0a44c15a",
+ "src": "https://github.com/folke/which-key.nvim"
+ }
+ }
+}