Modernize shell + editor: framework-free zsh, Neovim, idempotent installer#1
Conversation
…aller Replace the Prezto-based flow with plain zsh + antidote + powerlevel10k (starship as a documented one-step swap), migrate vim/Vundle to Neovim + lazy.nvim, and recover the legacy iTerm2 profiles as a Dynamic Profile. All legacy files are kept and mapped in the README. - .zshrc: antidote (brew copy preferred), compinit, fzf-tab with previews, fzf Ctrl-R/Ctrl-T/Alt-C, zoxide, 100k shared history - zsh/.zexports: guard virtualenvwrapper, drop GREP_OPTIONS and bash-only HISTCONTROL/HISTIGNORE - zsh/.zalias: eza-based ls family with plain-ls fallback - nvim/: lazy.nvim, catppuccin, blink.cmp, lspconfig+mason, treesitter, telescope+neo-tree, lualine, gitsigns+fugitive, aerial - install.sh: dry-run by default, idempotent, backs up to ~/.dotfiles-backup/<ts>/, never touches ~/.zprezto or chsh - iterm2/DynamicProfiles.json: Gargantua/Default from the old plist, stale /usr/local/bin/zsh command and typo'd home dir removed, font -> MesloLGS NF 16 - Brewfile: superset of brew_list.txt + modern toolchain + Nerd Font - CI: shellcheck, zsh -n, installer dry-run/idempotency, interactive load smoke test, headless nvim plugin sync Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Reviewer's GuideReplaces the legacy Prezto-based dotfiles with a framework-free zsh + Neovim stack, wired through an idempotent installer and backed by CI that smoke-tests shell and editor setup, while keeping legacy files in-place but superseded. Sequence diagram for CI shell and Neovim smoke testssequenceDiagram
participant GitHubActions
participant install_sh as install.sh
participant zsh
participant nvim
GitHubActions->>install_sh: ./install.sh (dry run)
GitHubActions->>install_sh: ./install.sh --apply
GitHubActions->>install_sh: ./install.sh --apply (idempotency check)
GitHubActions->>zsh: zsh -n .zshrc
GitHubActions->>zsh: zsh -i -c 'echo LOADED_OK'
zsh-->>GitHubActions: stderr.log (checked for errors)
GitHubActions->>nvim: nvim --headless "+Lazy! sync" +qa
GitHubActions->>nvim: nvim --headless -c 'lua print("colorscheme=" .. vim.g.colors_name)' -c qa
nvim-->>GitHubActions: colorscheme name
Flow diagram for install.sh idempotent installerflowchart LR
A[Start install.sh] --> B{APPLY flag?}
B -->|--dry-run| C[Print DRY RUN message]
B -->|--apply| D[Set APPLY=1]
C --> E[Iterate LINKS array]
D --> E
E --> F[link_one]
F --> G[backup_if_needed]
G --> H{APPLY==1?}
H -->|yes| I[mkdir -p BACKUP_DIR and mv target]
H -->|no| J[Echo would back up]
I --> K{APPLY==1?}
J --> K
K -->|yes| L[mkdir -p dest dir and ln -s src dest]
K -->|no| M[Echo would link]
L --> N{More LINKS?}
M --> N
N -->|yes| F
N -->|no| O[Print Brewfile suggestion]
O --> P[Print iTerm2 Dynamic Profile info]
P --> Q[Print shell change notice]
Q --> R[End]
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Hey - I've found 1 issue, and left some high level feedback:
- In
nvim/lua/plugins/lsp.lua, the mason plugins are referenced asmason-org/...instead of the usualwilliamboman/mason.nvimandwilliamboman/mason-lspconfig.nvim, which will prevent lazy.nvim from fetching them; consider correcting the plugin sources. - The header comment in
.zshrcdescribes starship as the default prompt, but the file unconditionally sources~/.p10k.zsh; aligning the comments and actual behavior (or gating p10k with a check) would make the prompt swap flow less confusing. - In
.zshrc,source ~/.zexports,source ~/.zalias, andsource ~/.zfuncwill hard-error if those files are missing (e.g., before runninginstall.sh); wrapping these with[[ -f ... ]] && source ...would make the shell config more robust on partial setups.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- In `nvim/lua/plugins/lsp.lua`, the mason plugins are referenced as `mason-org/...` instead of the usual `williamboman/mason.nvim` and `williamboman/mason-lspconfig.nvim`, which will prevent lazy.nvim from fetching them; consider correcting the plugin sources.
- The header comment in `.zshrc` describes starship as the default prompt, but the file unconditionally sources `~/.p10k.zsh`; aligning the comments and actual behavior (or gating p10k with a check) would make the prompt swap flow less confusing.
- In `.zshrc`, `source ~/.zexports`, `source ~/.zalias`, and `source ~/.zfunc` will hard-error if those files are missing (e.g., before running `install.sh`); wrapping these with `[[ -f ... ]] && source ...` would make the shell config more robust on partial setups.
## Individual Comments
### Comment 1
<location path="nvim/lua/plugins/lsp.lua" line_range="17-19" />
<code_context>
+ "neovim/nvim-lspconfig",
+ dependencies = { "saghen/blink.cmp" },
+ config = function()
+ local capabilities = require("blink.cmp").get_lsp_capabilities()
+ vim.lsp.config("*", { capabilities = capabilities })
+ vim.lsp.enable({ "pyright", "lua_ls" })
+ end,
+ },
</code_context>
<issue_to_address>
**issue (bug_risk):** Using `vim.lsp.config`/`vim.lsp.enable` ties this setup to newer Neovim APIs and may break on current stable releases.
On Neovim 0.10 (current brew stable), these `vim.lsp.config` / `vim.lsp.enable` APIs aren’t available, so this will error at startup and prevent LSP from initializing. To keep this working on more versions, either use the usual `require("lspconfig").pyright.setup{ capabilities = capabilities }` / `lua_ls.setup{ ... }` pattern, or guard the `vim.lsp.*` calls with a `vim.lsp.config` existence check and fall back to `lspconfig` when missing.
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
| local capabilities = require("blink.cmp").get_lsp_capabilities() | ||
| vim.lsp.config("*", { capabilities = capabilities }) | ||
| vim.lsp.enable({ "pyright", "lua_ls" }) |
There was a problem hiding this comment.
issue (bug_risk): Using vim.lsp.config/vim.lsp.enable ties this setup to newer Neovim APIs and may break on current stable releases.
On Neovim 0.10 (current brew stable), these vim.lsp.config / vim.lsp.enable APIs aren’t available, so this will error at startup and prevent LSP from initializing. To keep this working on more versions, either use the usual require("lspconfig").pyright.setup{ capabilities = capabilities } / lua_ls.setup{ ... } pattern, or guard the vim.lsp.* calls with a vim.lsp.config existence check and fall back to lspconfig when missing.
Restructure from a PR-style done/open checklist into a reference organized around what → install → daily use → customize → troubleshoot → layout: - top-level tool table + safe-by-default install flow - daily-use cheat sheets (shell keybindings/aliases, nvim leader maps) - "want to X → edit this file" customization table - troubleshooting for the issues hit during bring-up (compinit/fzf Tab, font tofu, stale iTerm shell path, undo) - plain repo layout + trimmed legacy table Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replaces the Prezto-based setup with a framework-free stack: plain zsh + antidote + powerlevel10k (starship as a one-step swap), Neovim + lazy.nvim, and an idempotent
install.sh. All legacy files are kept and mapped in the README —masterbehavior is not removed, just superseded.Highlights
compinit, fzf-tab with previews, fzfCtrl-R/Ctrl-T/Alt-C, zoxide, 100k shared/deduped history.virtualenvwrapper, dropped deprecatedGREP_OPTIONS+ bash-only history vars; eza-basedlsfamily with plain-ls fallback.vim/.vimrc.legacy.--applyto act, backs up to~/.dotfiles-backup/<ts>/, never touches~/.zpreztoor runschsh./usr/local/bin/zshcommand and typo'd home dir fixed; font → MesloLGS NF.brew_list.txt+ modern toolchain + Nerd Font.zsh -n, installer dry-run/idempotency, interactive-load smoke test, headless nvim plugin sync.Testing
Every piece was exercised on an Apple-Silicon Mac, mostly in isolated
ZDOTDIR/XDG_CONFIG_HOMEsandboxes: zsh loads with zero completion errors, installer is idempotent (0 backups on re-apply), Neovim installs all plugins headlessly and loads catppuccin, shellcheck passes.Open follow-ups (tracked in README)
brew bundleend-to-end (tools were installed piecemeal during bring-up)nvimlaunch (mason installs pyright/lua_ls).gitconfigmanagement + delta pager🤖 Generated with Claude Code
Summary by Sourcery
Modernize the dotfiles repo around a framework-free zsh + Neovim setup with an idempotent installer and CI coverage.
New Features:
Enhancements:
CI: