diff --git a/.gitignore b/.gitignore index a52bd495579..3890fdb8bdd 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,6 @@ spell/ # nvim-pack-lock.json in version control - see :help vim.pack-lockfile # For the official `nvim-lua/kickstart.nvim` git repository, we leave it ignored to avoid unneeded # merge conflicts. -nvim-pack-lock.json +# nvim-pack-lock.json .DS_Store diff --git a/init.lua b/init.lua index feb5b5f6c95..fcc56e26c31 100644 --- a/init.lua +++ b/init.lua @@ -99,7 +99,7 @@ do vim.g.maplocalleader = ' ' -- Set to true if you have a Nerd Font installed and selected in the terminal - vim.g.have_nerd_font = false + vim.g.have_nerd_font = true -- [[ Setting options ]] -- See `:help vim.o` @@ -110,7 +110,7 @@ do vim.o.number = true -- You can also add relative line numbers, to help with jumping. -- Experiment for yourself to see if you like it! - -- vim.o.relativenumber = true + vim.o.relativenumber = true -- Enable mouse mode, can be useful for resizing splits for example! vim.o.mouse = 'a' @@ -118,11 +118,25 @@ do -- Don't show the mode, since it's already in the status line vim.o.showmode = false + -- OSC 52 clipboard support (works over SSH/tmux) + -- Must be set before vim.o.clipboard so Neovim uses OSC 52 for copy/paste + vim.g.clipboard = { + name = 'OSC 52', + copy = { + ['+'] = require('vim.ui.clipboard.osc52').copy '+', + ['*'] = require('vim.ui.clipboard.osc52').copy '*', + }, + paste = { + ['+'] = require('vim.ui.clipboard.osc52').paste '+', + ['*'] = require('vim.ui.clipboard.osc52').paste '*', + }, + } + -- Sync clipboard between OS and Neovim. -- Schedule the setting after `UiEnter` because it can increase startup-time. -- Remove this option if you want your OS clipboard to remain independent. -- See `:help 'clipboard'` - vim.schedule(function() vim.o.clipboard = 'unnamedplus' end) + -- vim.schedule(function() vim.o.clipboard = 'unnamedplus' end) -- Enable break indent vim.o.breakindent = true @@ -220,10 +234,10 @@ do vim.keymap.set('t', '', '', { desc = 'Exit terminal mode' }) -- TIP: Disable arrow keys in normal mode - -- vim.keymap.set('n', '', 'echo "Use h to move!!"') - -- vim.keymap.set('n', '', 'echo "Use l to move!!"') - -- vim.keymap.set('n', '', 'echo "Use k to move!!"') - -- vim.keymap.set('n', '', 'echo "Use j to move!!"') + vim.keymap.set('n', '', 'echo "Use h to move!!"') + vim.keymap.set('n', '', 'echo "Use l to move!!"') + vim.keymap.set('n', '', 'echo "Use k to move!!"') + vim.keymap.set('n', '', 'echo "Use j to move!!"') -- Keybinds to make split navigation easier. -- Use CTRL+ to switch between windows @@ -235,10 +249,10 @@ do vim.keymap.set('n', '', '', { desc = 'Move focus to the upper window' }) -- NOTE: Some terminals have colliding keymaps or are not able to send distinct keycodes - -- vim.keymap.set("n", "", "H", { desc = "Move window to the left" }) - -- vim.keymap.set("n", "", "L", { desc = "Move window to the right" }) - -- vim.keymap.set("n", "", "J", { desc = "Move window to the lower" }) - -- vim.keymap.set("n", "", "K", { desc = "Move window to the upper" }) + vim.keymap.set('n', '', 'H', { desc = 'Move window to the left' }) + vim.keymap.set('n', '', 'L', { desc = 'Move window to the right' }) + vim.keymap.set('n', '', 'J', { desc = 'Move window to the lower' }) + vim.keymap.set('n', '', 'K', { desc = 'Move window to the upper' }) -- [[ Basic Autocommands ]] -- See `:help lua-guide-autocommands` @@ -430,15 +444,11 @@ do comments = { italic = false }, -- Disable italics in comments }, } - + -- -- Load the colorscheme here. -- Like many other themes, this one has different styles, and you could load -- any other, such as 'tokyonight-storm', 'tokyonight-moon', or 'tokyonight-day'. - vim.cmd.colorscheme 'tokyonight-night' - - -- Highlight todo, notes, etc in comments - vim.pack.add { gh 'folke/todo-comments.nvim' } - require('todo-comments').setup { signs = false } + vim.cmd.colorscheme 'tokyonight-storm' -- [[ mini.nvim ]] -- A collection of various small independent plugins/modules @@ -734,15 +744,21 @@ do ---@type table local servers = { -- clangd = {}, - -- gopls = {}, - -- pyright = {}, - -- tsc = {}, - -- - -- Some languages (like rust) have entire language plugins that can be useful: - -- https://github.com/mrcjkb/rustaceanvim -- - -- But for many setups, the LSP (`rust_analyzer`) will work just fine - -- rust_analyzer = {}, + gopls = {}, + ruff = {}, + basedpyright = { + settings = { + basedpyright = { + analysis = { + typeCheckingMode = 'standard', + autoImportCompletions = true, + useLibraryCodeForTypes = true, + }, + }, + }, + }, + rust_analyzer = {}, stylua = {}, -- Used to format Lua code @@ -803,7 +819,8 @@ do -- You can press `g?` for help in this menu. local ensure_installed = vim.tbl_keys(servers or {}) vim.list_extend(ensure_installed, { - -- You can add other tools here that you want Mason to install + 'markdownlint-cli2', + 'prettier', }) require('mason-tool-installer').setup { ensure_installed = ensure_installed } @@ -826,8 +843,14 @@ do format_on_save = function(bufnr) -- You can specify filetypes to autoformat on save here: local enabled_filetypes = { - -- lua = true, - -- python = true, + lua = true, + markdown = true, + python = true, + go = true, + rust = true, + javascript = true, + typescript = true, + typescriptreact = true, } if enabled_filetypes[vim.bo[bufnr].filetype] then return { timeout_ms = 500 } @@ -840,12 +863,21 @@ do }, -- You can also specify external formatters in here. formatters_by_ft = { - -- rust = { 'rustfmt' }, + rust = { 'rustfmt' }, + markdown = { 'prettier', 'markdownlint-cli2' }, -- Conform can also run multiple formatters sequentially - -- python = { "isort", "black" }, + python = { 'ruff_format' }, -- -- You can use 'stop_after_first' to run the first available formatter from the list - -- javascript = { "prettierd", "prettier", stop_after_first = true }, + go = { 'goimports' }, + typescript = { 'prettierd' }, + typescriptreact = { 'prettierd' }, + javascript = { 'prettierd' }, + }, + formatters = { + prettier = { + prepend_args = { '--prose-wrap=always' }, + }, }, } @@ -856,83 +888,10 @@ end -- SECTION 8: AUTOCOMPLETE & SNIPPETS -- blink.cmp and luasnip setup -- ============================================================ -do - -- [[ Snippet Engine ]] - - -- NOTE: You can also specify plugin using a version range for its git tag. - -- See `:help vim.version.range()` for more info - vim.pack.add { { src = gh 'L3MON4D3/LuaSnip', version = vim.version.range '2.*' } } - require('luasnip').setup {} - - -- `friendly-snippets` contains a variety of premade snippets. - -- See the README about individual language/framework/plugin snippets: - -- https://github.com/rafamadriz/friendly-snippets - -- - -- vim.pack.add { gh 'rafamadriz/friendly-snippets' } - -- require('luasnip.loaders.from_vscode').lazy_load() - - -- [[ Autocomplete Engine ]] - vim.pack.add { { src = gh 'saghen/blink.cmp', version = vim.version.range '1.*' } } - require('blink.cmp').setup { - keymap = { - -- 'default' (recommended) for mappings similar to built-in completions - -- to accept ([y]es) the completion. - -- This will auto-import if your LSP supports it. - -- This will expand snippets if the LSP sent a snippet. - -- 'super-tab' for tab to accept - -- 'enter' for enter to accept - -- 'none' for no mappings - -- - -- For an understanding of why the 'default' preset is recommended, - -- you will need to read `:help ins-completion` - -- - -- No, but seriously. Please read `:help ins-completion`, it is really good! - -- - -- All presets have the following mappings: - -- /: move to right/left of your snippet expansion - -- : Open menu or open docs if already open - -- / or /: Select next/previous item - -- : Hide menu - -- : Toggle signature help - -- - -- See `:help blink-cmp-config-keymap` for defining your own keymap - preset = 'default', - - -- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see: - -- https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps - }, - - appearance = { - -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font' - -- Adjusts spacing to ensure icons are aligned - nerd_font_variant = 'mono', - }, - - completion = { - -- By default, you may press `` to show the documentation. - -- Optionally, set `auto_show = true` to show the documentation after a delay. - documentation = { auto_show = false, auto_show_delay_ms = 500 }, - }, - - sources = { - default = { 'lsp', 'path', 'snippets' }, - }, - - snippets = { preset = 'luasnip' }, - - -- Blink.cmp includes an optional, recommended rust fuzzy matcher, - -- which automatically downloads a prebuilt binary when enabled. - -- - -- By default, we use the Lua implementation instead, but you may enable - -- the rust implementation via `'prefer_rust_with_warning'` - -- - -- See `:help blink-cmp-config-fuzzy` for more information - fuzzy = { implementation = 'lua' }, - - -- Shows a signature help window while you type arguments for a function - signature = { enabled = true }, - } -end +-- NOTE: This section has been moved to lua/custom/plugins/blink.lua +-- to keep init.lua upstream-compatible and allow custom border settings +-- without causing merge conflicts on upstream updates. +-- -- ============================================================ -- SECTION 9: TREESITTER @@ -1014,16 +973,18 @@ do -- Here are some example plugins that I've included in the Kickstart repository. -- Uncomment any of the lines below to enable them (you will need to restart nvim). -- - -- require 'kickstart.plugins.debug' - -- require 'kickstart.plugins.indent_line' - -- require 'kickstart.plugins.lint' - -- require 'kickstart.plugins.autopairs' - -- require 'kickstart.plugins.neo-tree' + require 'kickstart.plugins.debug' + require 'kickstart.plugins.indent_line' + require 'kickstart.plugins.lint' + require 'kickstart.plugins.autopairs' + require 'kickstart.plugins.neo-tree' + -- NOTE: `kickstart.plugins.gitsigns` was removed upstream (merged into Section 4 above). + -- Gitsigns recommended keymaps are already configured in the `on_attach` in Section 4. -- NOTE: You can add your own plugins, configuration, etc. in `lua/custom/plugins/*.lua`. -- -- For independent modules, uncomment the convenience loader: - -- require 'custom.plugins' + require 'custom.plugins' -- -- `custom.plugins` automatically loads files from that directory, but their -- order is unspecified. If plugins depend on each other, keep them in the same @@ -1032,7 +993,7 @@ do -- If separate modules need a specific order, require them explicitly instead: -- require 'custom.plugins.colorscheme' -- require 'custom.plugins.ui' - -- require 'custom.plugins.git' + -- NOTE: `custom.plugins.git` does not exist (no lua/custom/plugins/git.lua), so it is disabled. end -- The line beneath this is called `modeline`. See `:help modeline` diff --git a/lua/custom/plugins/00-core.lua b/lua/custom/plugins/00-core.lua new file mode 100644 index 00000000000..de112c58de4 --- /dev/null +++ b/lua/custom/plugins/00-core.lua @@ -0,0 +1,176 @@ +-- Core settings, keymaps, autocommands, and highlights migrated from kickstartmanolo + +-- ============================================================ +-- Options +-- ============================================================ + +vim.opt.list = true +vim.opt.listchars = { + tab = '│ ', + trail = '·', + nbsp = '␣', + leadmultispace = '│ ', +} + +vim.o.nu = true +vim.o.tabstop = 4 +vim.o.softtabstop = 4 +vim.o.shiftwidth = 4 +vim.o.expandtab = true +vim.o.smartindent = true +vim.o.wrap = false +vim.o.swapfile = false +vim.o.backup = false +vim.o.termguicolors = true +vim.opt.isfname:append '@-@' +vim.opt.autoread = true +vim.opt.signcolumn = 'yes' +vim.opt.updatetime = 50 + +-- Add rounded borders to all floating windows (hover, signature help, diagnostics, etc.) +vim.o.winborder = 'rounded' + +-- Associate .gotmpl files with the gotmpl filetype (for gopls) +vim.filetype.add { extension = { gotmpl = 'gotmpl' } } + +-- ============================================================ +-- Keymaps +-- ============================================================ + +-- Visual mode: move selected lines +vim.keymap.set('v', 'J', ":m '>+1gv=gv", { desc = '[M]ove line down' }) +vim.keymap.set('v', 'K', ":m '<-2gv=gv", { desc = '[M]ove line up' }) + +-- Normal mode: join lines keeping cursor position +vim.keymap.set('n', 'J', 'mzJ`z', { desc = '[J]oin lines' }) + +-- Centered scrolling +vim.keymap.set('n', '', 'zz', { desc = '[D]own half page' }) +vim.keymap.set('n', '', 'zz', { desc = '[U]p half page' }) + +-- Centered search navigation +vim.keymap.set('n', 'n', 'nzzzv', { desc = '[N]ext search result' }) +vim.keymap.set('n', 'N', 'Nzzzv', { desc = '[-]rev search result' }) + +-- Format paragraph +vim.keymap.set('n', '=ap', "ma=ap'a", { desc = '[A]uto [P]aragraph' }) + +-- Clipboard & black hole registers +vim.keymap.set('x', 'p', [['_dP]], { desc = '[P]aste from black hole' }) +vim.keymap.set({ 'n', 'v' }, 'y', [["+y]], { desc = '[Y]ank to clipboard' }) +vim.keymap.set('n', 'Y', [["+Y]], { desc = '[Y]ank line to clipboard' }) +vim.keymap.set({ 'n', 'v' }, 'd', '"_d', { desc = '[D]elete to black hole' }) + +-- Location list navigation +vim.keymap.set('n', 'k', 'lnextzz', { desc = '[K]ext location' }) +vim.keymap.set('n', 'j', 'lprevzz', { desc = '[J]rev location' }) + +-- Terminal mode exit +vim.keymap.set('t', '', '', { desc = '[E]xit terminal' }) + +-- Replace all occurrences of word under cursor +vim.keymap.set('n', 'a', [[:%s/\<\>//gIc]], { desc = '[A]ll in file' }) + +-- Snippet navigation (blink.cmp) +vim.keymap.set({ 'i', 's' }, '', function() require('blink.cmp').snippet_forward() end, { desc = 'Snippet forward' }) + +vim.keymap.set({ 'i', 's' }, '', function() require('blink.cmp').snippet_backward() end, { desc = 'Snippet backward' }) + +-- Equalize splits +vim.keymap.set('n', 'w', '=', { desc = 'Make equal splits' }) + +-- Load all files with same extension into args +vim.keymap.set('n', 'ra', function() + local ext = vim.fn.expand '%:e' + local current_file = vim.fn.expand '%:p' + local view = vim.fn.winsaveview() + + local files = vim.fn.systemlist(string.format('find . -name "*.%s" -type f', ext)) + vim.cmd('args ' .. table.concat(files, ' ')) + + vim.cmd('edit ' .. vim.fn.fnameescape(current_file)) + vim.fn.winrestview(view) + + print(string.format('Loaded %d .%s files into args', #files, ext)) +end, { desc = 'Load all files with same extension into args' }) + +-- Replace word under cursor across all arg files +vim.keymap.set('n', 'rp', function() + vim.fn.setreg('/', '\\<' .. vim.fn.expand '' .. '\\>') + vim.cmd 'set hlsearch' + + vim.api.nvim_feedkeys( + vim.api.nvim_replace_termcodes( + [[:argdo %s/\<\>//gc | update]], + true, + false, + true + ), + 'n', + false + ) +end, { desc = 'Replace word under cursor in args' }) + +-- Substitute (surround took over s prefix) +vim.keymap.set({ 'n', 'v' }, 'ss', 's', { desc = 'Substitute' }) + +-- ============================================================ +-- Go Autocommands +-- ============================================================ + +-- Import organization handled by conform.nvim with goimports formatter on save. + +-- If you want organizeImports on InsertLeave, uncomment below with guard: +-- local go_group = vim.api.nvim_create_augroup('GoAutoImport', { clear = true }) +-- vim.api.nvim_create_autocmd('InsertLeave', { +-- group = go_group, +-- pattern = '*.go', +-- callback = function() +-- local clients = vim.lsp.get_clients({ bufnr = 0 }) +-- if vim.iter(clients):any(function(c) return c:supports_method('textDocument/codeAction', 0) end) then +-- vim.lsp.buf.code_action { context = { only = { 'source.organizeImports' } }, apply = true } +-- end +-- end, +-- }) + +-- Auto-fix Ruff import sorting on save +vim.api.nvim_create_autocmd('BufWritePre', { + pattern = '*.py', + callback = function() + vim.lsp.buf.code_action({ context = { only = { 'source.organizeImports' } }, apply = true }) + end, +}) + +-- ============================================================ +-- Highlights +-- ============================================================ + +vim.api.nvim_set_hl(0, 'Pmenu', { bg = 'none' }) +vim.api.nvim_set_hl(0, 'PmenuSel', { bg = 'none', blend = 10 }) + +-- ============================================================ +-- Transparency & Theme Overrides +-- ============================================================ + +-- Re-apply tokyonight with transparency settings +-- To revert back to tokyonight: uncomment below, comment out kanagawa setup in kanagawa.lua, +-- and uncomment the tokyonight block in init.lua +require('tokyonight').setup { + transparent = true, + styles = { + comments = { italic = false }, + floats = 'transparent', + sidebars = 'transparent', + }, +} +vim.cmd.colorscheme 'tokyonight-storm' + +-- Make native LSP inlay hints transparent without changing their text styling. +local ok, hl = pcall(vim.api.nvim_get_hl, 0, { name = 'LspInlayHint', link = false }) +if ok then + hl.bg = nil + vim.api.nvim_set_hl(0, 'LspInlayHint', hl) +end + +-- NOTE: blink.cmp border overrides (menu = 'none', signature = 'none') +-- are now set directly in init.lua to avoid double-setup issues. diff --git a/lua/custom/plugins/99.lua b/lua/custom/plugins/99.lua new file mode 100644 index 00000000000..c9c5fd48722 --- /dev/null +++ b/lua/custom/plugins/99.lua @@ -0,0 +1,39 @@ +-- -- ThePrimeagen/99: AI assistant integration +-- +-- local function gh(repo) +-- return 'https://github.com/' .. repo +-- end +-- +-- vim.pack.add { gh 'ThePrimeagen/99' } +-- +-- local _99 = require '99' +-- local cwd = vim.uv.cwd() +-- local basename = vim.fs.basename(cwd) +-- +-- _99.setup { +-- provider = _99.Providers.OpenCodeProvider, +-- model = 'opencode-go/qwen3.5-plus', +-- logger = { +-- level = _99.DEBUG, +-- path = '/tmp/' .. basename .. '.99.debug', +-- print_on_error = true, +-- }, +-- md_files = { +-- 'AGENT.md', +-- 'SKILL.md', +-- }, +-- } +-- +-- vim.keymap.set('n', '9s', function() +-- _99.search() +-- end, { desc = '[9]9 Search' }) +-- +-- vim.keymap.set('v', '9vd', function() +-- _99.set_model('opencode-go/qwen3.5-plus') +-- _99.visual() +-- end, { desc = '[9]9 Visual [d]efault (qwen3.5-plus)' }) +-- +-- vim.keymap.set('v', '9vf', function() +-- _99.set_model('opencode-go/mimo-v2-pro') +-- _99.visual() +-- end, { desc = '[9]9 Visual [f]ast (mimo-v2-pro)' }) diff --git a/lua/custom/plugins/autotag.lua b/lua/custom/plugins/autotag.lua new file mode 100644 index 00000000000..a50ba425560 --- /dev/null +++ b/lua/custom/plugins/autotag.lua @@ -0,0 +1,8 @@ +-- nvim-ts-autotag: auto-close HTML/XML tags + +local function gh(repo) + return 'https://github.com/' .. repo +end + +vim.pack.add { gh 'windwp/nvim-ts-autotag' } +require('nvim-ts-autotag').setup {} diff --git a/lua/custom/plugins/blink.lua b/lua/custom/plugins/blink.lua new file mode 100644 index 00000000000..89243277a9d --- /dev/null +++ b/lua/custom/plugins/blink.lua @@ -0,0 +1,88 @@ +-- Autocomplete & Snippets +-- Moved from init.lua (SECTION 7) to keep init.lua upstream-compatible +-- and allow custom border settings without merge conflicts. + +local function gh(repo) + return 'https://github.com/' .. repo +end + +-- [[ Snippet Engine ]] + +-- NOTE: You can also specify plugin using a version range for its git tag. +-- See `:help vim.version.range()` for more info +vim.pack.add { { src = gh 'L3MON4D3/LuaSnip', version = vim.version.range '2.*' } } +require('luasnip').setup {} + +-- `friendly-snippets` contains a variety of premade snippets. +-- See the README about individual language/framework/plugin snippets: +-- https://github.com/rafamadriz/friendly-snippets +-- +-- vim.pack.add { gh 'rafamadriz/friendly-snippets' } +-- require('luasnip.loaders.from_vscode').lazy_load() + +-- [[ Autocomplete Engine ]] +vim.pack.add { { src = gh 'saghen/blink.cmp', version = vim.version.range '1.*' } } +require('blink.cmp').setup { + keymap = { + -- 'default' (recommended) for mappings similar to built-in completions + -- to accept ([y]es) the completion. + -- This will auto-import if your LSP supports it. + -- This will expand snippets if the LSP sent a snippet. + -- 'super-tab' for tab to accept + -- 'enter' for enter to accept + -- 'none' for no mappings + -- + -- For an understanding of why the 'default' preset is recommended, + -- you will need to read `:help ins-completion` + -- + -- No, but seriously. Please read `:help ins-completion`, it is really good! + -- + -- All presets have the following mappings: + -- /: move to right/left of your snippet expansion + -- : Open menu or open docs if already open + -- / or /: Select next/previous item + -- : Hide menu + -- : Toggle signature help + -- + -- See `:help blink-cmp-config-keymap` for defining your own keymap + preset = 'default', + + -- Disable default Tab snippet navigation (using C-, / C-. instead) + [''] = false, + [''] = false, + + -- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see: + -- https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps + }, + + appearance = { + -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font' + -- Adjusts spacing to ensure icons are aligned + nerd_font_variant = 'mono', + }, + + completion = { + -- By default, you may press `` to show the documentation. + -- Optionally, set `auto_show = true` to show the documentation after a delay. + documentation = { auto_show = false, auto_show_delay_ms = 500 }, + menu = { border = 'none' }, + }, + + sources = { + default = { 'lsp', 'path', 'snippets' }, + }, + + snippets = { preset = 'luasnip' }, + + -- Blink.cmp includes an optional, recommended rust fuzzy matcher, + -- which automatically downloads a prebuilt binary when enabled. + -- + -- By default, we use the Lua implementation instead, but you may enable + -- the rust implementation via `'prefer_rust_with_warning'` + -- + -- See `:help blink-cmp-config-fuzzy` for more information + fuzzy = { implementation = 'prefer_rust_with_warning' }, + + -- Shows a signature help window while you type arguments for a function + signature = { enabled = true, window = { border = 'rounded' } }, +} diff --git a/lua/custom/plugins/bufferline.lua b/lua/custom/plugins/bufferline.lua new file mode 100644 index 00000000000..335d1b1f669 --- /dev/null +++ b/lua/custom/plugins/bufferline.lua @@ -0,0 +1,29 @@ +-- local function gh(repo) return 'https://github.com/' .. repo end +-- +-- vim.pack.add { gh 'akinsho/bufferline.nvim' } +-- +-- require('bufferline').setup { +-- options = { +-- mode = 'buffers', +-- diagnostics = 'nvim_lsp', +-- separator_style = 'thin', +-- always_show_bufferline = false, +-- offsets = { +-- { +-- filetype = 'snacks_explorer', +-- text = 'Explorer', +-- text_align = 'center', +-- separator = true, +-- }, +-- }, +-- }, +-- } +-- +-- vim.keymap.set('n', 'H', 'BufferLineCyclePrev', { desc = 'Prev buffer' }) +-- vim.keymap.set('n', 'L', 'BufferLineCycleNext', { desc = 'Next buffer' }) +-- vim.keymap.set('n', 'vd', 'bdelete', { desc = '[V]uffer [D]elete' }) +-- vim.keymap.set('n', 'vD', 'bdelete!', { desc = '[V]uffer [D]elete (force)' }) +-- vim.keymap.set('n', 'vo', 'BufferLineCloseOthers', { desc = '[V]uffer delete [O]thers' }) +-- vim.keymap.set('n', 'vp', 'BufferLineCyclePrev', { desc = '[V]uffer [P]rev' }) +-- vim.keymap.set('n', 'vn', 'BufferLineCycleNext', { desc = '[V]uffer [N]ext' }) + diff --git a/lua/custom/plugins/fterm.lua b/lua/custom/plugins/fterm.lua new file mode 100644 index 00000000000..f1de38e2d2b --- /dev/null +++ b/lua/custom/plugins/fterm.lua @@ -0,0 +1,23 @@ +-- FTerm.nvim: floating terminal + +local function gh(repo) return 'https://github.com/' .. repo end + +vim.pack.add { gh 'numToStr/FTerm.nvim' } + +local fterm = require 'FTerm' +local custom_term = fterm:new { + ft = 'fterm_custom', + cmd = vim.o.shell, + dimensions = { + height = 0.6, + width = 0.5, + x = 0.95, + y = 0.95, + }, + border = 'rounded', +} + +function _G.__fterm_custom_toggle() custom_term:toggle() end + +vim.keymap.set('n', '', 'lua __fterm_custom_toggle()', { desc = '[T]oggle [T]erminal' }) +vim.keymap.set('t', '', 'lua __fterm_custom_toggle()', { desc = '[T]oggle [T]erminal' }) diff --git a/lua/custom/plugins/harpoon.lua b/lua/custom/plugins/harpoon.lua new file mode 100644 index 00000000000..27cd634da2e --- /dev/null +++ b/lua/custom/plugins/harpoon.lua @@ -0,0 +1,35 @@ +-- harpoon: quickly navigate to marked files + +local function gh(repo) return 'https://github.com/' .. repo end + +vim.pack.add { { src = gh 'ThePrimeagen/harpoon', branch = 'harpoon2' } } + +local harpoon = require 'harpoon' +local mark = require 'harpoon.mark' +local ui = require 'harpoon.ui' + +require('which-key').add { { 'm', group = 'Harpoon' } } + +harpoon:setup() + +-- Workaround: harpoon2 bug where json_encode fails on function references +-- during BufLeave from snacks explorer/picker windows +local orig_save = harpoon.save +if orig_save then + harpoon.save = function(...) + pcall(orig_save, ...) + end +end + +vim.keymap.set('n', 'ma', function() mark.add_file() end, { desc = 'Harpoon [A]dd file' }) +vim.keymap.set('n', 'mm', function() ui.toggle_quick_menu() end, { desc = 'Harpoon [M]enu' }) +vim.keymap.set('n', 'mh', function() ui.nav_file(1) end, { desc = 'Harpoon file 1' }) +vim.keymap.set('n', 'mj', function() ui.nav_file(2) end, { desc = 'Harpoon file 2' }) +vim.keymap.set('n', 'mk', function() ui.nav_file(3) end, { desc = 'Harpoon file 3' }) +vim.keymap.set('n', 'ml', function() ui.nav_file(4) end, { desc = 'Harpoon file 4' }) + +-- Alt+hjkl to navigate harpoon files 1-4 +vim.keymap.set('n', '', function() ui.nav_file(1) end, { desc = 'Harpoon file 1' }) +vim.keymap.set('n', '', function() ui.nav_file(2) end, { desc = 'Harpoon file 2' }) +vim.keymap.set('n', '', function() ui.nav_file(3) end, { desc = 'Harpoon file 3' }) +vim.keymap.set('n', '', function() ui.nav_file(4) end, { desc = 'Harpoon file 4' }) \ No newline at end of file diff --git a/lua/custom/plugins/inlay-hints.lua b/lua/custom/plugins/inlay-hints.lua new file mode 100644 index 00000000000..211f7bf5fbc --- /dev/null +++ b/lua/custom/plugins/inlay-hints.lua @@ -0,0 +1,17 @@ +-- Configure server-side inlay hints. + +vim.lsp.config('gopls', { + settings = { + gopls = { + hints = { + assignVariableTypes = true, + compositeLiteralFields = true, + compositeLiteralTypes = true, + constantValues = true, + functionTypeParameters = true, + parameterNames = true, + rangeVariableTypes = true, + }, + }, + }, +}) diff --git a/lua/custom/plugins/kanagawa.lua b/lua/custom/plugins/kanagawa.lua new file mode 100644 index 00000000000..15b8842cf2f --- /dev/null +++ b/lua/custom/plugins/kanagawa.lua @@ -0,0 +1,26 @@ +-- local function gh(repo) return 'https://github.com/' .. repo end +-- vim.pack.add { gh 'rebelot/kanagawa.nvim' } +-- require('kanagawa').setup { +-- transparent = true, +-- commentStyle = { italic = false }, +-- colors = { +-- theme = { +-- all = { +-- ui = { +-- bg_gutter = 'none', +-- }, +-- }, +-- }, +-- }, +-- overrides = function(colors) +-- return { +-- NormalFloat = { bg = 'none' }, +-- FloatBorder = { bg = 'none' }, +-- FloatTitle = { bg = 'none' }, +-- NormalDark = { bg = 'none' }, +-- NormalSide = { bg = 'none' }, +-- } +-- end, +-- } +-- vim.cmd.colorscheme 'kanagawa' + diff --git a/lua/custom/plugins/markdown.lua b/lua/custom/plugins/markdown.lua new file mode 100644 index 00000000000..43db3871ed2 --- /dev/null +++ b/lua/custom/plugins/markdown.lua @@ -0,0 +1,46 @@ +-- Render Markdown with visual wrapping, without changing the file's line breaks. + +local function gh(repo) return 'https://github.com/' .. repo end + +vim.pack.add { gh 'MeanderingProgrammer/render-markdown.nvim' } + +require('render-markdown').setup { + preset = 'lazy', + file_types = { 'markdown' }, + code = { + sign = false, + width = 'block', + right_pad = 1, + }, + heading = { + sign = false, + icons = {}, + }, + overrides = { + buftype = { + nofile = { + code = { + disable_background = true, + highlight_border = false, + }, + }, + }, + }, +} + +vim.api.nvim_create_autocmd('FileType', { + pattern = 'markdown', + callback = function(args) + vim.opt_local.wrap = true + vim.opt_local.linebreak = true + vim.opt_local.breakindent = true + vim.opt_local.showbreak = ' ' + vim.opt_local.textwidth = 0 + vim.opt_local.wrapmargin = 0 + + vim.keymap.set('n', 'um', 'RenderMarkdown toggle', { + buffer = args.buf, + desc = 'Toggle Markdown rendering', + }) + end, +}) diff --git a/lua/custom/plugins/marks.lua b/lua/custom/plugins/marks.lua new file mode 100644 index 00000000000..4080afcd03e --- /dev/null +++ b/lua/custom/plugins/marks.lua @@ -0,0 +1,5 @@ +local function gh(repo) return 'https://github.com/' .. repo end + +vim.pack.add { gh 'chentoast/marks.nvim' } + +require('marks').setup {} diff --git a/lua/custom/plugins/no-doc-highlight.lua b/lua/custom/plugins/no-doc-highlight.lua new file mode 100644 index 00000000000..802fa44eadb --- /dev/null +++ b/lua/custom/plugins/no-doc-highlight.lua @@ -0,0 +1,4 @@ +-- Disable LSP document highlight (highlight all instances of word under cursor) +-- Keeps updatetime=50 for fast diagnostic floats, but removes the visual highlight +vim.lsp.buf.document_highlight = function() end + diff --git a/lua/custom/plugins/orgmode.lua b/lua/custom/plugins/orgmode.lua new file mode 100644 index 00000000000..25189e1bfe1 --- /dev/null +++ b/lua/custom/plugins/orgmode.lua @@ -0,0 +1,33 @@ +local gh = function(repo) return 'https://github.com/' .. repo end + +vim.pack.add { + gh 'nvim-orgmode/orgmode', + gh 'nvim-orgmode/org-bullets.nvim', + gh 'nvim-orgmode/telescope-orgmode.nvim', +} + +require('orgmode').setup { + org_agenda_files = '~/org/**/*', + org_default_notes_file = '~/org/refile.org', + org_capture_templates = { + d = { + description = 'Dev journal entry', + template = '**** %^{Topic}\n***** %U %?', + target = '~/org/dev-journal.org', + datetree = true, + }, + }, + org_babel_default_header_args = { + [':tangle'] = 'no', + [':noweb'] = 'no', + }, + org_edit_src_filetype_map = { + -- sh = 'bash', + }, +} + +require('org-bullets').setup() + +vim.lsp.enable('org') + +pcall(require('telescope').load_extension, 'orgmode') diff --git a/lua/custom/plugins/rust.lua b/lua/custom/plugins/rust.lua new file mode 100644 index 00000000000..dbb551f1232 --- /dev/null +++ b/lua/custom/plugins/rust.lua @@ -0,0 +1,26 @@ +vim.lsp.config('rust_analyzer', { + settings = { + ['rust-analyzer'] = { + cargo = { buildScripts = { enable = true } }, + procMacro = { enable = true }, + }, + }, +}) +vim.lsp.enable('rust_analyzer') + +vim.api.nvim_create_autocmd('BufWritePre', { + pattern = '*.rs', + group = vim.api.nvim_create_augroup('rust', { clear = true }), + callback = function(args) + local client = vim.lsp.get_clients({ name = 'rust_analyzer', bufnr = args.buf })[1] + if not client then return end + + local params = vim.lsp.util.make_range_params(0, client.offset_encoding) + params.context = { only = { 'source.organizeImports' } } + + local result = client.request_sync('textDocument/codeAction', params, 1000) + if result and result.result and result.result[1] and result.result[1].edit then + vim.lsp.util.apply_workspace_edit(result.result[1].edit, client.offset_encoding) + end + end, +}) diff --git a/lua/custom/plugins/smear-cursor.lua b/lua/custom/plugins/smear-cursor.lua new file mode 100644 index 00000000000..11600b64d43 --- /dev/null +++ b/lua/custom/plugins/smear-cursor.lua @@ -0,0 +1,30 @@ +-- smear-cursor.nvim: animated cursor movement + +-- local function gh(repo) return 'https://github.com/' .. repo end +-- +-- vim.pack.add { gh 'sphamba/smear-cursor.nvim' } +-- +-- require('smear_cursor').setup { +-- smear_between_buffers = true, +-- smear_between_neighbor_lines = true, +-- scroll_buffer_space = true, +-- legacy_computing_symbols_support = true, +-- smear_insert_mode = true, +-- +-- -- Transparent background: TokyoNight storm has no opaque bg, so the smear +-- -- rendering can leave a shadow. This fallback color eliminates it. +-- transparent_bg_fallback_color = '#24283b', +-- +-- -- Slightly snappier than defaults (matches your 50ms updatetime) +-- stiffness = 0.8, +-- trailing_stiffness = 0.6, +-- stiffness_insert_mode = 0.7, +-- trailing_stiffness_insert_mode = 0.7, +-- damping = 0.95, +-- damping_insert_mode = 0.95, +-- distance_stop_animating = 0.5, +-- +-- -- Prevent ghost cursor artifacts when using transparent backgrounds +-- hide_target_hack = true, +-- never_draw_over_target = true, +-- } diff --git a/lua/custom/plugins/snacks.lua b/lua/custom/plugins/snacks.lua new file mode 100644 index 00000000000..0deee02e377 --- /dev/null +++ b/lua/custom/plugins/snacks.lua @@ -0,0 +1,131 @@ +-- snacks.nvim: UI utilities suite + +local function gh(repo) return 'https://github.com/' .. repo end + +vim.pack.add { gh 'folke/snacks.nvim' } + +require('snacks').setup { + bigfile = { enabled = true }, + dashboard = { enabled = false }, + explorer = { + enabled = true, + replace_netrw = false, + }, + indent = { enabled = true }, + input = { enabled = true }, + notifier = { enabled = true }, + picker = { + enabled = false, + sources = { + explorer = { + auto_close = true, + layout = { + { preview = true }, + layout = { + box = 'horizontal', + width = 0.8, + height = 0.8, + { + box = 'vertical', + border = 'rounded', + title = '{source} {live} {flags}', + title_pos = 'center', + { win = 'input', height = 1, border = 'bottom' }, + { win = 'list', border = 'none' }, + }, + { win = 'preview', border = 'rounded', width = 0.8, title = '{preview}' }, + }, + }, + }, + }, + }, + quickfile = { enabled = true }, + scope = { enabled = true }, + scroll = { enabled = true }, + statuscolumn = { enabled = false }, + words = { enabled = true }, + styles = { + notification = {}, + }, +} + +-- ============================================================ +-- Which-key groups +-- ============================================================ + +require('which-key').add { + { 'u', group = 'Undo/Toggle' }, + { 'g', group = 'Git', mode = { 'n', 'v' } }, + { 'c', group = 'Code' }, +} + +-- ============================================================ +-- Keymaps +-- ============================================================ + +-- Explorer +vim.keymap.set('n', 'e', function() Snacks.explorer() end, { desc = 'File Explorer' }) + +-- Git +vim.keymap.set('n', 'gg', function() Snacks.lazygit() end, { desc = 'Lazygit' }) + +vim.keymap.set({ 'n', 'v' }, 'gB', function() Snacks.gitbrowse() end, { desc = 'Git Browse' }) + +-- Disabled: snacks.picker is disabled; undo via this keymap would error at runtime +-- vim.keymap.set('n', 'su', function() Snacks.picker.undo() end, { desc = 'Undo History' }) + +-- File rename +vim.keymap.set('n', 'cR', function() Snacks.rename.rename_file() end, { desc = 'Rename File' }) + +-- Neovim News +vim.keymap.set( + 'n', + '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' } +) + +-- Words navigation +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' }) + +-- Scope text objects (inner/around) +vim.keymap.set({ 'x', 'o' }, 'ip', '(snacks_scope_inner)', { desc = 'Inner Scope' }) +vim.keymap.set({ 'x', 'o' }, 'ap', '(snacks_scope_outer)', { desc = 'Around Scope' }) + +-- ============================================================ +-- Toggles (set up on VeryLazy) +-- Disabled: toggle keymaps were non-functional, individual toggles available via :Snacks commands +-- ============================================================ + +-- vim.api.nvim_create_autocmd('User', { +-- pattern = 'VeryLazy', +-- callback = function() +-- Snacks.toggle.option('spell', { name = 'Spelling' }):map 'us' +-- Snacks.toggle.option('wrap', { name = 'Wrap' }):map 'uw' +-- Snacks.toggle.option('relativenumber', { name = 'Relative Number' }):map 'uL' +-- Snacks.toggle.diagnostics():map 'ud' +-- Snacks.toggle.line_number():map 'ul' +-- Snacks.toggle.option('conceallevel', { off = 0, on = vim.o.conceallevel > 0 and vim.o.conceallevel or 2 }):map 'uc' +-- Snacks.toggle.treesitter():map 'uT' +-- Snacks.toggle.option('background', { off = 'light', on = 'dark', name = 'Dark Background' }):map 'ub' +-- -- Disabled: conflicts with th inlay hints toggle in init.lua LspAttach (line 679) +-- -- Snacks.toggle.inlay_hints():map 'uh' +-- Snacks.toggle.indent():map 'ug' +-- Snacks.toggle.dim():map 'uD' +-- end, +-- }) diff --git a/lua/custom/plugins/todo-comments.lua b/lua/custom/plugins/todo-comments.lua new file mode 100644 index 00000000000..e5f162674e4 --- /dev/null +++ b/lua/custom/plugins/todo-comments.lua @@ -0,0 +1,6 @@ +-- folke/todo-comments: highlight & search TODOs + +vim.pack.add { 'https://github.com/folke/todo-comments.nvim' } +require('todo-comments').setup { signs = false } + +vim.keymap.set('n', 'st', 'TodoTelescope', { desc = '[S]earch [T]odo' }) \ No newline at end of file diff --git a/lua/custom/plugins/undotree.lua b/lua/custom/plugins/undotree.lua new file mode 100644 index 00000000000..a20af2f54b1 --- /dev/null +++ b/lua/custom/plugins/undotree.lua @@ -0,0 +1,7 @@ +-- mbbill/undotree: visual undo history browser + +local function gh(repo) return 'https://github.com/' .. repo end + +vim.pack.add { gh 'mbbill/undotree' } + +vim.keymap.set('n', 'ut', 'UndotreeToggle', { desc = 'Undotree' }) \ No newline at end of file diff --git a/lua/custom/plugins/yazi.lua b/lua/custom/plugins/yazi.lua new file mode 100644 index 00000000000..1d8abd638a2 --- /dev/null +++ b/lua/custom/plugins/yazi.lua @@ -0,0 +1,17 @@ +-- yazi.nvim: file manager integration + +local function gh(repo) + return 'https://github.com/' .. repo +end + +vim.pack.add { gh 'mikavilpas/yazi.nvim' } + +-- Disable netrw early so it doesn't load before yazi's hijack +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 + +require('yazi').setup { + open_for_directories = true, +} + +vim.keymap.set('n', '\\', 'Yazi', { desc = 'Yazi file manager' }) diff --git a/lua/kickstart/plugins/autopairs.lua b/lua/kickstart/plugins/autopairs.lua index 1d2cdab098d..9eade735769 100644 --- a/lua/kickstart/plugins/autopairs.lua +++ b/lua/kickstart/plugins/autopairs.lua @@ -3,3 +3,18 @@ vim.pack.add { 'https://github.com/windwp/nvim-autopairs' } require('nvim-autopairs').setup {} + +-- Don't auto-insert } inside org #+BEGIN_SRC / #+END_SRC blocks +-- Avoids conflict with orgmode's indent/format machinery +local rule = require('nvim-autopairs').get_rule('{') +if rule then + rule:with_pair(function(opts) + if vim.bo[opts.bufnr].filetype ~= 'org' then return true end + local node = vim.treesitter.get_node() + while node do + if node:type() == 'block' then return false end + node = node:parent() + end + return true + end) +end diff --git a/lua/kickstart/plugins/lint.lua b/lua/kickstart/plugins/lint.lua index d63054452fd..9b960107e00 100644 --- a/lua/kickstart/plugins/lint.lua +++ b/lua/kickstart/plugins/lint.lua @@ -4,7 +4,7 @@ vim.pack.add { 'https://github.com/mfussenegger/nvim-lint' } local lint = require 'lint' lint.linters_by_ft = { - markdown = { 'markdownlint' }, -- Make sure to install `markdownlint` via mason / npm + markdown = { 'markdownlint-cli2' }, } -- To allow other plugins to add linters to require('lint').linters_by_ft, diff --git a/lua/kickstart/plugins/neo-tree.lua b/lua/kickstart/plugins/neo-tree.lua index 549629ae020..93366af1a86 100644 --- a/lua/kickstart/plugins/neo-tree.lua +++ b/lua/kickstart/plugins/neo-tree.lua @@ -7,10 +7,11 @@ vim.pack.add { 'https://github.com/MunifTanjim/nui.nvim', } -vim.keymap.set('n', '\\', 'Neotree reveal', { desc = 'NeoTree reveal', silent = true }) +-- vim.keymap.set('n', '\\', 'Neotree reveal', { desc = 'NeoTree reveal', silent = true }) require('neo-tree').setup { filesystem = { + hijack_netrw_behavior = 'disabled', window = { mappings = { ['\\'] = 'close_window', diff --git a/nvim-pack-lock.json b/nvim-pack-lock.json new file mode 100644 index 00000000000..dc0e6d71d19 --- /dev/null +++ b/nvim-pack-lock.json @@ -0,0 +1,180 @@ +{ + "plugins": { + "99": { + "rev": "4d229141546290746c82ac90f5afc2786865b5f3", + "src": "https://github.com/ThePrimeagen/99" + }, + "FTerm.nvim": { + "rev": "d1320892cc2ebab472935242d9d992a2c9570180", + "src": "https://github.com/numToStr/FTerm.nvim" + }, + "LuaSnip": { + "rev": "642b0c595e11608b4c18219e93b88d7637af27bc", + "src": "https://github.com/L3MON4D3/LuaSnip", + "version": "2.0.0 - 3.0.0" + }, + "blink.cmp": { + "rev": "78336bc89ee5365633bcf754d93df01678b5c08f", + "src": "https://github.com/saghen/blink.cmp", + "version": "1.0.0 - 2.0.0" + }, + "bufferline.nvim": { + "rev": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3", + "src": "https://github.com/akinsho/bufferline.nvim" + }, + "conform.nvim": { + "rev": "18aeab3d63d350dcf44d64c462cc489a3412af40", + "src": "https://github.com/stevearc/conform.nvim" + }, + "fidget.nvim": { + "rev": "82404b196e73a00b1727a91903beef5ddc319d22", + "src": "https://github.com/j-hui/fidget.nvim" + }, + "gitsigns.nvim": { + "rev": "dd3f588bacbeb041be6facf1742e42097f62165d", + "src": "https://github.com/lewis6991/gitsigns.nvim" + }, + "guess-indent.nvim": { + "rev": "84a4987ff36798c2fc1169cbaff67960aed9776f", + "src": "https://github.com/NMAC427/guess-indent.nvim" + }, + "harpoon": { + "rev": "1bc17e3e42ea3c46b33c0bbad6a880792692a1b3", + "src": "https://github.com/ThePrimeagen/harpoon" + }, + "indent-blankline.nvim": { + "rev": "d28a3f70721c79e3c5f6693057ae929f3d9c0a03", + "src": "https://github.com/lukas-reineke/indent-blankline.nvim" + }, + "kanagawa.nvim": { + "rev": "bb85e4bfc8d89b0e62c8fa53ccdd13d12e2f77b3", + "src": "https://github.com/rebelot/kanagawa.nvim" + }, + "marks.nvim": { + "rev": "f353e8c08c50f39e99a9ed474172df7eddd89b72", + "src": "https://github.com/chentoast/marks.nvim" + }, + "mason-lspconfig.nvim": { + "rev": "7b01e2974a47d489bb92f47a41e4c0088ea8f86e", + "src": "https://github.com/mason-org/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": "cbf8d285e1462dd24acf3507817be2bbcb035919", + "src": "https://github.com/mason-org/mason.nvim" + }, + "mini.nvim": { + "rev": "6791615e48801cbf5b2baefadcea77a7760de3f4", + "src": "https://github.com/nvim-mini/mini.nvim" + }, + "neo-tree.nvim": { + "rev": "83e7a2982fd12b9c3d35bc39dd5877cd91a02a61", + "src": "https://github.com/nvim-neo-tree/neo-tree.nvim", + "version": ">=0.0.0" + }, + "nui.nvim": { + "rev": "de740991c12411b663994b2860f1a4fd0937c130", + "src": "https://github.com/MunifTanjim/nui.nvim" + }, + "nvim-autopairs": { + "rev": "7b9923abad60b903ece7c52940e1321d39eccc79", + "src": "https://github.com/windwp/nvim-autopairs" + }, + "nvim-colorizer.lua": { + "rev": "5cfe7fffbd01e17b3c1e14af85d5febdef88bd8c", + "src": "https://github.com/catgoose/nvim-colorizer.lua" + }, + "nvim-dap": { + "rev": "531771530d4f82ad2d21e436e3cc052d68d7aebb", + "src": "https://github.com/mfussenegger/nvim-dap" + }, + "nvim-dap-go": { + "rev": "b4421153ead5d726603b02743ea40cf26a51ed5f", + "src": "https://github.com/leoluz/nvim-dap-go" + }, + "nvim-dap-ui": { + "rev": "1a66cabaa4a4da0be107d5eda6d57242f0fe7e49", + "src": "https://github.com/rcarriga/nvim-dap-ui" + }, + "nvim-highlight-colors": { + "rev": "e4c7af0211866162d999ce0bdd6a029302e19139", + "src": "https://github.com/brenoprata10/nvim-highlight-colors" + }, + "nvim-lint": { + "rev": "d48f3a76189d03b2239f6df1b2f7e3fa8353743b", + "src": "https://github.com/mfussenegger/nvim-lint" + }, + "nvim-lspconfig": { + "rev": "dfbada1a311c4bf3369f8d5421369c9b6e8b888f", + "src": "https://github.com/neovim/nvim-lspconfig" + }, + "nvim-nio": { + "rev": "21f5324bfac14e22ba26553caf69ec76ae8a7662", + "src": "https://github.com/nvim-neotest/nvim-nio" + }, + "nvim-treesitter": { + "rev": "4916d6592ede8c07973490d9322f187e07dfefac", + "src": "https://github.com/nvim-treesitter/nvim-treesitter", + "version": "'main'" + }, + "nvim-ts-autotag": { + "rev": "88c1453db4ba7dd24131086fe51fdf74e587d275", + "src": "https://github.com/windwp/nvim-ts-autotag" + }, + "nvim-web-devicons": { + "rev": "0d7d35fa946837b8738b17c18d1faa1ac351e7f9", + "src": "https://github.com/nvim-tree/nvim-web-devicons" + }, + "plenary.nvim": { + "rev": "74b06c6c75e4eeb3108ec01852001636d85a932b", + "src": "https://github.com/nvim-lua/plenary.nvim" + }, + "render-markdown.nvim": { + "rev": "640a3ec6d538bad17c328be373c7cad0293d9589", + "src": "https://github.com/MeanderingProgrammer/render-markdown.nvim" + }, + "smear-cursor.nvim": { + "rev": "9e9378d6ee34bb3782e0e8c63d9ec8ca618b479b", + "src": "https://github.com/sphamba/smear-cursor.nvim" + }, + "snacks.nvim": { + "rev": "0770753c88228f7f15449c6a5b242e3f7cd0d71c", + "src": "https://github.com/folke/snacks.nvim" + }, + "telescope-fzf-native.nvim": { + "rev": "b25b749b9db64d375d782094e2b9dce53ad53a40", + "src": "https://github.com/nvim-telescope/telescope-fzf-native.nvim" + }, + "telescope-ui-select.nvim": { + "rev": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2", + "src": "https://github.com/nvim-telescope/telescope-ui-select.nvim" + }, + "telescope.nvim": { + "rev": "7d324792b7943e4aa16ad007212e6acc6f9fe335", + "src": "https://github.com/nvim-telescope/telescope.nvim" + }, + "todo-comments.nvim": { + "rev": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668", + "src": "https://github.com/folke/todo-comments.nvim" + }, + "tokyonight.nvim": { + "rev": "cdc07ac78467a233fd62c493de29a17e0cf2b2b6", + "src": "https://github.com/folke/tokyonight.nvim" + }, + "undotree": { + "rev": "6fa6b57cda8459e1e4b2ca34df702f55242f4e4d", + "src": "https://github.com/mbbill/undotree" + }, + "which-key.nvim": { + "rev": "3aab2147e74890957785941f0c1ad87d0a44c15a", + "src": "https://github.com/folke/which-key.nvim" + } + } +}