我的日常设备与工作环境。
硬件配置
MacBook Pro
| 项目 | 配置 |
|---|---|
| 芯片 | Apple M1 Pro |
| 内存 | 32 GB统一内存 |
| 硬盘 | 1 TB SSD |
| 屏幕 | 16英寸Liquid Retina XDR 120Hz |
| 系统版本 | macOS 26 |
UTM虚拟机运行Windows 11与Arch Linux。
华硕天选6 Pro
| 项目 | 配置 |
|---|---|
| CPU | AMD Ryzen 9 8940HX(16核 / 32线程) |
| 显卡 | Radeon 610M核显 + NVIDIA GeForce RTX 5060 Laptop 8 GB |
| 内存 | 16 GB × 2 DDR5双通道 |
| 硬盘 | 1 TB三星NVMe SSD |
| 屏幕 | 16英寸2.5K 165Hz |
Windows 11 + Arch Linux双系统。
设备环境
环境
两个文件分工:~/.zprofile(33行)先加载,只管路径骨架与brew镜像;~/.zshrc(891行)是主体,管工具链与行为。当前shell共142个环境变量。两者都调用brew shellenv,zshrc在后、优先级更高。
zshrc开头自定义两个去重函数,全文所有路径追加都走它们。原因写死在注释里:裸写export PATH="$X:$PATH"不带去重,rf重载一次就多一份——实测PATH从40条涨到44条。
1 | path_add() { case ":$PATH:" in *":$1:"*) ;; *) export PATH="$1:$PATH" ;; esac } # 前置,优先级高 |
zprofile则用zsh数组一次性铺骨架,先剔掉废弃的Python 3.13路径,再typeset -U去重:
1 | eval "$(/opt/homebrew/bin/brew shellenv)"; typeset -U path PATH |
1 | [[ -r "$HOME/miniforge3/etc/profile.d/conda.sh" ]] && source "$HOME/miniforge3/etc/profile.d/conda.sh" |
工具链替代
brew版顶掉系统旧版(make 4.4、curl 8.21),TinyTeX替代6.4GB的MacTeX;交互增强由zoxide、fnm、fzf与三个插件承担:
1 | path_add "/opt/homebrew/opt/make/libexec/gnubin"; path_add "/opt/homebrew/opt/curl/bin" |
密钥(已迁Keychain,文件里无明文)
读取后再export,更新用security add-generic-password ... -U:
1 | IWENCAI_API_KEY="$(security find-generic-password -a "$USER" -s IWENCAI_API_KEY -w 2>/dev/null)"; export IWENCAI_API_KEY |
网络与镜像
vpn默认端口7897(可传参),设六项代理变量并切回官方源;unvpn全部unset并切清华源与npmmirror。两者都用_ZSH_RF抑制横幅,避免rf时刷屏:
1 | PROXY_PORT=7897 |
HF走镜像是因为huggingface.co本机直连超时,hf-mirror实测4.87 MB/s:
1 | export HF_ENDPOINT=https://hf-mirror.com |
本地化与其他
只设LANGUAGE不动LANG:tealdeer(Rust)读LANGUAGE生效,而不影响glibc程序报错语言与LC_COLLATE排序。
1 | export LANGUAGE=zh_CN:zh:en # 中文优先,无中文页回落英文 |
重载函数写成unalias + function双保险,防止老会话残留alias导致parse error:
1 | unalias rf 2>/dev/null |
工具
-
使用
uv统一管理3.9到3.14的多个Python版本,方便在不同项目、兼容性测试和版本切换之间快速调整,不用再去配pyenv或系统自带Python。- 主力开发环境固定使用uv管理的
Python 3.14,日常开发、调试和运行都基于这个版本,保证主环境干净、可复现。 - 其他3.9到3.13的版本主要用来做兼容性验证和CI矩阵测试,确保代码在较旧版本上也能正常工作。
- 版本约束可以通过pyproject.toml里的requires-python配合uv python pin来固定,依赖则用uv.lock锁定,整体环境更稳定、可追踪。
- 全局
homebrew安装的Python仅用于执行全局脚本。
- 主力开发环境固定使用uv管理的
-
连续两次
path_add,后加的那条排最前、优先级最高。注意3.14的libexec只给python/pip/wheel,没有python3——它由/opt/homebrew/bin/python3提供,同为3.14.7。
1 | path_add "$HOME/Library/Python/3.14/bin" |
pip/pip3被写成同名函数拦截(函数优先级高于PATH,覆盖所有环境的pip),只提示用uv并返回127;临时绕过要command pip:
1 | pip() { print -u2 "请使用uv构建"; return 127; } |
conda只在脚本存在时source,不自动激活base:
-
使用
fnm统一控制node版本。已经下载了node16-26,并把node26设为默认版本,日常默认直接使用node 26,需要时再按项目切换到其他版本。- 全局
Homebrew不安装node,避免版本在PATH上冲突 - Node相关环境尽量都交给fnm,保证版本干净、可控,也方便后续按项目灵活切换不同Node版本。
- 使用更快的
pnpm安装而不是传统的npm。
- 全局
-
使用
uvr作为R的版本控制工具。- 通过
uvr集中安装、切换和锁定不同的R版本,按项目或全局需求指定要使用的版本,确保开发、测试和部署时都基于一致的R环境。
- 通过
-
使用
RStudio编写R代码。 -
使用新型的、用
Rust写的新式命令或工具,替代那些传统的Unix命令。- 用
fd替代find,用procs替代ps,用btop和btm替代top和htop来监控系统资源,用eza替代ls,以及用zellij替代tmux来做终端复用,等等。 - 这类工具通常启动快、性能好、跨平台,默认就带彩色高亮和更友好的输出,配置也更简单,日常开发和运维时能明显提升终端里的效率与体验。
- 用
-
想用Docker来做一些必要的操作,比如搭建环境、部署服务,或者跑一些临时工具,可我对Docker其实完全不算会,连基本命令和镜像、容器之间的关系都还没弄明白。
- 就干脆凭感觉胡乱下载了一堆镜像,想着先囤着再说,之后大概率总会有派上用场的时候;就算现在暂时用不到,以后真遇到需要时,至少也能少一点临时下载。
1 | macbook ~ % docker images |