# ========================================== # 0. Oh My Zsh # ========================================== export ZSH="$HOME/.oh-my-zsh" # 跳过 OMZ compaudit 安全扫描(单用户 Homebrew 环境无多用户补全目录风险,省 ~10ms) export ZSH_DISABLE_COMPFIX=true # 补全由 Warp AI 接管(Cmd+I) plugins=(git) # 已安装在 ~/.oh-my-zsh/custom/plugins/ 但未启用的插件(启用时加入上方数组): # zsh-autosuggestions 历史命令灰色建议(↑ 接受) # zsh-syntax-highlighting 命令行语法高亮 # fzf-tab Tab 补全接 fzf # plugins=(git zsh-autosuggestions zsh-syntax-highlighting fzf-tab) # compinit 缓存:把 zcompdump 放 XDG_CACHE_HOME 下,跨账号/多场景稳态 0ms autoload -U compinit if [[ -n "${XDG_CACHE_HOME:-}" ]]; then ZSH_COMPDUMP="${XDG_CACHE_HOME}/zsh/zcompcache-${ZSH_VERSION}" else ZSH_COMPDUMP="${HOME}/.cache/zsh/zcompcache-${ZSH_VERSION}" fi mkdir -p "${ZSH_COMPDUMP:h}" source $ZSH/oh-my-zsh.sh # 手写精简 PROMPT:不依赖 OMZ 主题系统(bira 框架引入 ~150ms) # Warp 自己渲染 block status;这一行只是终端顶部提示符 PROMPT='%F{cyan}%~%f %# ' PROMPT_EOL_MARKER='' # ========================================== # 1. 环境变量 # ========================================== # --- Homebrew(TUNA API + USTC Bottle)--- export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api" export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles" export HOMEBREW_NO_AUTO_UPDATE=1 export HOMEBREW_NO_INSTALL_CLEANUP=1 # --- 编辑器与显示 --- export EDITOR='nvim' export CLICOLOR='Yes' export LSCOLORS='CxfxcxdxbxegedabagGxGx' export BAT_THEME="TwoDark" # NODE_VERSION=$(node -v) 已移除:每次启动 fork node ~23ms,且全机无使用方 # --- Node.js 二进制下载(USTC 镜像)--- export NODEJS_ORG_MIRROR="https://mirrors.ustc.edu.cn/node" export NVM_NODEJS_ORG_MIRROR="$NODEJS_ORG_MIRROR" export FNM_NODE_DIST_MIRROR="$NODEJS_ORG_MIRROR" export N_NODE_MIRROR="$NODEJS_ORG_MIRROR" # --- Docker --- export DOCKER_BUILDKIT=1 export DOCKER_CONTENT_TRUST=1 # --- 代理(大写小写都设,覆盖 npm/Maven/Gradle/cURL 等只认一种的工具)--- # export all_proxy="http://127.0.0.1:7890" # export http_proxy="http://127.0.0.1:7890" # export https_proxy="http://127.0.0.1:7890" # export ALL_PROXY="http://127.0.0.1:7890" # export HTTP_PROXY="http://127.0.0.1:7890" # export HTTPS_PROXY="http://127.0.0.1:7890" # --- 代理排除名单(本机 / 私有网段 / .local 不走代理,不加 .cn 以免海外服务走国内 CDN)--- export no_proxy="localhost,127.0.0.1,::1,.local,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12" export NO_PROXY="$no_proxy" # --- LLM API 地址(非密钥)--- export GROK_BASE_URL="https://nexus.itssx.com/api/grok" # --- grok CLI 默认全权限模式(--no-sandbox:shell 命令直接在宿主机执行)--- alias grok="grok --no-sandbox" # --- 敏感凭据/密钥(隔离在 ~/secrets.env,权限 600)--- if [ -f "$HOME/secrets.env" ]; then source "$HOME/secrets.env" fi # --- Python / 包管理(腾讯云镜像)--- export UV_DEFAULT_INDEX="https://mirrors.cloud.tencent.com/pypi/simple/" # --- CODEX 自动批准(去交互)--- export CODEX_NO_PROMPT=1 export CODEX_ALLOW_ALL=1 export CODEX_SKIP_CONFIRM=1 export CODEX_AUTO_APPROVE=1 # ========================================== # 2. 路径设置 # ========================================== typeset -U path path=( $HOME/.local/bin $HOME/bin $HOME/.mimocode/bin /opt/homebrew/bin /opt/homebrew/sbin /usr/local/bin /usr/bin /bin /usr/sbin /sbin $HOME/.lmstudio/bin $HOME/.codeium/windsurf/bin $HOME/.antigravity/antigravity/bin $HOME/.opencode/bin $HOME/.minimax/bin $HOME/.grok/bin /opt/homebrew/Cellar/poppler /opt/local/bin /opt/local/sbin /Library/Frameworks/Python.framework/Versions/3.10/bin "$HOME/Library/Application Support/JetBrains/Toolbox/scripts" ) export PATH # ========================================== # 3. 外部集成 # ========================================== alias bearcli="/Applications/Bear.app/Contents/MacOS/bearcli" ___MY_VMOPTIONS_SHELL_FILE="${HOME}/.jetbrains.vmoptions.sh"; if [ -f "${___MY_VMOPTIONS_SHELL_FILE}" ]; then . "${___MY_VMOPTIONS_SHELL_FILE}"; fi [ -f "$HOME/.local/bin/env" ] && . "$HOME/.local/bin/env" [ -f ~/.config/nvim/zsh_padding.zsh ] && source ~/.config/nvim/zsh_padding.zsh # ========================================== # 4. 补全系统 # ========================================== fpath=(/Users/dyx/.docker/completions $fpath) if [[ -d "/opt/homebrew/share/zsh/site-functions" ]]; then fpath=("/opt/homebrew/share/zsh/site-functions" $fpath) fi # ========================================== # 5. 工具集成 # ========================================== if command -v zoxide > /dev/null; then eval "$(zoxide init zsh)" alias z='__zoxide_z' alias zi='__zoxide_zi' fi [ -f ~/.fzf.zsh ] && source ~/.fzf.zsh # ========================================== # 6. 自定义函数 # ========================================== # --- 配置目录跳转 --- cvs() { cd '/Users/dyx/Library/Application Support/Code/User'; } ccl() { cd '/Users/dyx/.claude' && nvim; } ccx() { cd '/Users/dyx/.codex' && nvim; } cge() { cd '/Users/dyx/.gemini' && nvim; } cvm() { cd /Users/dyx/.config/nvim; } ok() { source ~/.zshrc && clear; } vsh() { nvim ~/.zshrc; } Vsh() { nvim ~/.zshrc; } # --- Python 虚拟环境激活 --- acc() { local project_dir="/Users/dyx/Code/Agent" local venv="${project_dir}/.venv" if (( $# > 0 )); then print -u2 "acc 只进入项目并激活虚拟环境;请使用 uv add --active <包名> 管理依赖。" return 2 fi cd "${project_dir}" || return 1 source "${venv}/bin/activate" || return 1 } # --- Python uv 依赖自动导出 --- if [ -f "/Users/dyx/ai_coding_rules/scripts/uv-auto-export.sh" ]; then source "/Users/dyx/ai_coding_rules/scripts/uv-auto-export.sh" fi # --- VSCode 打开 --- codef() { local file="$1" [ -f "$file" ] && command code "$(dirname "$file")" --goto "$file" || command code "$@" } # --- Chrome 调试模式 --- sel() { /Applications/Google\ Chrome2.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 --user-data-dir="/Users/dyx/Code/selenium_data" } # --- SSH 快捷方式(shell 代理变量对 ssh 无效,要禁代理请改 ~/.ssh/config 的 ProxyCommand)--- ss() { if [ $# -eq 0 ]; then ssh txy else lazyssh "$@" fi } ssc() { if [ $# -eq 0 ]; then ssh ssc else lazyssh "$@" fi } # --- Docker 容器展示 --- _dkps_format() { TAB=$(printf '\t') docker ps "$@" --format "table {{.ID}}${TAB}{{.Names}}${TAB}{{.Status}}${TAB}{{.Image}}${TAB}{{.Ports}}" \ | perl -pe 's/\[::\]:[^\t,]*//g; s/:::[^\t,]*//g; s/0\.0\.0\.0://g; s/->/-/g; s/\/tcp//g; s/\/udp//g; s/,\s*,/,/g; s/^\s*,\s*//; s/,\s*$//' \ | awk 'NR==1 {print $0} NR>1 {if ($0 ~ /Up/) printf "\033[1;35m%s\033[0m\n", $0; else print $0}' \ | column -t -s "$TAB" } dkps() { _dkps_format; } dkpsa() { _dkps_format -a; } dkpsaa() { docker ps -a --format "{{.Names}}\t{{.Status}}\t{{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Command}}\t{{.RunningFor}}" | awk -F"\t" '{ if ($1 == "" || $1 ~ /^-+$/) next; print "------------------------------" if ($2 ~ /Up/) { printf "\033[1;35mNames:\033[0m \033[1;35m%s\033[0m\n", $1 printf "\033[1;33mStatus:\033[0m \033[1;33m%s\033[0m\n", $2 printf "\033[1;34mID:\033[0m \033[1;34m%s\033[0m\n", $3 printf "\033[1;32mImage:\033[0m \033[1;32m%s\033[0m\n", $4 printf "\033[1;36mPorts:\033[0m \033[1;36m%s\033[0m\n", $5 } else { printf "\033[1;35mNames:\033[0m %s\n", $1 printf "\033[1;33mStatus:\033[0m %s\n", $2 printf "\033[1;34mID:\033[0m %s\n", $3 printf "\033[1;32mImage:\033[0m %s\n", $4 printf "\033[1;36mPorts:\033[0m %s\n", $5 } printf "\033[1;37mCommand:\033[0m %s\n", $6 printf "\033[1;37mCreated:\033[0m %s\n", $7 } END {print "------------------------------"}' } # --- Docker 全面清理 --- dkrmaa() { pkill -f 'docker build' 2>/dev/null || true docker builder prune -af docker ps -aq | xargs -r docker rm -f docker images -q | xargs -r docker rmi -f docker volume ls -q | xargs -r docker volume rm docker system prune -a --volumes } # ========================================== # 7. 别名 # ========================================== # --- 基础命令 --- alias Ok='ok' alias cl="clear" alias Cl="clear" alias cll="reset" alias py="python" alias ipy="ipython" alias mn="tldr" alias vi="nvim" alias vim="nvim" alias neovim="nvim" # --- 文件查看 --- alias cc="bat" # --- eza(现代 ls 增强)--- if command -v eza > /dev/null; then alias ls='eza --icons --group-directories-first' alias l='ls' alias ll='eza -lh --icons --git --group-directories-first --header' alias la='eza -aH --icons --group-directories-first' alias lt='eza --tree --level=2 --icons' alias ld='eza -D --icons' alias lD='eza -lhD --icons' else alias ls='ls --color=auto' alias ll='ls -lh' alias la='ls -A' alias lt='tree -d -L 2' fi # --- 目录跳转 --- alias cw="cd /Users/dyx/Code/Cloud_Web" alias zw="cd /Users/dyx/Code/Cloud_Web" alias cja="cd /Users/dyx/Library/CloudStorage/OneDrive-个人/0.Mac/Jetbrains激活" alias vis="nvim sftp://txy//www/wwwroot/" # --- Git --- alias gs="lazygit status" alias gss="git status --short --branch" alias gst="git status -s" alias gsu="git status -uall -s" alias ga="git add -A" alias ad="git add -A" alias gcm="git commit" alias gp="git pull" alias gpll="git pull" alias gpsh="git push" alias gck="git checkout" alias gcg="git checkout" alias gsw="git switch" alias gcw="git switch" alias gcwc="git switch -c" alias gb="git branch" alias gbr="git branch" alias gbra="git branch -a" alias gbrd="git branch -d" alias gmer="git merge" alias gl="git log --oneline --all" alias gll="git log --all" alias glg="git log --oneline --graph --decorate --all" alias gla="git log --name-status --oneline" alias glf="git log --name-status --oneline" alias glfs="git ls-files" alias gsh="git show" alias gf="git diff | bat --paging=always" alias gff="git diff" alias gre="git reset" alias grs="git reset" alias grt="git restore" alias grf="git reflog" alias gsthl="git stash list --date=iso" alias gsth="git stash" alias gini="git init" alias gfc="git fetch" # 注意:原别名 ge 与后面 AI 工具区的 ge(gemini) 冲突且一直被覆盖,改名 gdbk alias gdbk='scp txy:/www/wwwroot/mySite/db.sqlite3 /Users/dyx/Code/mySite/' # --- Docker --- alias dk="docker" alias dkr="docker run" alias dkrv="docker run -v" alias dkrd="docker run -d" alias dkrdi="docker run -d -i" alias dkrdv="docker run -d -v" alias dkri="docker run -it" alias dkriv="docker run -it -v" alias dkrm="docker rm" alias dkec="docker exec" alias dkst="docker start" alias dkstp="docker stop" alias dkstpa="docker ps -q | xargs -r docker stop" alias dkrst="docker restart" alias dkdf="docker diff" alias dkim="docker image" alias dkims="docker images" alias dkima="docker images" alias dkrmi="docker rmi" alias dkpl="docker pull" alias dkpll="docker pull" alias dkpsh="docker push" alias dkbd="docker image build" alias dkhs="docker history" alias dksy="docker system" alias dkrmia='docker images -q | xargs -r docker rmi -f' alias dkrmca='docker ps -aq | xargs -r docker rm -f' alias dkrmva='docker volume ls -q | xargs -r docker volume rm' alias dkrmfa="docker system prune -a --volumes" alias dkvs='docker volume ls' alias kl="/Users/dyx/Documents/my_scripts/kill_port.sh" # --- AI 工具 --- # opencode 包装:未显式传 -m/--model 时,自动继承上次会话使用的模型 # (OpenCode 原生不支持跨会话记忆模型,见 anomalyco/opencode#10407) _opencode_last_model() { # 优先读 TUI 维护的 model.json(~/.local/state/opencode/model.json)的 recent[0] # ——包含 TUI 内 /models 切换(即使没发消息),由 opencode 自动写入 local f="$HOME/.local/state/opencode/model.json" if [[ -r "$f" ]]; then REPLY=$(python3 -c ' import json, sys try: d = json.load(open(sys.argv[1])) r = d.get("recent") or [] if r and r[0].get("providerID") and r[0].get("modelID"): print(r[0]["providerID"] + "/" + r[0]["modelID"]) except Exception: pass' "$f" 2>/dev/null) [[ -n "$REPLY" ]] && return 0 fi # 回退1:oc 选择器上次选择 f="$HOME/.config/opencode/.last-model" if [[ -r "$f" ]]; then REPLY=$(<"$f") REPLY=${REPLY%%[$'\n\r']*} [[ -n "$REPLY" ]] && return 0 fi # 回退2:最近会话实际使用的模型 local rec rec=$(sqlite3 "$HOME/.local/share/opencode/opencode.db" \ "SELECT model FROM session WHERE model IS NOT NULL AND model != '' ORDER BY time_updated DESC LIMIT 1" 2>/dev/null) || return 1 [[ -n "$rec" ]] || return 1 REPLY=$(python3 -c ' import json, sys try: d = json.loads(sys.argv[1]) if d.get("providerID") and d.get("id"): print(d["providerID"] + "/" + d["id"]) except Exception: pass' "$rec" 2>/dev/null) [[ -n "$REPLY" ]] } # 读 TUI 收藏的模型(model.json 的 favorite 字段,ctrl+f 设置) _opencode_favorites() { python3 -c ' import json, sys try: d = json.load(open(sys.argv[1])) for m in d.get("favorite") or []: if m.get("providerID") and m.get("modelID"): print(m["providerID"] + "/" + m["modelID"]) except Exception: pass' "$HOME/.local/state/opencode/model.json" 2>/dev/null } _oc_model_args() { local a for a in "$@"; do case "$a" in -m|-m=*|--model|--model=*) return 1 ;; esac done _opencode_last_model && { print -r -- "-m"; print -r -- "$REPLY"; } } # fzf 交互选模型:显示"套餐/模型名";上次使用的置顶第一行, # 其后是收藏模型(★ 前缀,来自 TUI ctrl+f),其余按套餐分组、组内模型名排序; # Esc/Ctrl-C 返回空(走自动继承);选中即 provider/model(★ 前缀自动剥离) _oc_model_picker() { command -v fzf >/dev/null || return 1 local last="$1" pick m local -a favs rest favs=("${(@f)$(_opencode_favorites)}") rest=() for m in ${(f)"$(command opencode models 2>/dev/null | sort -f -t'/' -k1,1 -k2,2)"}; do [[ "$m" == "$last" ]] && continue (( ${favs[(Ie)$m]} )) && continue rest+=("$m") done pick=$({ [[ -n "$last" ]] && print -r -- "$last" for m in $favs; do [[ "$m" != "$last" ]] && print -r -- "★ $m"; done printf '%s\n' $rest } | fzf --height=40% --layout=reverse --exact --prompt '模型> ' \ --header="回车=选择 | ★=收藏 | Esc=直接用上次: ${last:-配置默认}" 2>/dev/null) pick=${pick#"★ "} [[ "$pick" == */* ]] && print -r -- "$pick" } oc() { local -a inject=() local pick last explicit=0 a for a in "$@"; do case "$a" in -m|-m=*|--model|--model=*) explicit=1 ;; esac done if (( ! explicit )); then _opencode_last_model && last=$REPLY pick=$(_oc_model_picker "$last") if [[ -n "$pick" ]]; then # 不再写 .last-model:-m 启动后 TUI 会自动记入 model.json 的 recent inject=(-m "$pick") else inject=($(_oc_model_args "$@")) fi fi OPENCODE_DISABLE_EXTERNAL_SKILLS=1 OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1 \ command opencode --auto $inject "$@" } alias mo="mimo" alias ca="claude --dangerously-skip-permissions" alias cx="command codex -s danger-full-access" #alias codex="codex --dangerously-bypass-approvals-and-sandbox" #alias cx="codex --dangerously-bypass-approvals-and-sandbox" #alias co="codex --dangerously-bypass-approvals-and-sandbox" # command 前缀防止别名递归展开(原 ge 套娃导致 --approval-mode 传两次报错) alias gemini="command gemini --approval-mode=yolo" alias ge="gemini" alias codex-api='~/bin/codex-api' dsh() { if lsof -nP -iTCP:3080 -sTCP:LISTEN >/dev/null 2>&1; then echo "dsh: already running on 127.0.0.1:3080" return 0 fi mkdir -p ~/.dsh nohup node /Users/dyx/deepseek-harness/apps/cli/lib/bin.js web \ > ~/.dsh/dsh-web.log 2>&1 /dev/null echo "dsh: started, see ~/.dsh/dsh-web.log" } dshh() { local pids pids=$(lsof -nP -iTCP:3080 -sTCP:LISTEN -t 2>/dev/null) if [ -z "$pids" ]; then echo "dshh: no process listening on 3080" return 0 fi echo "dshh: stopping dsh (pid: $pids)" kill $pids 2>/dev/null local i=0 while [ $i -lt 30 ] && lsof -nP -iTCP:3080 -sTCP:LISTEN >/dev/null 2>&1; do i=$((i+1)); sleep 0.3 done if lsof -nP -iTCP:3080 -sTCP:LISTEN >/dev/null 2>&1; then echo "dshh: force killing (pid: $pids)" kill -9 $pids 2>/dev/null fi } alias dh='dsh' alias dhh='dshh' # --- Django --- alias cls='echo "yes" | /Users/dyx/Code/0.python-venv/mySite-django5.0-py3.12/bin/python /Users/dyx/Code/mySite/manage.py collectstatic' # --- 自动化脚本 --- alias bcp='/Users/dyx/Documents/my_scripts/backup.sh' alias clf='/Users/dyx/Documents/my_scripts/clean_ds.sh' alias mm='/Users/dyx/Documents/my_scripts/menu.sh' alias nn='/Users/dyx/Documents/my_scripts/rename_wallpapers.sh' alias reload-services='~/Documents/my_scripts/menu.sh --reload' # --- 文件搜索 --- alias se='/Users/dyx/Documents/my_scripts/search.py' alias se-turbo='/Users/dyx/Documents/my_scripts/search.py --max-size 50' alias se-fast='/Users/dyx/Documents/my_scripts/search.py --max-size 200' alias se-full='/Users/dyx/Documents/my_scripts/search.py --max-size 5000' # ========================================== # 8. Warp 适配 # ========================================== # Warp 自动注入 OSC 133 prompt 标记 + AI 补全(Cmd+I) # - 不需要 source Warp shell integration;Warp 应用进程接管 # - Launch configs 来自 ~/.warp/launch_configurations/*.yaml,无需 .zshrc 加载 # - 当前无补全插件;Warp AI 提供 # Ctrl + D 清除光标前内容 bindkey '^D' backward-kill-line # --- 工具路径与环境变量已统一归档到分区 1(环境变量)与分区 2(路径设置)--- # (原此处的 MiniMax/Deck.app/cua 安装器追加的 4 条重复 PATH export 已删除, # ~/.minimax/bin 与 ~/.local/bin 均已在分区 2 的 path 数组中,且 typeset -U 去重) # OhMyOpenAgent 按需启用:oco 追加 OMO;oc 保持轻量主配置 # 不注入模型:OMO 各 agent 的模型由 ~/.omo/omo.jsonc 官方配置决定,-m 会干扰编排 oco() { OPENCODE_DISABLE_EXTERNAL_SKILLS=1 OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1 \ OPENCODE_CONFIG="$HOME/.config/opencode/omo.json" \ command opencode --auto "$@" } # Added by MiniMax Code export PATH="/Users/dyx/.minimax/bin:$PATH"