From b5e8850866aa2b2b3ed463f47223092b71dfe8ab Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 10:59:16 +0100 Subject: [PATCH 01/19] fix(nvim): flatten gopls double-nested settings settings.gopls.settings.gopls caused gopls to never see staticcheck, analyses, or experimentalPostfixCompletions. init_options was also misplaced inside settings.gopls instead of at root level where the LSP client expects it. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/lsp/gopls.lua | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/dot_config/nvim/lsp/gopls.lua b/dot_config/nvim/lsp/gopls.lua index 91aac52..feafdfe 100644 --- a/dot_config/nvim/lsp/gopls.lua +++ b/dot_config/nvim/lsp/gopls.lua @@ -3,21 +3,17 @@ return { cmd = { "gopls" }, filetypes = { "go", "gomod", "gowork", "gotmpl", "gosum" }, root_markers = { "go.mod", "go.work", ".git" }, + init_options = { + usePlaceholders = true, + }, settings = { gopls = { - settings = { - gopls = { - experimentalPostfixCompletions = true, - analyses = { - unusedparams = true, - shadow = true, - }, - staticcheck = true, - }, - }, - init_options = { - usePlaceholders = true, + experimentalPostfixCompletions = true, + analyses = { + unusedparams = true, + shadow = true, }, + staticcheck = true, }, }, } From 59a43e9d54c727863c6614dda3794fda9e482b89 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 10:59:40 +0100 Subject: [PATCH 02/19] fix(nvim): wire up blink-cmp LSP capabilities The capabilities table (merging blink.cmp + folding range support) was built but never applied. Since mason-lspconfig uses automatic_enable (servers start via vim.lsp.enable()), vim.lsp.config("*") is the correct way to inject capabilities into all servers. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/after/plugin/blink-cmp.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dot_config/nvim/after/plugin/blink-cmp.lua b/dot_config/nvim/after/plugin/blink-cmp.lua index 3cc01d3..d993d26 100644 --- a/dot_config/nvim/after/plugin/blink-cmp.lua +++ b/dot_config/nvim/after/plugin/blink-cmp.lua @@ -16,3 +16,5 @@ capabilities = vim.tbl_deep_extend("force", capabilities, { }, }, }) + +vim.lsp.config("*", { capabilities = capabilities }) From 919c63ec583f6de960fb532b3d96b2f07f7cca8e Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:00:07 +0100 Subject: [PATCH 03/19] fix(nvim): scope FileType options to buffer instead of global vim.opt sets options globally, so opening a Go file would set expandtab=false for ALL buffers. Use vim.bo[event.buf] to make tab/indent settings buffer-local. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/filetype.lua | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/dot_config/nvim/filetype.lua b/dot_config/nvim/filetype.lua index 6e90a02..ebd38f1 100644 --- a/dot_config/nvim/filetype.lua +++ b/dot_config/nvim/filetype.lua @@ -28,27 +28,26 @@ vim.filetype.add({ local augroups = require("user.augroups") local autocmd = vim.api.nvim_create_autocmd -local set = vim.opt -- https://neovim.io/doc/user/api.html#nvim_create_autocmd() autocmd({ "FileType" }, { group = augroups.filetype, pattern = { "terraform", "hcl", "json", "yaml" }, - callback = function() - set.tabstop = 2 - set.shiftwidth = 2 - set.softtabstop = 2 - set.expandtab = true + callback = function(event) + vim.bo[event.buf].tabstop = 2 + vim.bo[event.buf].shiftwidth = 2 + vim.bo[event.buf].softtabstop = 2 + vim.bo[event.buf].expandtab = true end, }) autocmd({ "FileType" }, { group = augroups.filetype, pattern = { "go", "make" }, - callback = function() - set.expandtab = false - set.tabstop = 4 - set.shiftwidth = 4 - set.softtabstop = 4 + callback = function(event) + vim.bo[event.buf].expandtab = false + vim.bo[event.buf].tabstop = 4 + vim.bo[event.buf].shiftwidth = 4 + vim.bo[event.buf].softtabstop = 4 end, }) From 2e834f3688f021c6c2575c39a9f672f14b0471d2 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:00:32 +0100 Subject: [PATCH 04/19] fix(nvim): extract LspDetach autocmd from LspAttach callback Registering LspDetach inside LspAttach creates a new handler every time a client attaches, leaking autocmds. Move it to top level and only clear buffer autocmds when no LSP clients remain on that buffer. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/lua/user/lsp.lua | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/dot_config/nvim/lua/user/lsp.lua b/dot_config/nvim/lua/user/lsp.lua index 7caf0c2..adc0f9e 100644 --- a/dot_config/nvim/lua/user/lsp.lua +++ b/dot_config/nvim/lua/user/lsp.lua @@ -57,15 +57,18 @@ vim.api.nvim_create_autocmd("LspAttach", { group = augroups.lsp, callback = vim.lsp.buf.clear_references, }) + end + end, +}) - -- When LSP detaches: Clears the highlighting - vim.api.nvim_create_autocmd("LspDetach", { - group = augroups.lsp, - callback = function(detach) - vim.lsp.buf.clear_references() - vim.api.nvim_clear_autocmds({ group = augroups.lsp, buffer = detach.buf }) - end, - }) +-- When LSP detaches: Clears the highlighting +vim.api.nvim_create_autocmd("LspDetach", { + group = augroups.lsp, + callback = function(detach) + vim.lsp.buf.clear_references() + local remaining = vim.lsp.get_clients({ bufnr = detach.buf }) + if #remaining == 0 then + vim.api.nvim_clear_autocmds({ group = augroups.lsp, buffer = detach.buf }) end end, }) From 8f4aeb65ffd7ecac1d52822a2154a2bf5de729ed Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:00:52 +0100 Subject: [PATCH 05/19] fix(nvim): correct grepformat pattern for ripgrep Missing % before f in the format string meant :grep results couldn't be parsed into the quickfix list. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot_config/nvim/init.lua b/dot_config/nvim/init.lua index abe1602..92bf80c 100644 --- a/dot_config/nvim/init.lua +++ b/dot_config/nvim/init.lua @@ -39,7 +39,7 @@ else -- Use ripgrep when available if vim.fn.executable("rg") == 1 then vim.o.grepprg = "rg --no-heading --vimgrep" - vim.o.grepformat = "f:%l:%c:%m" + vim.o.grepformat = "%f:%l:%c:%m" end end From 7e7c805eb9523dadd9b68bef037de8b733898f6d Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:01:15 +0100 Subject: [PATCH 06/19] feat(nvim): add missing treesitter parsers bash, json, terraform, toml, and yaml all have LSP servers configured via mason-lspconfig but were missing treesitter parsers for syntax highlighting. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/after/plugin/treesitter.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dot_config/nvim/after/plugin/treesitter.lua b/dot_config/nvim/after/plugin/treesitter.lua index e6771a2..378e93d 100644 --- a/dot_config/nvim/after/plugin/treesitter.lua +++ b/dot_config/nvim/after/plugin/treesitter.lua @@ -5,16 +5,21 @@ end configs.setup({ ensure_installed = { + "bash", "c", "cmake", "dockerfile", "dot", "go", "hcl", + "json", "lua", "make", "python", "rust", + "terraform", + "toml", + "yaml", }, sync_install = false, autopairs = { From ec6e8bf02809511643839bb1b8a08b8f77a16227 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:01:35 +0100 Subject: [PATCH 07/19] feat(nvim): add format-on-save for Go files gopls supports textDocument/formatting -- add *.go to the BufWritePre pattern so Go files are formatted on save like Terraform files already are. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/lua/user/lsp.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dot_config/nvim/lua/user/lsp.lua b/dot_config/nvim/lua/user/lsp.lua index adc0f9e..608eb12 100644 --- a/dot_config/nvim/lua/user/lsp.lua +++ b/dot_config/nvim/lua/user/lsp.lua @@ -31,8 +31,7 @@ local augroups = require("user.augroups") -- Format on save vim.api.nvim_create_autocmd("BufWritePre", { group = augroups.lsp, - -- todo: use file types? pattern = { "terraform", "go" }, - pattern = { "*.tf", "*.tfvars" }, + pattern = { "*.tf", "*.tfvars", "*.go" }, callback = vim.lsp.buf.format, }) From e74429c0a0647fdc5e9b87d9aac64e2edd184f89 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:01:55 +0100 Subject: [PATCH 08/19] chore(nvim): remove dead LazyVim reference from lazydev config This config doesn't use LazyVim -- the entry was copied from a LazyVim example and has no effect. Also nest library entries under the correct opts.library key. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/lua/plugins/code.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/dot_config/nvim/lua/plugins/code.lua b/dot_config/nvim/lua/plugins/code.lua index 51536a6..c78cfef 100644 --- a/dot_config/nvim/lua/plugins/code.lua +++ b/dot_config/nvim/lua/plugins/code.lua @@ -8,11 +8,10 @@ return { cond = profile.active("default"), ft = "lua", -- only load on lua files opts = { - -- It can also be a table with trigger words / mods - -- Only load luvit types when the `vim.uv` word is found - { path = "${3rd}/luv/library", words = { "vim%.uv" } }, - -- Only load the lazyvim library when the `LazyVim` global is found - { path = "LazyVim", words = { "LazyVim" } }, + library = { + -- Only load luvit types when the `vim.uv` word is found + { path = "${3rd}/luv/library", words = { "vim%.uv" } }, + }, }, }, From 3254ef009415c816af93ca1594b89e5f47892594 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:02:34 +0100 Subject: [PATCH 09/19] feat(nvim): add LSP keymaps for common operations Only format was mapped. Add gd (definition), gD (declaration), ca (code action), rn (rename), and D (type definition) in the LspAttach callback so they're available whenever an LSP client is active. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/lua/user/lsp.lua | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/dot_config/nvim/lua/user/lsp.lua b/dot_config/nvim/lua/user/lsp.lua index 608eb12..7e3fafa 100644 --- a/dot_config/nvim/lua/user/lsp.lua +++ b/dot_config/nvim/lua/user/lsp.lua @@ -40,7 +40,21 @@ local utils = require("user.utils") vim.api.nvim_create_autocmd("LspAttach", { group = augroups.lsp, callback = function(attach) - utils.nmap("fb", vim.lsp.buf.format, { buffer = true, desc = "[F]ormat [B]uffer" }) + local buf_opts = { buffer = attach.buf } + utils.nmap("fb", vim.lsp.buf.format, vim.tbl_extend("force", buf_opts, { desc = "[F]ormat [B]uffer" })) + utils.nmap("gd", vim.lsp.buf.definition, vim.tbl_extend("force", buf_opts, { desc = "[G]oto [D]efinition" })) + utils.nmap("gD", vim.lsp.buf.declaration, vim.tbl_extend("force", buf_opts, { desc = "[G]oto [D]eclaration" })) + utils.nmap( + "ca", + vim.lsp.buf.code_action, + vim.tbl_extend("force", buf_opts, { desc = "[C]ode [A]ction" }) + ) + utils.nmap("rn", vim.lsp.buf.rename, vim.tbl_extend("force", buf_opts, { desc = "[R]e[n]ame" })) + utils.nmap( + "D", + vim.lsp.buf.type_definition, + vim.tbl_extend("force", buf_opts, { desc = "Type [D]efinition" }) + ) local client = assert(vim.lsp.get_client_by_id(attach.data.client_id)) if client:supports_method(vim.lsp.protocol.Methods.textDocument_documentHighlight) then From 22c9b747c55cc34a7b27ee66701ff77d03576ba6 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:02:58 +0100 Subject: [PATCH 10/19] refactor(nvim): replace synchronous chezmoi apply with async job The synchronous shell command blocks Neovim's UI until chezmoi finishes and swallows errors via silent!. Use vim.fn.jobstart to run it asynchronously and surface failures via vim.notify. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/init.lua | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/dot_config/nvim/init.lua b/dot_config/nvim/init.lua index 92bf80c..7e5f85a 100644 --- a/dot_config/nvim/init.lua +++ b/dot_config/nvim/init.lua @@ -25,7 +25,18 @@ else vim.api.nvim_create_autocmd("BufWritePost", { group = augroups.chezmoi, pattern = vim.fn.expand("~") .. "/.local/share/chezmoi/*", - command = "silent! !chezmoi apply --no-tty --force --source-path '%'", + callback = function(event) + local source_path = vim.api.nvim_buf_get_name(event.buf) + vim.fn.jobstart({ "chezmoi", "apply", "--no-tty", "--force", "--source-path", source_path }, { + on_exit = function(_, code) + if code ~= 0 then + vim.schedule(function() + vim.notify("chezmoi apply failed (exit " .. code .. ")", vim.log.levels.ERROR) + end) + end + end, + }) + end, }) -- Files to ignore From 534a75e24e153c1f57d7388c001ee6f8310bb640 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Thu, 19 Feb 2026 11:23:53 +0100 Subject: [PATCH 11/19] fix(nvim): guard python3_host_prog against missing env var os.getenv("XDG_DATA_HOME") returns nil when unset, causing a string concatenation error that crashes init.lua. Fall back to the XDG default and check the binary exists before setting the provider path. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/init.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dot_config/nvim/init.lua b/dot_config/nvim/init.lua index 7e5f85a..1802d34 100644 --- a/dot_config/nvim/init.lua +++ b/dot_config/nvim/init.lua @@ -39,6 +39,13 @@ else end, }) + -- Python + local xdg_data = os.getenv("XDG_DATA_HOME") or (os.getenv("HOME") .. "/.local/share") + local python3 = xdg_data .. "/pyenv/versions/neovim/bin/python3" + if vim.uv.fs_stat(python3) then + vim.g.python3_host_prog = python3 + end + -- Files to ignore -- Python vim.opt.wildignore:append("*.pyc,*.pyo,*/__pycache__/*") From 08d5766e0cc04da8b8a55e7be11c19852bdb0250 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:03:40 +0100 Subject: [PATCH 12/19] chore(nvim): remove non-functional Caps_Lock mapping Terminals don't send as a keycode so this mapping never triggers. The jk/kj insert-mode escape mappings already serve this purpose. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/lua/user/keymaps.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/dot_config/nvim/lua/user/keymaps.lua b/dot_config/nvim/lua/user/keymaps.lua index dfc8eba..badfde4 100644 --- a/dot_config/nvim/lua/user/keymaps.lua +++ b/dot_config/nvim/lua/user/keymaps.lua @@ -30,7 +30,6 @@ utils.nmap("s", "w") -- Navigation hotkeys utils.nmap("", "q") utils.nmap("", "q!") -utils.inoremap("", "") utils.inoremap("jk", "") utils.inoremap("kj", "") From ac01a9f4e2549da89adefb1e27d6268653a8e867 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:04:05 +0100 Subject: [PATCH 13/19] refactor(nvim): replace vim-smoothie with native smoothscroll Neovim's built-in smoothscroll option handles smooth scrolling for wrapped lines with zero overhead and no external dependency. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/lua/plugins/editor.lua | 1 - dot_config/nvim/lua/user/options.lua | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/dot_config/nvim/lua/plugins/editor.lua b/dot_config/nvim/lua/plugins/editor.lua index 2645829..b4ff34c 100644 --- a/dot_config/nvim/lua/plugins/editor.lua +++ b/dot_config/nvim/lua/plugins/editor.lua @@ -1,6 +1,5 @@ ---@type LazySpec return { - "psliwka/vim-smoothie", { "lewis6991/gitsigns.nvim", dependencies = { "nvim-lua/plenary.nvim" }, diff --git a/dot_config/nvim/lua/user/options.lua b/dot_config/nvim/lua/user/options.lua index bb10c84..3a57284 100644 --- a/dot_config/nvim/lua/user/options.lua +++ b/dot_config/nvim/lua/user/options.lua @@ -14,6 +14,7 @@ local options = { autoindent = true, -- Navigation + smoothscroll = true, title = true, number = true, relativenumber = true, From 20308accd395de71c513aa6659ec5bb197fde5ae Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:04:26 +0100 Subject: [PATCH 14/19] fix(nvim): use HTTPS URL for lazy.nvim bootstrap The gh: shorthand requires git URL rewriting config which may not be present on a fresh machine. Use the standard HTTPS URL so bootstrap works out of the box. Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/lua/user/plugin_manager.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot_config/nvim/lua/user/plugin_manager.lua b/dot_config/nvim/lua/user/plugin_manager.lua index ffb0891..bec44b1 100644 --- a/dot_config/nvim/lua/user/plugin_manager.lua +++ b/dot_config/nvim/lua/user/plugin_manager.lua @@ -5,7 +5,7 @@ if not vim.uv.fs_stat(lazypath) then "git", "clone", "--filter=blob:none", - "gh:folke/lazy.nvim.git", + "https://github.com/folke/lazy.nvim.git", "--branch=stable", -- latest stable release lazypath, }) From a97d468aa2743db2b7b29a679e6270d0388bb884 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Mon, 9 Feb 2026 11:09:16 +0100 Subject: [PATCH 15/19] docs(nvim): add comments for recent config changes Co-Authored-By: Claude Opus 4.6 --- dot_config/nvim/filetype.lua | 1 + dot_config/nvim/init.lua | 4 +++- dot_config/nvim/lua/user/lsp.lua | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/dot_config/nvim/filetype.lua b/dot_config/nvim/filetype.lua index ebd38f1..68227e2 100644 --- a/dot_config/nvim/filetype.lua +++ b/dot_config/nvim/filetype.lua @@ -28,6 +28,7 @@ vim.filetype.add({ local augroups = require("user.augroups") local autocmd = vim.api.nvim_create_autocmd +-- Use vim.bo (buffer-local) not vim.opt (global) to avoid leaking settings across buffers -- https://neovim.io/doc/user/api.html#nvim_create_autocmd() autocmd({ "FileType" }, { group = augroups.filetype, diff --git a/dot_config/nvim/init.lua b/dot_config/nvim/init.lua index 1802d34..95fe8f7 100644 --- a/dot_config/nvim/init.lua +++ b/dot_config/nvim/init.lua @@ -20,7 +20,8 @@ else -- automatically hide and show the command line vim.o.ch = 0 - -- Run `chezmoi apply` whenever its configuration is modified. + -- Run `chezmoi apply` asynchronously whenever its source files are saved. + -- Uses jobstart to avoid blocking the UI; errors are reported via vim.notify. local augroups = require("user.augroups") vim.api.nvim_create_autocmd("BufWritePost", { group = augroups.chezmoi, @@ -57,6 +58,7 @@ else -- Use ripgrep when available if vim.fn.executable("rg") == 1 then vim.o.grepprg = "rg --no-heading --vimgrep" + -- https://neovim.io/doc/user/quickfix.html#errorformat vim.o.grepformat = "%f:%l:%c:%m" end end diff --git a/dot_config/nvim/lua/user/lsp.lua b/dot_config/nvim/lua/user/lsp.lua index 7e3fafa..e279b8b 100644 --- a/dot_config/nvim/lua/user/lsp.lua +++ b/dot_config/nvim/lua/user/lsp.lua @@ -40,6 +40,7 @@ local utils = require("user.utils") vim.api.nvim_create_autocmd("LspAttach", { group = augroups.lsp, callback = function(attach) + -- Buffer-scoped keymaps: only active while an LSP client is attached local buf_opts = { buffer = attach.buf } utils.nmap("fb", vim.lsp.buf.format, vim.tbl_extend("force", buf_opts, { desc = "[F]ormat [B]uffer" })) utils.nmap("gd", vim.lsp.buf.definition, vim.tbl_extend("force", buf_opts, { desc = "[G]oto [D]efinition" })) @@ -74,7 +75,8 @@ vim.api.nvim_create_autocmd("LspAttach", { end, }) --- When LSP detaches: Clears the highlighting +-- Top-level (not inside LspAttach) to avoid registering a new handler on every attach. +-- Only clears buffer autocmds when no LSP clients remain. vim.api.nvim_create_autocmd("LspDetach", { group = augroups.lsp, callback = function(detach) From 43cf7336df5b6265b7a1b62ce7157d37a30898d2 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Thu, 19 Feb 2026 11:49:16 +0100 Subject: [PATCH 16/19] fix(zsh): use uv tool install for argcomplete and avoid modifying shell files - Replace `uv pip install` with `uv tool install` which creates an isolated venv and symlinks CLI entry points to ~/.local/bin - Remove `activate-global-python-argcomplete` call that wrote to unmanaged ~/.config/zsh/.zshenv, conflicting with chezmoi - Add argcomplete fpath entry directly to chezmoi-managed .zshrc.tmpl - Skip uv installer if uv is already on PATH (UV_NO_MODIFY_PATH=1) - Use (N/) glob qualifier on optional fpath entries (rustup, docker) Co-Authored-By: Claude --- .../run_once_after_10_install_python_toolchains.sh | 7 ++++--- dot_config/zsh/dot_zshrc.tmpl | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.chezmoiscripts/run_once_after_10_install_python_toolchains.sh b/.chezmoiscripts/run_once_after_10_install_python_toolchains.sh index 0e6ac77..ae1dc21 100644 --- a/.chezmoiscripts/run_once_after_10_install_python_toolchains.sh +++ b/.chezmoiscripts/run_once_after_10_install_python_toolchains.sh @@ -1,7 +1,9 @@ #!/bin/bash echo "🐍 Installing Python" -curl -LsSf https://astral.sh/uv/install.sh | sh +if ! command -v uv &>/dev/null; then + UV_NO_MODIFY_PATH=1 curl -LsSf https://astral.sh/uv/install.sh | sh +fi # install the latest Python version uv python install @@ -9,5 +11,4 @@ uv python install uv generate-shell-completion zsh >"${XDG_DATA_HOME}/zsh/completions/_uv" uvx --generate-shell-completion zsh >"$XDG_DATA_HOME/zsh/completions/_uvx" -uv pip install argcomplete -activate-global-python-argcomplete +uv tool install argcomplete diff --git a/dot_config/zsh/dot_zshrc.tmpl b/dot_config/zsh/dot_zshrc.tmpl index 412e7d2..05cab00 100644 --- a/dot_config/zsh/dot_zshrc.tmpl +++ b/dot_config/zsh/dot_zshrc.tmpl @@ -86,9 +86,10 @@ autoload -Uz tldr-fzf {{- if eq .chezmoi.os "darwin" }} fpath+="$(brew --prefix)/share/zsh/site-functions" {{ end }} -fpath+="$HOME/.rustup/toolchains/stable-x86_64-apple-darwin/share/zsh/site-functions" -fpath+="$HOME/.docker/completions" +fpath+=($HOME/.rustup/toolchains/stable-x86_64-apple-darwin/share/zsh/site-functions(N/)) +fpath+=($HOME/.docker/completions(N/)) fpath+="$XDG_DATA_HOME/zsh/completions" +fpath+=($XDG_DATA_HOME/uv/tools/argcomplete/lib/python*/site-packages/argcomplete/bash_completion.d(N)) autoload -Uz compinit && compinit autoload -Uz select-word-style && select-word-style bash From c0b1fea9d2869a510c75dbf7b7d5b4d721045aea Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Sat, 21 Feb 2026 11:52:38 +0100 Subject: [PATCH 17/19] refactor(nvim): slim down editor profile for Claude Code usage Gate gitsigns, telescope-media-files, and nvim-web-devicons to default profile only. Remove blink.cmp from nvim-lspconfig dependencies since after/plugin/blink-cmp.lua already handles the integration via pcall. This keeps the editor profile lightweight for NVIM_PROFILE=editor. Co-Authored-By: Claude --- dot_config/nvim/lua/plugins/code.lua | 5 +---- dot_config/nvim/lua/plugins/editor.lua | 3 +++ dot_config/nvim/lua/plugins/linux/telescope-media-files.lua | 3 +++ dot_config/nvim/lua/plugins/ui.lua | 5 +---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dot_config/nvim/lua/plugins/code.lua b/dot_config/nvim/lua/plugins/code.lua index c78cfef..c7b051d 100644 --- a/dot_config/nvim/lua/plugins/code.lua +++ b/dot_config/nvim/lua/plugins/code.lua @@ -54,10 +54,7 @@ return { { "mm", "Mason", desc = "Packages" }, }, }, - { - "neovim/nvim-lspconfig", - dependencies = { "saghen/blink.cmp" }, - }, + { "neovim/nvim-lspconfig" }, }, }, diff --git a/dot_config/nvim/lua/plugins/editor.lua b/dot_config/nvim/lua/plugins/editor.lua index b4ff34c..fffc99e 100644 --- a/dot_config/nvim/lua/plugins/editor.lua +++ b/dot_config/nvim/lua/plugins/editor.lua @@ -1,7 +1,10 @@ +local profile = require("user.profile") + ---@type LazySpec return { { "lewis6991/gitsigns.nvim", + cond = profile.active("default"), dependencies = { "nvim-lua/plenary.nvim" }, }, -- Flash enhances the built-in search functionality by showing labels diff --git a/dot_config/nvim/lua/plugins/linux/telescope-media-files.lua b/dot_config/nvim/lua/plugins/linux/telescope-media-files.lua index 19159da..6e6f7df 100644 --- a/dot_config/nvim/lua/plugins/linux/telescope-media-files.lua +++ b/dot_config/nvim/lua/plugins/linux/telescope-media-files.lua @@ -1,7 +1,10 @@ +local profile = require("user.profile") + ---@type LazySpec return { { "nvim-telescope/telescope-media-files.nvim", + cond = profile.active("default"), dependencies = { "nvim-telescope/telescope.nvim", "nvim-lua/popup.nvim", diff --git a/dot_config/nvim/lua/plugins/ui.lua b/dot_config/nvim/lua/plugins/ui.lua index 4dd1ffc..8e0c1af 100644 --- a/dot_config/nvim/lua/plugins/ui.lua +++ b/dot_config/nvim/lua/plugins/ui.lua @@ -37,9 +37,6 @@ return { end, dependencies = { "kkharji/sqlite.lua" }, }, - { - "nvim-lualine/lualine.nvim", - dependencies = { "kyazdani42/nvim-web-devicons" }, - }, + { "nvim-lualine/lualine.nvim" }, { "akinsho/toggleterm.nvim", cond = profile.active("default") }, } From ed5ec0f6cb7857b40bf14b22633f23659459e12d Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Sat, 21 Feb 2026 13:32:45 +0100 Subject: [PATCH 18/19] feat(claude): add bazel and opentelemetry to WebFetch allow list Also document dot_claude/ in the CLAUDE.md repository structure. Co-Authored-By: Claude --- CLAUDE.md | 1 + dot_claude/settings.json | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 6d9d1c3..802110e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -25,6 +25,7 @@ dot_kube/ → Kubernetes config dot_cargo/ → Cargo (Rust) config dot_cache/ → cached files dot_local/ → local binaries/share +dot_claude/ → ~/.claude/ (Claude Code settings, skills, permissions) Library/ → macOS Library preferences gui/ → GUI app configs (not managed by chezmoi) ``` diff --git a/dot_claude/settings.json b/dot_claude/settings.json index 0f6b37c..a20bef7 100644 --- a/dot_claude/settings.json +++ b/dot_claude/settings.json @@ -104,6 +104,7 @@ "WebFetch(domain:*.githubusercontent.com)", "WebFetch(domain:*.readthedocs.io)", "WebFetch(domain:about.gitlab.com)", + "WebFetch(domain:bazel.build)", "WebFetch(domain:developer.hashicorp.com)", "WebFetch(domain:docs.ansible.com)", "WebFetch(domain:docs.anthropic.com)", @@ -123,6 +124,7 @@ "WebFetch(domain:kubernetes.io)", "WebFetch(domain:man7.org)", "WebFetch(domain:nginx.org)", + "WebFetch(domain:opentelemetry.io)", "WebFetch(domain:pkg.go.dev)", "WebFetch(domain:platform.openai.com)", "WebFetch(domain:prometheus.io)", From bb961ee477bff873c688590b46cb150fbf5f5339 Mon Sep 17 00:00:00 2001 From: "Guilhem C." Date: Sat, 21 Feb 2026 13:35:47 +0100 Subject: [PATCH 19/19] feat(claude): expand WebFetch allow list and sort all sections Add documentation domains: alacritty, astral (uv/ruff/ty), GNU (bash), JetBrains, Kata Containers, kernel.org, Lua, mypy, Neovim, Python, Raycast, Rust (doc.rust-lang.org, docs.rs), and Zed. Also sort Bash commands and WebFetch entries alphabetically. Co-Authored-By: Claude --- dot_claude/settings.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/dot_claude/settings.json b/dot_claude/settings.json index a20bef7..d6a1cc5 100644 --- a/dot_claude/settings.json +++ b/dot_claude/settings.json @@ -14,11 +14,11 @@ "Bash(find:*)", "Bash(grep:*)", "Bash(head:*)", - "Bash(sort:*)", "Bash(ls:*)", "Bash(mkdir:*)", "Bash(pwd:*)", "Bash(rg:*)", + "Bash(sort:*)", "Bash(tail:*)", "Bash(tree:*)", "Bash(wc:*)", @@ -104,16 +104,23 @@ "WebFetch(domain:*.githubusercontent.com)", "WebFetch(domain:*.readthedocs.io)", "WebFetch(domain:about.gitlab.com)", + "WebFetch(domain:alacritty.org)", "WebFetch(domain:bazel.build)", + "WebFetch(domain:www.gnu.org)", "WebFetch(domain:developer.hashicorp.com)", + "WebFetch(domain:developers.raycast.com)", + "WebFetch(domain:doc.rust-lang.org)", "WebFetch(domain:docs.ansible.com)", "WebFetch(domain:docs.anthropic.com)", + "WebFetch(domain:docs.astral.sh)", "WebFetch(domain:docs.aws.amazon.com)", "WebFetch(domain:docs.claude.com)", "WebFetch(domain:docs.datadoghq.com)", "WebFetch(domain:docs.docker.com)", "WebFetch(domain:docs.github.com)", "WebFetch(domain:docs.gitlab.com)", + "WebFetch(domain:docs.python.org)", + "WebFetch(domain:docs.rs)", "WebFetch(domain:github.com)", "WebFetch(domain:gitlab.com)", "WebFetch(domain:go.dev)", @@ -121,8 +128,12 @@ "WebFetch(domain:graphite.dev)", "WebFetch(domain:handbook.gitlab.com)", "WebFetch(domain:helm.sh)", + "WebFetch(domain:katacontainers.io)", + "WebFetch(domain:kernel.org)", "WebFetch(domain:kubernetes.io)", "WebFetch(domain:man7.org)", + "WebFetch(domain:mypy.readthedocs.io)", + "WebFetch(domain:neovim.io)", "WebFetch(domain:nginx.org)", "WebFetch(domain:opentelemetry.io)", "WebFetch(domain:pkg.go.dev)", @@ -132,6 +143,9 @@ "WebFetch(domain:registry.terraform.io)", "WebFetch(domain:stackoverflow.com)", "WebFetch(domain:support.anthropic.com)", + "WebFetch(domain:www.jetbrains.com)", + "WebFetch(domain:www.lua.org)", + "WebFetch(domain:zed.dev)", "mcp__atlassian__atlassianUserInfo", "mcp__atlassian__fetch",