From 7f9c380eaad06b40f764ef4cc8519e8cca259b89 Mon Sep 17 00:00:00 2001 From: rootiest Date: Mon, 11 May 2026 12:32:19 -0400 Subject: [PATCH 1/2] feat: add sidekick.nvim and haunt.nvim with AI and bookmark integration - Add sidekick.nvim: Next Edit Suggestions (NES) via Copilot LSP, integrated AI CLI terminal, and Snacks picker send action () - Add haunt.nvim: in-buffer annotation/bookmark manager with Snacks picker and 6 keymaps (ha/ht/hd/hn/hp/hl) - Wire blink.cmp to chain snippet_forward -> NES -> inline completion - Expose haunt_all and haunt_buffer as Sidekick prompt contexts - Suppress lua_ls "Loading workspace" progress bar via Noice route - Update README to document all new plugins, keymaps, and post-install steps --- README.md | 17 ++++++++++++--- lua/keymaps.lua | 22 +++++++++++++++++++ lua/plugins.lua | 51 ++++++++++++++++++++++++++++++++++++++++++++- nvim-pack-lock.json | 8 +++++++ 4 files changed, 94 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9135dd6..a360c6d 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ A modern, modular, and high-performance Neovim configuration built from scratch - **Phased Loading**: Async, non-blocking startup using a phased `VimEnter` queue for a snappy experience. - **Unified Registry**: Configuration is managed via a global `_G.Config` registry, ensuring cross-plugin consistency. - **High Performance**: Featuring **blink.cmp** (Rust-based completion) and optimized **Snacks.nvim** components. -- **AI-Powered**: Native integration with the **GitHub Copilot Language Server**. +- **AI-Powered**: Native integration with **GitHub Copilot** — inline completions via **blink-copilot** and multi-line refactoring via **Sidekick.nvim** Next Edit Suggestions (NES). - **User-Centric QoL**: Hybrid line numbers, autosave-on-edit, and seamless system clipboard integration. - **Resilient & Portable**: Intelligent terminal title management (Kitty + Fallback), automatic project root detection, and machine-local override support. - **Lean & Readable**: ~850 lines of Lua code (excluding comments and blanks). @@ -50,13 +50,15 @@ The configuration is strictly modular: - **Gx.nvim**: Smart URL/reference opener under cursor. - **Comment-box**: Decorative comment boxes and lines. - **Undotree**: Visual undo history browser. +- **Haunt.nvim**: In-buffer annotation and bookmark manager. Integrates with the Snacks picker for browsing bookmarks and exposes `haunt_all` / `haunt_buffer` prompt contexts to Sidekick AI sessions. - **Zen Mode**: Distraction-free editing. - **Qalc**: Inline calculator via `qalculate`. ### LSP & Completion - **Blink.cmp** + **blink.lib**: High-performance Rust-based completion. Auto-detects binary across install layouts; falls back gracefully if unavailable. Rebuilds automatically on `PackChanged`. +- **blink-copilot**: Surfaces GitHub Copilot inline suggestions inside the blink.cmp completion menu. +- **Sidekick.nvim**: AI assistant providing Next Edit Suggestions (NES) for multi-line refactoring via the Copilot LSP, plus an integrated AI CLI terminal (`aa`) with context-aware prompts. Snacks picker integration sends selections to the active AI session via ``. - **LSPConfig + Mason**: Managed LSP support for Lua, C/C++, Rust, Python, Fish, and Shell. -- **Copilot**: GitHub Copilot language server integration. - **Conform**: Formatter with format-on-save and range formatting. - **Inc-rename**: Incremental LSP rename with live preview. - **Lazydev**: Neovim Lua type definitions for `lua_ls`. @@ -108,7 +110,7 @@ nvim 1. **Build Blink**: Completion auto-rebuilds on `PackChanged`. If it still isn't working, run `cargo build --release` inside `~/.local/share/nvim/site/pack/core/opt/blink.cmp`. 2. **LSP Servers**: Run `:Mason` to monitor the installation of Language Servers. -3. **Copilot**: Run `:LspCopilotSignIn` to authenticate. +3. **Copilot**: Run `:LspCopilotSignIn` to authenticate, then `:checkhealth sidekick` to verify the Sidekick NES integration is working. ### Machine-Local Overrides @@ -131,6 +133,15 @@ Place machine-specific or secret configuration in `~/.config/.user-dots/nvim/loc | `s` / `S` | Leap Motion (Normal/Window) | | `ys` / `ds` / `cs` | Surround (Add/Delete/Change) | | `gx` / `gX` | Open URL under cursor (Gx.nvim) | +| `` | Advance snippet → apply NES suggestion → fallback | +| `aa` | Toggle Sidekick AI CLI terminal | +| `as` | Select AI tool (Sidekick) | +| `` *(picker)* | Send picker selection to active AI CLI session | +| `ha` | Annotate current position (Haunt) | +| `ht` | Toggle annotation visibility (Haunt) | +| `hd` | Delete bookmark (Haunt) | +| `hn` / `hp` | Next / Previous bookmark (Haunt) | +| `hl` | Browse all bookmarks in picker (Haunt) | | `cbb` | Create Centered Comment Box | | `cbl` | Create Centered Comment Line | | `cbd` | Delete Comment Box/Line | diff --git a/lua/keymaps.lua b/lua/keymaps.lua index 0c58636..8b64d85 100644 --- a/lua/keymaps.lua +++ b/lua/keymaps.lua @@ -331,3 +331,25 @@ end, { desc = "Restore Last Session" }) vim.keymap.set("n", "qd", function() require("persistence").stop() end, { desc = "Don't Save Current Session" }) + +---------------------------------------------------------- + +-- Haunt Keymaps +vim.keymap.set("n", "ha", function() + require("haunt.api").annotate() +end, { desc = "Annotate" }) +vim.keymap.set("n", "ht", function() + require("haunt.api").toggle_annotation() +end, { desc = "Toggle Annotation" }) +vim.keymap.set("n", "hd", function() + require("haunt.api").delete() +end, { desc = "Delete Bookmark" }) +vim.keymap.set("n", "hn", function() + require("haunt.api").next() +end, { desc = "Next Bookmark" }) +vim.keymap.set("n", "hp", function() + require("haunt.api").prev() +end, { desc = "Previous Bookmark" }) +vim.keymap.set("n", "hl", function() + require("haunt.picker").show() +end, { desc = "Show Bookmark Picker" }) diff --git a/lua/plugins.lua b/lua/plugins.lua index 272ffec..868e168 100644 --- a/lua/plugins.lua +++ b/lua/plugins.lua @@ -56,6 +56,7 @@ Config.plugins.snacks = { keys = { [""] = { "flash", mode = { "n", "i" } }, ["s"] = { "flash" }, + [""] = { "sidekick_send", mode = { "n", "i" } }, }, }, }, @@ -78,6 +79,9 @@ Config.plugins.snacks = { end, }) end, + sidekick_send = function(...) + return require("sidekick.cli.picker.snacks").send(...) + end, }, }, notifier = { enabled = true }, @@ -281,7 +285,19 @@ lazyload.on_vim_enter(function() -- 3. Blink.cmp setup require("blink.cmp").setup({ - keymap = { preset = "default" }, + keymap = { + preset = "default", + [""] = { + "snippet_forward", + function() + return require("sidekick").nes_jump_or_apply() + end, + function() + return vim.lsp.inline_completion.get() + end, + "fallback", + }, + }, appearance = { use_nvim_cmp_as_default = true, nerd_font_variant = "mono", @@ -445,10 +461,43 @@ lazyload.on_vim_enter(function() inc_rename = true, -- enables an input dialog for inc-rename.nvim lsp_doc_border = false, -- add a border to hover docs and signature help }, + routes = { + { + filter = { + event = "lsp", + kind = "progress", + find = "Loading workspace", + }, + opts = { skip = true }, + }, + }, }) -- Kitty Scrollback vim.pack.add({ { src = "https://github.com/mikesmithgh/kitty-scrollback.nvim", name = "kitty-scrollback" } }) Config.plugins.kitty_scrollback = {} require("kitty-scrollback").setup(Config.plugins.kitty_scrollback) + + -- Haunt.nvim + vim.pack.add({ { src = "https://github.com/TheNoeTrevino/haunt.nvim", name = "haunt" } }) + Config.plugins.haunt = { + picker = "snacks", + } + require("haunt").setup(Config.plugins.haunt) + + -- Sidekick.nvim + vim.pack.add({ { src = "https://github.com/folke/sidekick.nvim", name = "sidekick" } }) + Config.plugins.sidekick = { + cli = { + prompts = { + haunt_all = function() + return require("haunt.sidekick").get_locations() + end, + haunt_buffer = function() + return require("haunt.sidekick").get_locations({ current_buffer = true }) + end, + }, + }, + } + require("sidekick").setup(Config.plugins.sidekick) end) diff --git a/nvim-pack-lock.json b/nvim-pack-lock.json index 09c6a81..daa254a 100644 --- a/nvim-pack-lock.json +++ b/nvim-pack-lock.json @@ -56,6 +56,10 @@ "rev": "ba9c408fc0130fc4548760c3933a81b58fc50de8", "src": "https://github.com/chrishrb/gx.nvim" }, + "haunt": { + "rev": "815141d7367c9d895e902db27e2d25d4652ad0fc", + "src": "https://github.com/TheNoeTrevino/haunt.nvim" + }, "inc-rename": { "rev": "0074b551a17338ccdcd299bd86687cc651bcb33d", "src": "https://github.com/smjonas/inc-rename.nvim" @@ -128,6 +132,10 @@ "rev": "33198ba0533d6a514f9a48cb472e40407c2ea9f6", "src": "https://github.com/Apeiros-46B/qalc.nvim" }, + "sidekick": { + "rev": "208e1c5b8170c01fd1d07df0139322a76479b235", + "src": "https://github.com/folke/sidekick.nvim" + }, "snacks": { "rev": "ad9ede6a9cddf16cedbd31b8932d6dcdee9b716e", "src": "https://github.com/folke/snacks.nvim" -- 2.52.0 From 58fc3e53acee50bb1b6749d9bc96877e95a3d924 Mon Sep 17 00:00:00 2001 From: rootiest Date: Mon, 11 May 2026 12:38:19 -0400 Subject: [PATCH 2/2] feat(noice): suppress Diagnosing and semantic tokens LSP progress notifications --- lua/plugins.lua | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lua/plugins.lua b/lua/plugins.lua index 868e168..d9f65d2 100644 --- a/lua/plugins.lua +++ b/lua/plugins.lua @@ -463,11 +463,15 @@ lazyload.on_vim_enter(function() }, routes = { { - filter = { - event = "lsp", - kind = "progress", - find = "Loading workspace", - }, + filter = { event = "lsp", kind = "progress", find = "Loading workspace" }, + opts = { skip = true }, + }, + { + filter = { event = "lsp", kind = "progress", find = "^Diagnosing" }, + opts = { skip = true }, + }, + { + filter = { event = "lsp", kind = "progress", find = "semantic tokens" }, opts = { skip = true }, }, }, -- 2.52.0