# ============================================================================ # DevContainer .bashrc 追加配置 # 由 Dockerfile 通过 sed 替换占位符后追加到 ~/.bashrc # ============================================================================ # 本地二进制路径(必须优先于 NVM) export PATH="$HOME/.local/bin:$PATH" # NVM 配置 export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # Node.js 镜像配置 export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node export npm_config_registry=https://registry.npmmirror.com export YARN_REGISTRY=https://registry.npmmirror.com export ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ # Python/UV 配置 export PATH="{{NODE_PATH}}:{{BIN_PATH}}:$PATH" export UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple export UV_LINK_MODE=copy export PYTHONUNBUFFERED=1 alias uv-python='uv run python' alias uv-pip='uv run pip' # 语言和区域设置 export LC_ALL=zh_CN.UTF-8 export LC_TIME=zh_CN.UTF-8 export LANG=zh_CN.UTF-8 # 其他配置 export COREPACK_ENABLE_DOWNLOAD_PROMPT=false export EDITOR=vim export VISUAL=vim export LESSCHARSET=utf-8 # Jujutsu (jj) 补全 if command -v jj >/dev/null 2>&1; then source <(jj util completion bash 2>/dev/null) fi # 别名配置 alias ll='ls -alhF --color=auto' alias date='date "+%F %T %p %A %B"' export TIME_STYLE='+%Y-%m-%d %H:%M:%S' # Python 路径 export PYTHONPATH=/workspace:$PYTHONPATH # NVM IO.js 镜像 export NVM_IOJS_ORG_MIRROR="https://iojs.org/dist" # Claude Code 启动函数(参数透传至 runcc.sh,支持 -n/--name 走 /rename 持久化) cc() { {{BIN_PATH}}/runcc.sh "$@"; } # 模型快捷方式: cc51, cc51 -n 后端, cc -n 后端 51 ... alias cc45='cc 45' alias cc45a='cc 45a' alias cc46='cc 46' alias cc47='cc 47' alias cc5='cc 5' alias cc5t='cc 5t' alias cc51='cc 51' # DeepSeek 快捷方式 alias ccds='cc -p deepseek ds' alias ccdsf='cc -p deepseek dsf' # tmux pane 级模型继承:从 pane option 读取模型配置(由 runcc.sh 写入) # 覆盖 session 级环境变量,实现同 session 不同 pane 的模型隔离 if [ -n "${TMUX:-}" ]; then _model="$(tmux show-option -pv @anthropic_model 2>/dev/null || true)" if [ -n "$_model" ]; then export ANTHROPIC_DEFAULT_HAIKU_MODEL="$_model" export ANTHROPIC_DEFAULT_SONNET_MODEL="$_model" export ANTHROPIC_DEFAULT_OPUS_MODEL="$_model" fi unset _model fi # Docker 组提示(仅在需要时显示) if [ "${DOCKER_ENABLED:-true}" = "true" ] && [ -S /var/run/docker.sock ] && ! groups | grep -q docker; then export DOCKER_GROUP_REQUIRED=1 fi # ============================================================================ # VCS 感知提示符(覆盖 devcontainer 默认,支持 jj bookmark 显示) # ============================================================================ # 在 bashrc 加载时检测 jj 仓库(只需一次,避免每次提示都调用 jj root) __JJ_REPO=0 if command -v jj >/dev/null 2>&1 && jj root >/dev/null 2>&1; then __JJ_REPO=1 fi __vcs_prompt() { local userpart='`export XIT=$? \ && [ ! -z "${GITHUB_USER:-}" ] && echo -n "\[\033[0;32m\]@${GITHUB_USER:-} " || echo -n "\[\033[0;32m\]\u " \ && [ "$XIT" -ne "0" ] && echo -n "\[\033[1;31m\]➜" || echo -n "\[\033[0m\]➜"`' local vcsbranch='`\ if [ "${__JJ_REPO:-0}" = "1" ]; then \ BRANCH=$(jj bookmark list -r @- 2>/dev/null | sed "s/[*:].*//" | head -1); \ if [ -z "${BRANCH:-}" ]; then \ BRANCH=$(jj log -r "@-" --no-graph -T "change_id.short()" 2>/dev/null); \ fi; \ if [ -n "${BRANCH:-}" ]; then \ echo -n "\[\033[0;36m\](\[\033[1;31m\]${BRANCH}\[\033[0;36m\]) "; \ fi; \ else \ BRANCH="$(git --no-optional-locks symbolic-ref --short HEAD 2>/dev/null || git --no-optional-locks rev-parse --short HEAD 2>/dev/null)"; \ if [ -n "${BRANCH:-}" ]; then \ echo -n "\[\033[0;36m\](\[\033[1;31m\]${BRANCH}\[\033[0;36m\]) "; \ fi; \ fi`' local lightblue='\[\033[1;34m\]' local removecolor='\[\033[0m\]' PS1="${userpart} ${lightblue}\w ${vcsbranch}${removecolor}\$ " } __vcs_prompt