nix/home/zsh.nix
Harivansh Rathi 8cf74b95be fix agent-browser PATH: add npm global bin to zsh path
- Add npm global bin dir to zsh path array so agent-browser
  (and other npm -g binaries) are found in interactive shells
- Fix activation check to look for the binary at the actual npm
  prefix path instead of relying on command -v with wrong PATH
2026-04-02 00:11:18 -04:00

167 lines
4.5 KiB
Nix

{
config,
lib,
pkgs,
hostConfig,
theme,
...
}:
{
programs.zsh = {
enable = true;
dotDir = config.home.homeDirectory;
enableCompletion = false;
defaultKeymap = "viins";
autosuggestion.enable = true;
syntaxHighlighting.enable = true;
history = {
size = 50000;
save = 50000;
ignoreDups = true;
ignoreAllDups = true;
ignoreSpace = true;
extended = true;
append = true;
path = "${config.xdg.stateHome}/zsh_history";
};
shellAliases = {
co = "codex --dangerously-bypass-approvals-and-sandbox";
ca = "cursor-agent";
cc = "claude";
ch = "claude-handoff";
cl = "clear";
gc = "git commit";
gd = "git diff";
gk = "git checkout";
gp = "git push";
gpo = "git pull origin";
gs = "git status";
ld = "lumen diff";
lg = "lazygit";
nim = "nvim .";
}
// lib.optionalAttrs hostConfig.isDarwin {
tailscale = "/Applications/Tailscale.app/Contents/MacOS/Tailscale";
};
envExtra = ''
if [[ -f "$HOME/.cargo/env" ]]; then
. "$HOME/.cargo/env"
fi
export NODE_NO_WARNINGS=1
''
+ lib.optionalString hostConfig.isDarwin ''
export GHOSTTY_RESOURCES_DIR="${pkgs.ghostty-bin}/Applications/Ghostty.app/Contents/Resources/ghostty"
''
+ ''
export MANPAGER="nvim +Man!"
'';
initContent = lib.mkMerge [
(lib.mkOrder 550 ''
autoload -U compinit && compinit -d "${config.xdg.stateHome}/zcompdump" -u
zmodload zsh/complist
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-za-z}'
'')
(lib.mkOrder 1000 ''
if [[ -f ~/.config/secrets/shell.zsh ]]; then
source ~/.config/secrets/shell.zsh
elif [[ -f ~/.secrets ]]; then
source ~/.secrets
fi
[ -s "$HOME/.bun/_bun" ] && source "$HOME/.bun/_bun"
export BUN_INSTALL="$HOME/.bun"
typeset -U path PATH
path=(
"$HOME/.amp/bin"
"$BUN_INSTALL/bin"
"$HOME/.antigravity/antigravity/bin"
"$HOME/.opencode/bin"
"$(npm prefix -g 2>/dev/null)/bin"
"${pkgs.postgresql_17}/bin"
"$HOME/.nix-profile/bin"
"/run/wrappers/bin"
"/etc/profiles/per-user/${config.home.username}/bin"
"/run/current-system/sw/bin"
"/nix/var/nix/profiles/default/bin"
${lib.optionalString hostConfig.isDarwin ''
"/opt/homebrew/bin"
"/opt/homebrew/sbin"
''}
$path
)
_codex_read_theme_mode() {
local mode_file="$HOME/.local/state/theme/current"
if [[ -f "$mode_file" ]]; then
local mode
mode=$(tr -d '[:space:]' < "$mode_file")
if [[ "$mode" == light || "$mode" == dark ]]; then
printf '%s' "$mode"
return
fi
fi
printf 'dark'
}
_codex_apply_highlight_styles() {
local mode="$(_codex_read_theme_mode)"
[[ "$mode" == "''${_CODEX_LAST_HIGHLIGHT_THEME:-}" ]] && return
typeset -gA ZSH_HIGHLIGHT_STYLES
if [[ "$mode" == light ]]; then
${theme.renderZshHighlights "light"}
else
${theme.renderZshHighlights "dark"}
fi
typeset -g _CODEX_LAST_HIGHLIGHT_THEME="$mode"
}
unalias ga 2>/dev/null
git() {
command git "$@"
local exit_code=$?
case "$1" in
add|stage|reset|checkout)
if command -v critic >/dev/null 2>&1; then
( critic review 2>/dev/null & )
fi
;;
esac
return $exit_code
}
autoload -Uz add-zle-hook-widget
_codex_cursor() { printf '\e[%s q' "''${1:-6}"; }
_codex_cursor_select() { [[ "$KEYMAP" == vicmd ]] && _codex_cursor 2 || _codex_cursor 6; }
_codex_cursor_beam() { _codex_cursor 6; }
add-zle-hook-widget zle-keymap-select _codex_cursor_select
add-zle-hook-widget zle-line-init _codex_cursor_beam
add-zle-hook-widget zle-line-finish _codex_cursor_beam
precmd() {
_codex_apply_prompt_theme
_codex_apply_highlight_styles
_codex_cursor_beam
}
preexec() { _codex_cursor_beam; }
_codex_apply_prompt_theme
_codex_apply_highlight_styles
'')
(lib.mkAfter ''
bindkey '^k' forward-char
bindkey '^j' backward-char
'')
];
};
}