# ~/.zshrc # ---------- Interactive zsh (each tab) ---------- # 1. Initialize Completion System (with caching) autoload -Uz compinit if [[ -n ${ZDOTDIR:-$HOME}/.zcompdump(#qN.m-1) ]]; then compinit -C else compinit fi ##### History HISTFILE="$HOME/.zsh_history" HISTSIZE=10000 SAVEHIST=20000 setopt APPEND_HISTORY INC_APPEND_HISTORY EXTENDED_HISTORY setopt HIST_IGNORE_SPACE HIST_REDUCE_BLANKS HIST_SAVE_NO_DUPS HIST_FIND_NO_DUPS ##### Colors & Appearance export CLICOLOR=1 export LSCOLORS=gxfxcxdxbxegedabagacad export TERM=xterm-256color _fix_cursor() { print -n -- $'\e[0 q'; } autoload -U add-zsh-hook add-zsh-hook precmd _fix_cursor ##### Quality-of-Life & AI Helpers alias h='history 1' alias cls="clear && printf '\e[3J'" alias ls='command ls -G' alias grep='grep --color=auto' alias beforeafter='egrep -C 5 -i -e ' alias release_from_quarantine='xattr -dr com.apple.quarantine' alias pywhere='which python && python --version' alias renew='exec zsh' alias ..="cd .." alias ...="cd ../.." alias ccat="clear ; cat " alias tree='pwd; ls -R | grep ":$" | sed -e "s/:$//" -e "s/[^-][^\/]*\//--/g" -e "s/^/ /" -e "s/-/|/"' alias notify='terminal-notifier -title "Terminal" -message' # AI Helpers alias askai='uv run --project "$HOME/python_projects/openai" --directory "$PWD" "$HOME/python_projects/openai/oai.py" --stream' alias asklocal='uv run --project "$HOME/python_projects/openai" --directory "$PWD" "$HOME/python_projects/openai/endpoint-oai.py" --stream' alias open-webui_start='source "/Users/jared/python_projects/open-webui/.venv/bin/activate" ; open-webui serve --host 127.0.0.1 --port 8765' ##### Networking & Remote (ISO Toolkit) alias pubip="curl -s -4 ifconfig.me" alias privip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'" alias netcons='lsof -i' alias flushdns='dscacheutil -flushcache' alias lsock='sudo /usr/sbin/lsof -i -P' alias lsocku='sudo /usr/sbin/lsof -P | grep UDP' alias lsockt='sudo /usr/sbin/lsof -P | grep TCP' alias ipinfo0='ipconfig getpacket en0' alias ipinfo1='ipconfig getpacket en1' alias openports='sudo lsof -i | grep LISTEN' alias showdns='scutil --dns' alias shownameservers='scutil --dns | grep "nameserver\[[0-9]*\]"' alias showip='echo -n "IP: "; ifconfig | grep "inet " | grep -v 127 | awk "{print \$2}" | head -1; echo -n "router: "; netstat -rn | grep "^default" | awk "{print \$2}" | head -1' alias showroutes='netstat -rn | grep -v :: | grep -v lo0 | grep -v 224\.0 | grep -v 255\.255\.255\.255 | grep -v 169\.254' alias fastscan='nmap -n -F --open ' alias showconns="$HOME/bin/net/showconns.sh" ##### Nginx Helpers (Root / Port 80) export NGINX_BIN="/opt/homebrew/opt/nginx/bin/nginx" export NGINX_CONF="/opt/homebrew/etc/nginx/nginx.conf" alias nginx_start='sudo $NGINX_BIN -c $NGINX_CONF' alias nginx_stop="sudo nginx -s stop" alias nginx_reload="sudo nginx -s reload" alias nginx_restart='sudo nginx -s stop; sleep 1; sudo $NGINX_BIN -c $NGINX_CONF' alias nginx_test='sudo $NGINX_BIN -t -c $NGINX_CONF' alias nginx_listen='sudo lsof -iTCP:80 -sTCP:LISTEN | grep nginx' alias editnginx='sudo vi /opt/homebrew/etc/nginx/servers/local-only.conf' alias gowww='cd /opt/homebrew/var/www' alias scp-moviesdb='echo "Sending movies.db to zappy" ; /usr/bin/scp /opt/homebrew/var/www/OC-Movie-Finder/server/movies.db zappy:/var/www/OC-Movie-Finder/server/movies.db' ##### System, Media & Utilities alias cpu-hogs="$HOME/bin/topcpu.sh" alias ttop="top -R -F -s 10 -o rsize" alias myps="$HOME/bin/ps-jared.sh" alias remove-mac-junkfiles="find . -name '*.DS_Store' -type f -ls -delete && find . -name 'Thumbs.db' -type f -ls -delete" alias sleepnow="pmset sleepnow" alias restartdock="killall -KILL Dock" alias downloadyt='noglob yt-dlp -f mp4 -o "%(title)s.%(ext)s"' alias progresscp='rsync -ah --info=progress2' alias sanitizefiles='$HOME/bin/files/filename_sanitize.sh' alias lowersanitizefiles='$HOME/bin/files/filename_sanitize.sh --lower' alias have="have.sh" alias vlc='open /Applications/VLC.app' if command -v ffmpeg >/dev/null 2>&1; then doublespeed () { ffmpeg -i "$*" -r 100 -vf 'setpts=(1/2)*PTS' -an double.mp4 ; } alias ffresize="$HOME/bin/media/ffresize.sh" alias ffmerge="$HOME/bin/media/ffmerge.sh" alias findfps_media='for i in *; do echo " "; echo "$i"; ffmpeg -i "$i" 2>&1 | egrep "(fps)"; done' alias ffprocs="ps wauxg | grep ff | grep -v Google | grep -v Slack | grep -v 'grep ff' | awk '{ print \$2 , \$11, \$12, \$13 }'" fi # PDF helpers (guarded) command -v sejda-console >/dev/null 2>&1 && { alias rotatepdf="mkdir -p ./rotated ; sejda-console rotate --pageRotation all:90 -o ./rotated --files *.PDF" alias mergepdf="sejda-console merge -o ./merged.pdf --files *.pdf" } ##### Search & Jared's LS Views f() { /usr/bin/find . -name "*$**" ; } fs() { /usr/bin/find . -iname "$**" ; } fe() { /usr/bin/find . -iname "*$**" ; } findtext () { find . -exec egrep "$*" {} /dev/null \; 2>/dev/null ; } finddir () { find . \( -name 'Application Support' -o -name 'Library' -o -name 'Pictures' -o -name 'Movies' -o -name 'Parallels' -o -name '.tldrc' -o -name 'Virtual Machines.localized' -o -name '.venv' -o -name '.lmstudio' -o -name '.cache' \) -prune -o -type d -iname "*$**" -ls ; } findfile () { sudo find . \( -type d \( -name dev -o -name games -o -name libexec -o -name tmp -o -name lib -o -name lib64 -o -name sbin -o -name selinux -o -name sys -o -name proc -o -name spool -o -name mysql -o -name include -o -name '.cache' -o -name '.npm' -o -name 'node_modules' -o -name 'Applications' -o -name 'Library' -o -name '.venv' -o -name '.lmstudio' \) -prune \) -o -type f -iname "*$**" -print 2>/dev/null } fastfindtext () { local pattern="$*" [[ -z "$pattern" ]] && { echo "Usage: fastfindtext "; return 1; } sudo find . -maxdepth 4 \ \( -type d \( -name dev -o -name 'Library' -o -name '.Trash' -o -name log -o -name bin -o -name games -o -name libexec -o -name src -o -name tmp -o -name lib -o -name lib64 -o -name media -o -name sbin -o -name selinux -o -name sys -o -name proc -o -name spool -o -name mysql -o -name include -o -name dist -o -name .cache -o -name .npm -o -name node_modules -o -name '.venv' -o -name '.lmstudio' -o -name '__pycache__' \) -prune \) -o \ \( -type f ! -name '*__*' ! \( -name '*.o' -o -name '*.pyc' -o -name '*.c' -o -name '*.h' -o -name '*.sql' -o -name '*.pcap' -o -name '*.so' -o -name '*.a' -o -name '*.tar' -o -name '*.pdf' -o -name '*.mp4' -o -name '*.epub' -o -name '*.docx' -o -name '*.cbr' -o -name '*.xls' -o -name '*.png' -o -name '*.jpg' -o -name '*.JPG' -o -name '*.dmg' \) -print0 \) \ | xargs -0 grep -i -w -l -- "$pattern" | sort -u } vff() { local pattern="$1" [[ -z "$pattern" ]] && { echo "Usage: vff "; return 1; } local -a EXCLUDES=(bin include lib __pycache__ assets share node_modules dist .git .venv build out target) local -a prune_expr for d in "${EXCLUDES[@]}"; do prune_expr+=(-name "$d" -o); done (( ${#prune_expr[@]} )) && prune_expr=("${prune_expr[@]:0:${#prune_expr[@]}-1}") local -a files=("${(@f)$(find . \( -type d \( ${prune_expr[@]} \) -prune \) -o -type f -iname "*${pattern}*" -print | sort)}") if (( ${#files[@]} == 0 )); then echo "No files found."; return 1; fi if (( ${#files[@]} == 1 )); then "${EDITOR:-vi}" -- "${files[1]}"; return; fi local PS3=$'Select file (number), or q: ' select file in "${files[@]}"; do [[ "$REPLY" == [qQ] ]] && break [[ -n "$file" ]] && "${EDITOR:-vi}" -- "$file" && break done } vii() { if (( $# != 1 )); then echo "Usage: vii "; return 1; fi local file_path; file_path=$(find . -type f -name "$1" -print -quit) [[ -n "$file_path" ]] && { echo "Opening: $file_path"; vi "$file_path"; } || echo "Not found: $1" } # LS Logic l () { ls -Ald "$@"*/ 2>/dev/null; echo ' '; ls -lhF "$@" | grep -v '^d' | egrep -v -e '^total'; } ldir () { ls -lh "$@" | grep "^d"; echo ' '; ls -lhF "$@" | grep -v "^d" | egrep -v -e '^total'; } ll () { ls -Alh "$@" | grep "^d" | egrep -e ' \..*$' ; ls -lh "$@" | grep "^d" ; echo ' ' ; ls -lAhF "$@" | grep -v "^d" | egrep -e ' \..*$' ; ls -lhF "$@" | grep -v "^d" | egrep -v -e '^total\ '; } lh () { ls -lAh "$@" | grep "^d" | egrep -e ' \..*$' ; echo ' ' ; ls -lAhF "$@" | grep -v "^d" | egrep -e ' \..*$' | egrep -v -e '^total\ '; } alias lsd='ls -l | grep "^d"' alias lsize="/Users/jared/python_projects/list_by_size/.venv/bin/python /Users/jared/python_projects/list_by_size/list_by_size.py" alias ldate='ls -1tr | while IFS= read -r f; do printf "%s %s %s\n" "$(stat -f "%Sm" -t "%b %d %Y" "$f")" "$( [ -d "$f" ] && echo "dir " || echo file )" "$f"; done' alias llc='echo Total number of files: $(ls -al | wc -l) in $(pwd)' ##### Project & Brew Aliases alias lsgroup='/Users/jared/python_projects/lsgroup/.venv/bin/python3 /Users/jared/python_projects/lsgroup/lsgroup.py' alias work='$HOME/python_projects/task-manager-curses/.venv/bin/python3 $HOME/python_projects/task-manager-curses/tasks.py --db $HOME/python_projects/task-manager-curses/tasks.db --client-secret=$HOME/python_projects/task-manager-curses/client_secret.json --token=$HOME/python_projects/task-manager-curses/token_work.json' alias personal='$HOME/python_projects/task-manager-curses/.venv/bin/python3 $HOME/python_projects/task-manager-curses/tasks.py --db $HOME/python_projects/task-manager-curses/personal_tasks.db --client-secret=$HOME/python_projects/task-manager-curses/client_secret.json --token=$HOME/python_projects/task-manager-curses/token_personal.json' alias ideas='$HOME/python_projs/ideas/bin/python3 $HOME/python_projs/ideas/ideas.py --db $HOME/python_projs/ideas/ideas.db' alias seepersonaldb='dblab --config --cfg-name "taskspersonal"' alias seeworkdb='dbee' alias gdrive_list='pushd "$HOME/gdrive_list_sort" >/dev/null ; "$HOME/gdrive_list_sort/wildcard_search_google_drive.py" ; popd >/dev/null' ocmovies() { cd /opt/homebrew/var/www/OC-Movie-Finder/server || return npm run server } brewfind () { find /opt/homebrew -iname "*$@*" | grep 'bin' | grep -e "$@$" ; } alias bi='clear ; brew info ' ##### Git Aliases alias gs='git status' alias ga='git add .' alias gc='git commit -m' alias gp='git push' ##### SSH Workflow sshKeyGen () { echo "Key name? "; read -r name echo "Email? "; read -r email ssh-keygen -t ed25519 -f "$HOME/.ssh/id_$name" -C "$email" pbcopy < "$HOME/.ssh/id_$name.pub" echo "Public key (Ed25519) copied to clipboard. Update ~/.ssh/config." } ##### Automated Environments load-nvmrc() { [[ -r .nvmrc ]] && nvm use >/dev/null 2>&1; } add-zsh-hook chpwd load-nvmrc ##### Startup, Banners & Metrics load-nvmrc cmds() { ( cat ~/.zshrc | grep alias | grep -v '\#alias' | cut -d'=' -f 1 | cut -d' ' -f2 ) | sort | tr '\n' ' ' echo "\n\nUseful brew: byobu tldr ebook-convert btop ncdu resolveip testssl" } hdfree () { echo "Space left: $(df -h / | awk 'NR==2{print $4}')"; } if curl -s --max-time 1 https://api.ipify.org >/tmp/pubip 2>/dev/null; then echo "Connected to public Internet: $(cat /tmp/pubip)" fi echo "Private: " $HOME/bin/net/net-show-inet4.sh echo " " [[ -x "$HOME/bin/net/wifi_signal.sh" ]] && "$HOME/bin/net/wifi_signal.sh" hdfree echo " " cmds echo " " # --- Auto venv activate/deactivate (project-local .venv) --- # Helper: return 0 if $PWD is inside $1 (directory prefix match), else 1 _is_in_dir() { local base="$1" [[ -z "$base" ]] && return 1 [[ "$PWD" == "$base" || "$PWD" == "$base"/* ]] } auto_venv() { # If a venv is active, deactivate when we leave its owning project directory. # Assumption: VIRTUAL_ENV points to .../PROJECT/.venv if [[ -n "$VIRTUAL_ENV" ]]; then local venv_dir="$VIRTUAL_ENV" # .../PROJECT/.venv local project_dir="${venv_dir:h}" # .../PROJECT if ! _is_in_dir "$project_dir"; then # Only call deactivate if it exists (it will when a venv was activated normally) if whence -w deactivate >/dev/null 2>&1; then deactivate else # Fallback: at least unset the marker to avoid repeated checks unset VIRTUAL_ENV fi fi fi # If no venv active now, activate if the new directory has a project-local .venv if [[ -z "$VIRTUAL_ENV" && -r ".venv/bin/activate" ]]; then source ".venv/bin/activate" fi } # Ensure the hook is set once (remove/replace your existing auto_venv hook line) autoload -U add-zsh-hook add-zsh-hook chpwd auto_venv # Run once for the starting directory of a new shell/tab auto_venv