# ========================================== # 0. 原生 zsh(停用 Oh My Zsh,保留安装以便恢复) # ========================================== # export ZSH="$HOME/.oh-my-zsh" # export ZSH_DISABLE_COMPFIX=true # 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) # source "$ZSH/oh-my-zsh.sh" # 历史记录和常用交互设置独立于 OMZ;保持原有保存条数和跨窗口共享 HISTFILE="$HOME/.zsh_history" HISTSIZE=50000 SAVEHIST=10000 setopt extended_history hist_expire_dups_first hist_ignore_dups setopt hist_ignore_space hist_verify share_history setopt auto_cd auto_pushd pushd_ignore_dups pushdminus interactive_comments # 保留 Emacs 编辑键位、Ctrl+R 搜索和按已输入前缀上下翻历史 bindkey -e autoload -Uz up-line-or-beginning-search down-line-or-beginning-search zle -N up-line-or-beginning-search zle -N down-line-or-beginning-search bindkey '^[[A' up-line-or-beginning-search bindkey '^[[B' down-line-or-beginning-search [[ -z "${terminfo[kcuu1]}" ]] || bindkey "${terminfo[kcuu1]}" up-line-or-beginning-search [[ -z "${terminfo[kcud1]}" ]] || bindkey "${terminfo[kcud1]}" down-line-or-beginning-search bindkey '^R' history-incremental-search-backward bindkey ' ' magic-space # 手写精简 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 等只认一种的工具)--- # Shadowrocket 本地 HTTP 代理端口:7890(仅在「系统代理模式」下有效;VPN 模式下 7890 是 PacketTunnel,不响应 HTTP) # 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/.kimi-code/bin $HOME/.grok/bin $HOME/.minimax-code/bin $HOME/.minimax/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 /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" $HOME/.orbstack/bin ) export PATH # ========================================== # 3. 外部集成 # ========================================== alias bearcli="/Applications/Bear.app/Contents/MacOS/bearcli" # 以下可选集成当前缺失或没有实际效果,保留入口,需要时再启用。 # [ -f "$HOME/.jetbrains.vmoptions.sh" ] && source "$HOME/.jetbrains.vmoptions.sh" # [ -f "$HOME/.local/bin/env" ] && source "$HOME/.local/bin/env" # Neovim padding 的 precmd 函数为空;当前精简提示符不再加载它。 # [ -f "$HOME/.config/nvim/zsh_padding.zsh" ] && source "$HOME/.config/nvim/zsh_padding.zsh" # ========================================== # 4. 补全系统 # ========================================== # 所有补全目录先加入 fpath;首次补全时初始化,安全检查不跳过。 typeset -U fpath fpath=("$HOME/.grok/completions/zsh" "$HOME/.docker/completions" $fpath) [[ ! -d /opt/homebrew/share/zsh/site-functions ]] || fpath=(/opt/homebrew/share/zsh/site-functions $fpath) # 非登录交互 shell 也可发现 OrbStack 补全。 [[ ! -d "$HOME/.orbstack/shell/completions/zsh" ]] || fpath+=("$HOME/.orbstack/shell/completions/zsh") ZSH_COMPDUMP="${XDG_CACHE_HOME:-$HOME/.cache}/zsh/zcompdump-native-${ZSH_VERSION}" _native_completion_init() { local requested_widget="$WIDGET" widget # 先恢复内建 widget:compinit 失败也能安全回退,不递归调用包装器。 for widget in complete-word delete-char-or-list expand-or-complete \ expand-or-complete-prefix list-choices menu-complete \ menu-expand-or-complete reverse-menu-complete; do zle -A ".$widget" "$widget" done autoload -Uz compinit if [[ -d "${ZSH_COMPDUMP:h}" ]] || command mkdir -p "${ZSH_COMPDUMP:h}"; then if compinit -d "$ZSH_COMPDUMP"; then typeset -g _native_completion_ready=1 # zoxide 比 compinit 先加载时未能注册的补全,在这里补齐。 (( ! $+functions[__zoxide_z_complete] )) || compdef __zoxide_z_complete z fi fi zle "$requested_widget" "$@" } # 重载 .zshrc 时不替换已经初始化的补全 widget。 if [[ "${_native_completion_ready:-0}" != 1 ]]; then for _native_widget in complete-word delete-char-or-list expand-or-complete \ expand-or-complete-prefix list-choices menu-complete \ menu-expand-or-complete reverse-menu-complete; do zle -N "$_native_widget" _native_completion_init done unset _native_widget fi # ========================================== # 5. 工具集成 # ========================================== if command -v zoxide > /dev/null; then # 缓存初始化代码,保留目录跟踪;升级二进制或修改 .zshrc 后自动刷新。 # 非默认生成选项不复用缓存,避免跨环境加载错误的初始化代码。 typeset _zoxide_bin="${commands[zoxide]:A}" typeset _zoxide_cache="${XDG_CACHE_HOME:-$HOME/.cache}/zsh/zoxide-init.zsh" typeset -A _zoxide_stat typeset _zoxide_identity='' _zoxide_cached_identity='' # 模块内建 stat,不启动外部进程;识别保留旧 mtime 的 bottle 升级和原地替换。 if zmodload zsh/stat && zstat -H _zoxide_stat -- "$_zoxide_bin"; then _zoxide_identity="# zoxide-init:$_zoxide_bin:${_zoxide_stat[device]}:${_zoxide_stat[inode]}:${_zoxide_stat[size]}:${_zoxide_stat[mtime]}:${_zoxide_stat[ctime]}" fi [[ ! -r "$_zoxide_cache" ]] || IFS= read -r _zoxide_cached_identity < "$_zoxide_cache" if [[ -n "$_zoxide_identity" && "$_zoxide_cached_identity" == "$_zoxide_identity" \ && -z "${_ZO_ECHO:-}${_ZO_RESOLVE_SYMLINKS:-}" \ && "$_zoxide_cache" -nt "${ZDOTDIR:-$HOME}/.zshrc" ]]; then source "$_zoxide_cache" else typeset _zoxide_init if _zoxide_init="$(command zoxide init zsh)"; then eval "$_zoxide_init" if [[ -n "$_zoxide_identity" && -z "${_ZO_ECHO:-}${_ZO_RESOLVE_SYMLINKS:-}" ]]; then # 同目录私有临时文件 + 原子替换,避免多窗口读到写了一半的缓存。 ( umask 077 command mkdir -p "${_zoxide_cache:h}" || exit _zoxide_tmp=$(command mktemp "${_zoxide_cache}.XXXXXXXX") || exit print -rl -- "$_zoxide_identity" "$_zoxide_init" > "$_zoxide_tmp" && \ command mv -f -- "$_zoxide_tmp" "$_zoxide_cache" ) fi fi unset _zoxide_init fi unset _zoxide_bin _zoxide_cache _zoxide_stat _zoxide_identity _zoxide_cached_identity alias z='__zoxide_z' alias zi='__zoxide_zi' fi # 当前未安装,按需启用;不加载额外 fzf 补全/键位插件。 # [ -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 } ssa() { if [ $# -eq 0 ]; then ssh ssa 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 --color=always --pretty=format:'%C(yellow)%h%Creset %C(green)%s%Creset' | cat" alias gll="git log --graph --all --decorate --color=always --pretty=format:'%C(yellow)%h%Creset %C(magenta)%d%Creset %C(green)%s%Creset' | cat" #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 | bat --paging=always" 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 # ——包含 TUI 内 /models 切换(即使没发消息),由 opencode 自动写入。 # 传入可用模型列表($@)时,跳过已从配置删除的模型,取第一个仍可用的 local f="$HOME/.local/state/opencode/model.json" m if [[ -r "$f" ]]; then for m in ${(f)"$(python3 -c ' import json, sys try: for r in json.load(open(sys.argv[1])).get("recent") or []: if r.get("providerID") and r.get("modelID"): print(r["providerID"] + "/" + r["modelID"]) except Exception: pass' "$f" 2>/dev/null)"}; do if (( $# == 0 || ${@[(Ie)$m]} )); then REPLY=$m return 0 fi done 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" ]] } # 把模型立即置顶到 model.json 的 recent(与 TUI /models 选择行为一致), # 使"上次模型"= 上次打开时选的模型,无需发消息 _opencode_set_recent() { python3 -c ' import json, os, sys, tempfile f, pm = sys.argv[1], sys.argv[2] p, _, m = pm.partition("/") if not (p and m): sys.exit(0) try: d = json.load(open(f)) except Exception: d = {} r = [x for x in (d.get("recent") or []) if not (x.get("providerID") == p and x.get("modelID") == m)] d["recent"] = ([{"providerID": p, "modelID": m}] + r)[:10] os.makedirs(os.path.dirname(f), exist_ok=True) fd, tmp = tempfile.mkstemp(dir=os.path.dirname(f), prefix=".model.json.") with os.fdopen(fd, "w") as o: json.dump(d, o) os.replace(tmp, f)' "$HOME/.local/state/opencode/model.json" "$1" 2>/dev/null } # 读 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 } # fzf 交互选模型:显示"套餐/模型名";上次使用的置顶第一行, # 其后是收藏模型(★ 前缀,来自 TUI ctrl+f),其余按套餐分组、组内模型名排序; # Esc/Ctrl-C 返回空(走自动继承);选中即 provider/model(★ 前缀自动剥离) # 参数:$1=上次模型,其余=可用模型列表(由 oc 统一获取,收藏中已删除的模型不显示) _oc_model_picker() { command -v fzf >/dev/null || return 1 local last="$1" pick m shift local -a avail=("$@") favs rest favs=() for m in ${(f)"$(_opencode_favorites)"}; do (( ${avail[(Ie)$m]} )) && favs+=("$m") done rest=() for m in ${(f)"$(printf '%s\n' $avail | 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" } # 所有 opencode 启动统一跳过 ~/.agents/skills 与 ~/.claude/skills 扫描(与 config 内技能重复,仅产生警告) export OPENCODE_DISABLE_EXTERNAL_SKILLS=1 export OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1 # opencode 1.19.5(2026-10-31 全量重置后全新安装):顶层 TUI 不接受 -m, # 模型经 OPENCODE_CONFIG_CONTENT 注入且必须配合 --standalone——后台 service # 常驻并缓存配置,env 注入对 service 模式无效(2026-10-31 实测确认)。 oc() { local -a args=() local model pick last while (( $# )); do case "$1" in -m|--model) model=$2; shift 2 ;; -m=*|--model=*) model=${1#*=}; shift ;; *) args+=("$1"); shift ;; esac done if [[ -z "$model" ]]; then local -a avail=(${(f)"$(command opencode models 2>/dev/null)"}) _opencode_last_model $avail && last=$REPLY pick=$(_oc_model_picker "$last" $avail) # 选中用所选;Esc 回退上次模型;都没有则走配置默认(不注入) model=${pick:-$last} fi if [[ -n "$model" ]]; then # TUI 内 /models 切换会由 opencode 自己写 recent;这里补上选择器/-m 的选择 _opencode_set_recent "$model" local cfg cfg=$(printf '{"model":"%s"}' "$model") OPENCODE_CONFIG_CONTENT="$cfg" command opencode --standalone --auto "${args[@]}" else command opencode --auto "${args[@]}" fi } alias mo="mimo" # claude相关 alias ca="claude --dangerously-skip-permissions" alias cr="claude --dangerously-skip-permissions --resume" alias car="claude --dangerously-skip-permissions --resume" alias cac="claude --dangerously-skip-permissions -c" alias cap="claude -p" # claude相关 # cx:完整权限、无沙箱、所有确认和工具审批自动通过 alias cx="command codex --dangerously-bypass-approvals-and-sandbox -c 'apps._default.default_tools_approval_mode=\"approve\"' -c apps._default.destructive_enabled=true -c apps._default.open_world_enabled=true" alias mc="mcode" alias km="kimi" alias gr="grok" #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' # --- 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 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 去重) # MiniMax / Antigravity / grok / kimi / Qwen 的 PATH 统一由分区 2 设置。 # langchain开发 #export OPENAI_BASE_URL=https://aihubmix.com/v1 #export OPENAI_API_KEY=sk-BxgRxTsLAZyLAktAB0Cc3e9bF9554cEc952cF0C8A7C840B3 # TypeSafe Jev 经 aihubmix 中转(SDK 请求 {TYPESAFE_BASE_URL}/v1/systemone) #export TYPESAFE_BASE_URL=https://aihubmix.com #export TYPESAFE_API_KEY="$OPENAI_API_KEY" # export DEEPSEEK_API_KEY=sk-535e6e6279b94d85b852c102f023738e # export LANGSMITH_TRACING=true # export LANGSMITH_ENDPOINT=https://api.smith.langchain.com # export LANGSMITH_API_KEY=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 # export LANGSMITH_PROJECT="agents" # # export ZHIPUAI_BASE_URL=https://open.bigmodel.cn/api/paas/v4 # export ZHIPUAI_API_KEY=44cc80008a1544b3999ddfdd9c132c42.Ew74dtcXMw5kkiZV # export GLM_MODEL=glm-5.3 # Qwen Code PATH block begin export PATH='/Users/dyx/.local/bin':$PATH # Qwen Code PATH block end