经过多年的调整和优化,我最终确定了一套既能最大程度提升效率又能提升乐趣的开发配置。以下是我在 2025 年会使用的配置,希望能为其他开发者提供一些参考。
注:本文写于 2025-08,文中的软件清单和配置片段已按我在 2026-03 当前这台 Mac 上的实际安装状态更新。
硬件
主机
MacBook Pro 13 英寸 (M1, 2020)
- 16GB 统一内存
- 256GB SSD 存储
- 8 核 CPU,8 核 GPU
软件堆栈
终端与 Shell
终端:Kaku
代码编辑器
主要编辑器:IntelliJ IDEA Ultimate
必备插件:
- .ignore - Git 忽略文件管理
- Rainbow Brackets - 彩色括号匹配,提高代码可读性
- String Manipulation - 字符串处理工具集
- Lombok - Java 代码简化
- Atom Material Icons - 主题
- Mermaid - Mermaid 图
常用快捷键:
- 格式化代码:
⌥ + ⌘ + L - 组织导入:
⌃ + ⌥ + O - 移动代码:
⌃ + ⌘ + ↑/↓ - 展开/折叠方法:
⌘ + +/- - 扩展选择:
⌥ + ↑ - 缩小选择:
⌥ + ↓ - 提取到变量:
⌘ + ⌥ + V - 提取到方法:
⌘ + ⌥ + M - 文件结构:
⌘ + F12 - 最近文件:
⌘ + E - 全局搜索:
⌘ + ⇧ + F
备用工具:
- Cursor - 通用编辑器,插件生态丰富
- Claude Code / Codex CLI - 更适合快速验证想法、处理脚本和重复性修改
浏览器与扩展
主浏览器:Google Chrome
必备扩展:
- 1Password - 密码管理,安全便捷
- JSON Viewer - JSON 格式化和高亮
版本控制
Git 配置
我使用条件配置来区分个人和工作项目:
.gitconfig:
[core] editor = vim pager = cat autocrlf = true eol = lf safecrlf = false untrackedCache = true excludesfile = ~/.gitignore_global
[alias] st = status a = add di = diff co = checkout ci = commit cl = clone cp = cherry-pick br = branch pl = pull last = log -1 HEAD unstage = reset HEAD -- lo = log --oneline lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
[rebase] autosquash = true[init] defaultBranch = main[pull] ff = only[rerere] enabled = true[http] postBuffer = 5242880000[http "https://github.com"] proxy = socks5://127.0.0.1:7890[https "https://github.com"] proxy = socks5://127.0.0.1:7890[credential] helper = osxkeychain
# 条件配置:根据目录自动切换用户信息[user] name = chensoul email = ichensoul@gmail.com[includeIf "gitdir:~/work/"] path = ~/.gitconfig_work[safe] directory = *.gitconfig_work:
[user] name = chensoul email = work@company.com云存储与同步
主要云盘:
- 阿里云盘 - 大文件存储,速度快
- 百度云盘 - 大文件存储,速度快
- iCloud Drive - 系统集成度高,文档同步
- GitHub - 代码和配置文件版本控制
开发工具
语言和运行时
Node、Python
通过 brew 安装
Java 开发环境
使用 Homebrew 安装的 SDKMAN 管理 Java 和 Maven:
export SDKMAN_DIR="${_sdkman_prefix}/libexec"# shellcheck disable=SC1091[[ -s "${SDKMAN_DIR}/bin/sdkman-init.sh" ]] && source "${SDKMAN_DIR}/bin/sdkman-init.sh"export SDKMAN_AUTO_ANSWER=truesdk install java 25.0.2-graalsdk install java 17.0.12-graalsdk install java 8.0.482-zulusdk install maven容器与编排
OrbStack - Docker Desktop 的现代替代品
数据库工具
TablePlus - 现代数据库客户端,支持 MySQL、Postgres、Redis 等。
API 开发与测试
Insomnia - REST/GraphQL 客户端
xh - 现代命令行 HTTP 客户端,它是 httpie 的现代化替代品,输出更结构化,更适合 AI 解
现代 CLI 工具
理念:让 AI 发挥更大作用的关键不是更好的 prompt,而是更好的 PATH。
文件搜索与导航
fd-find的现代替代品,速度更快,语法更简单ripgrep (rg)- 快速代码搜索,AI 搜索代码模式更高效fzf- 模糊搜索,AI 可建议历史命令/文件
输出增强
bat-cat的替代品,带语法高亮和 Git 集成git-delta- Git diff 可视化,AI 理解代码变更更直观eza-ls的现代版,支持图标和树状视图
数据处理
jq- JSON 处理,AI 解析 JSON API 输出yq- YAML 处理(jq 的 YAML 版),AI 处理 Kubernetes/配置文件duckdb- 嵌入式 SQL 数据库,AI 用 SQL 分析数据,无需写 Python
代码质量
semgrep- 静态代码分析,AI 辅助代码审查,查找漏洞
自动化
just- 现代make,AI 管理项目命令更简洁watchexec- 文件变化自动执行,AI 监控文件变化自动构建
文本处理
sd- 交互式sed,AI 批量替换更安全
安全与隐私工具
1Password - 密码管理器
SwitchHosts - Hosts 文件管理
生产力工具
笔记记录与文档
Typora - Markdown 编辑器
Apple Notes - 快速记录
GitHub/GitLab - 代码文档
常用 Alias 命令
# GPG 签名(终端与 Git 共用)export GPG_TTY=$(tty)
# -----------------------------------------------------------------------------# Shell 基础# -----------------------------------------------------------------------------alias c='clear'alias h='history'alias reload='source ~/.zshrc'alias path='echo -e ${PATH//:/\\n}'
# -----------------------------------------------------------------------------# 列表与导航(依赖 eza)# -----------------------------------------------------------------------------alias ls='eza'alias ll='eza -la --icons'alias la='eza -A --icons'alias l='eza -CF'alias lh='eza -lah --icons'alias lt='eza --tree -L 2'alias lsize='eza -laSh --icons'
alias .='pwd'alias ..='cd ..'alias ...='cd ../..'alias ....='cd ../../..'alias ~='cd ~'alias dl='cd ~/Downloads'alias dt='cd ~/Desktop'
# -----------------------------------------------------------------------------# 搜索与阅读(与 Brewfile 中 fd / ripgrep / bat 对应)# -----------------------------------------------------------------------------alias f='fd'alias r='rg'alias cat='bat --style=plain'
# -----------------------------------------------------------------------------# 维护:清理构建产物 / 系统与 Homebrew 更新# -----------------------------------------------------------------------------# cleanup:删除当前目录下常见构建/依赖目录与 .DS_Store、*.log(含 venv/.venv/Pods;不进入 .git/.hg/.svn)function cleanup() { local dry_run=false case "${1:-}" in -h | --help) cat <<'EOF'cleanup — 清理当前目录下常见构建产物与缓存用法: cleanup [-n|--dry-run] -n, --dry-run 只列出将删除的路径,不执行删除 -h, --help 显示此说明会删除的目录名(匹配即整目录删除): node_modules, target, build, dist, out, .next, __pycache__, .pytest_cache, .mypy_cache, .gradle, .turbo, coverage, .nuxt, venv, .venv, Pods(Python 虚拟环境与 CocoaPods 依赖,可重建)会删除的文件: .DS_Store, *.log始终在仓库根或项目根执行;不会进入 .git / .hg / .svn。EOF return 0 ;; -n | --dry-run) dry_run=true ;; "") ;; *) echo "cleanup: 未知参数: $1(使用 cleanup -h 查看帮助)" >&2 return 1 ;; esac
if [[ "$(pwd -P)" == "/" ]]; then echo "cleanup: 拒绝在文件系统根目录 / 下执行" >&2 return 1 fi
if $dry_run; then echo "cleanup: dry-run(不会删除):" find . \( -name .git -o -name .hg -o -name .svn \) -prune -o \ \( -type d \( \ -name node_modules -o -name target -o -name build -o -name dist -o -name out -o \ -name .next -o -name __pycache__ -o -name .pytest_cache -o -name .mypy_cache -o \ -name .gradle -o -name .turbo -o -name coverage -o -name .nuxt -o \ -name venv -o -name .venv -o -name Pods \ \) \) -print 2>/dev/null find . \( -name .git -o -name .hg -o -name .svn \) -prune -o \ \( -type f \( -name .DS_Store -o -name '*.log' \) \) -print 2>/dev/null return 0 fi
find . \( -name .git -o -name .hg -o -name .svn \) -prune -o \ \( -type d \( \ -name node_modules -o -name target -o -name build -o -name dist -o -name out -o \ -name .next -o -name __pycache__ -o -name .pytest_cache -o -name .mypy_cache -o \ -name .gradle -o -name .turbo -o -name coverage -o -name .nuxt -o \ -name venv -o -name .venv -o -name Pods \ \) \) -exec rm -rf {} + 2>/dev/null || true
find . \( -name .git -o -name .hg -o -name .svn \) -prune -o \ \( -type f \( -name .DS_Store -o -name '*.log' \) \) -delete 2>/dev/null || true}
alias update='sudo softwareupdate -i -a; brew update; brew upgrade; brew cleanup'
# -----------------------------------------------------------------------------# Git(仅 shell:分支名、批量操作;其余用 git st / git a / git lo 等)# -----------------------------------------------------------------------------# pullcode / pushcode 默认在 $HOME/github、$HOME/work 下扫描一级子目录;# 需要只处理当前目录时: pullcode . 或 pullcode --here ; pushcode --here "<说明>"# -----------------------------------------------------------------------------
alias git_current_branch="git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||'"alias gg='git push origin "$(git_current_branch)"'
function pullcode() { case "${1:-}" in -h | --help) cat <<'EOF'pullcode — 在 ~/github、~/work 下对每个一级子目录执行 git pull用法: pullcode 扫描 $HOME/github 与 $HOME/work pullcode . 只扫描当前目录下的一级子目录(同 --here) pullcode --hereEOF return 0 ;; esac
local roots root dir name if [[ "${1:-}" == "." || "${1:-}" == "--here" ]]; then roots=("$(pwd -P)") else roots=("$HOME/github" "$HOME/work") fi
for root in "${roots[@]}"; do if [[ ! -d "$root" ]]; then echo "pullcode: 跳过(目录不存在): $root" >&2 continue fi echo "━━ $(basename "$root") ($root) ━━" while IFS= read -r -d '' dir; do [[ -d "${dir}/.git" ]] || continue name="${dir##*/}" echo "📁 ${name}" (cd "$dir" && git pull) || echo " pull 失败: ${name}" >&2 done < <(find "$root" -maxdepth 1 -mindepth 1 -type d -print0 2>/dev/null) done}
# 对 $HOME/github、$HOME/work 下各一级子目录中的 Git 仓库:add → commit → pushfunction pushcode() { case "${1:-}" in -h | --help) cat <<'EOF'pushcode — 批量提交并推送 ~/github、~/work 下各子目录中的 Git 仓库用法: pushcode <提交说明> 扫描 ~/github 与 ~/work pushcode --here <提交说明> 只扫描当前目录下的一级子目录 pushcode -h 显示此说明对每个仓库: git add -A →(有变更则)commit → push origin <当前分支>无变更则跳过;detached HEAD 时不 push。EOF return 0 ;; esac
local roots use_here=false msg if [[ "${1:-}" == "--here" ]]; then use_here=true shift fi msg="${1:-}"
if [[ -z "$msg" ]]; then echo "pushcode: 需要提交说明,例如: pushcode \"chore: sync\"" >&2 echo " 或: pushcode --here \"说明\"(仅当前目录)│ pushcode -h" >&2 return 1 fi
if $use_here; then roots=("$(pwd -P)") else roots=("$HOME/github" "$HOME/work") fi
local top dir name branch for top in "${roots[@]}"; do if [[ ! -d "$top" ]]; then echo "pushcode: 跳过(目录不存在): $top" >&2 continue fi echo "━━ $(basename "$top") ($top) ━━"
while IFS= read -r -d '' dir; do [[ -d "${dir}/.git" ]] || continue name="${dir##*/}" echo "📁 ${name}" pushd "$dir" >/dev/null || continue
git add -A if git diff --cached --quiet && git diff --quiet; then echo " (无变更,跳过)" popd >/dev/null || true continue fi
if ! git commit -m "$msg"; then echo " commit 失败: ${name}" >&2 popd >/dev/null || true continue fi
branch=$(git symbolic-ref -q HEAD 2>/dev/null | sed -e 's|^refs/heads/||') if [[ -z "$branch" ]]; then echo " 非分支 HEAD,跳过 push: ${name}" >&2 popd >/dev/null || true continue fi
if ! git push origin "$branch"; then echo " push 失败: ${name}" >&2 fi popd >/dev/null || true done < <(find "$top" -maxdepth 1 -mindepth 1 -type d -print0 2>/dev/null) done}
# -----------------------------------------------------------------------------# 语言与工具# -----------------------------------------------------------------------------alias typora="open -a typora"alias venv='python3 -m venv'alias activate='source venv/bin/activate'alias http='xh'
# -----------------------------------------------------------------------------# 通用函数# -----------------------------------------------------------------------------function mkd() { mkdir -p "$@" && cd "$_"}
function killport() { if [[ -z "$1" ]]; then echo "Usage: killport <port_number>" return 1 fi
local pid pid=$(lsof -ti tcp:"$1") if [[ -n "$pid" ]]; then echo "Killing process $pid on port $1" kill -9 "$pid" else echo "No process found on port $1" fi}
function findf() { fd "$1" "${2:-.}"}
function search() { rg --hidden "$1" "${2:-.}"}
function sysinfo() { echo "OS: $(sw_vers -productName) $(sw_vers -productVersion)" echo "Kernel: $(uname -r)" echo "Uptime: $(uptime | awk '{print $3,$4}' | sed 's/,//')" echo "Memory: $(vm_stat | grep "Pages free" | awk '{print $3}' | sed 's/\.//')KB free" echo "Disk: $(df -h / | awk 'NR==2{print $4}') available" echo "CPU: $(sysctl -n machdep.cpu.brand_string)"}
function genpass() { local length="${1:-16}" openssl rand -base64 "$length" | tr -d "=+/" | cut -c1-"$length"}
# -----------------------------------------------------------------------------# IDE(危险操作:卸载 IDEA 并清理 JetBrains 配置,慎用)# -----------------------------------------------------------------------------function clean_idea() { echo "🧹 Cleaning IntelliJ IDEA..."
rm -rf "/Applications/IntelliJ IDEA.app" rm -rf ~/Library/Application\ Support/JetBrains/ rm -rf ~/Library/Preferences/com.apple.java.util.prefs.plist rm -rf ~/Library/Preferences/com.jetbrains* rm -rf ~/Library/Preferences/jetbrains* rm -rf ~/Library/Caches/JetBrains rm -rf ~/Library/Logs/JetBrains/ rm -rf ~/Library/Saved\ Application\ State/com.jetbrains.intellij.savedState/ rm -rf ~/.cache/JetBrains/ rm -rf ~/.config/JetBrains/
killall cfprefsd 2>/dev/null || true
echo "✅ IntelliJ IDEA cleaned successfully"}软件管理
Homebrew - macOS 包管理器
安装 Homebrew:
# 安装 Homebrew/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 配置环境变量(Apple Silicon Mac)echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofileeval "$(/opt/homebrew/bin/brew shellenv)"使用 Brewfile 管理软件包:
# Brewfile — brew bundle install(https://docs.brew.sh/Manpage#bundle-subcommand)
# --- Taps ---tap "farion1231/ccswitch" # cc-switchtap "sdkman/tap" # SDKMAN(Java/Maven 等)tap "tw93/tap" # Kaku
# --- 开发工具 ---brew "gh" # GitHub CLIbrew "go-task" # Taskfile(若已只用 just,可删本行)brew "fnm" # Node 版本管理brew "uv" # Python 包/环境brew "pandoc" # 文档转换
# --- 命令行(搜索、列表、编辑)---brew "bash" # 较新 bashbrew "bat" # 带高亮的 catbrew "eza" # lsbrew "fd" # findbrew "fzf" # 模糊查找brew "git-delta" # diff 高亮brew "gnupg" # GPGbrew "jq" # JSONbrew "just" # 命令 runner(可与 go-task 并存)brew "ripgrep" # rg 搜索brew "sd" # sed 替代brew "watchexec" # 文件变更重跑命令brew "wget" # 下载brew "yq" # YAML
brew "chezmoi" # 管理 dotfiles
# --- 命令行(数据、HTTP)---brew "duckdb" # 分析数据库 CLIbrew "xh" # HTTP 客户端(与 httpie 同类,二选一即可)
# --- 命令行(语言与包管理)---brew "node" # Nodebrew "python@3.14" # Python 3.14brew "pipx" # 隔离安装 Python CLIbrew "pnpm" # Node 包管理器brew "sdkman-cli" # sdk install java / mavenbrew "aliyunpan" # 阿里云盘 CLI
# --- 图形界面(cask)---cask "1password" # 密码管理cask "ayugram" # Telegram 客户端cask "baidunetdisk" # 百度网盘cask "claude-code" # Anthropic Claude Codecask "codex" # OpenAI Codex(以实际 formula 为准)cask "codex-app" # Codex 桌面端cask "cursor" # Cursor 编辑器cask "feishu" # 飞书cask "google-chrome" # Chrome 浏览器cask "insomnia" # API 调试cask "intellij-idea" # IntelliJ IDEAcask "orbstack" # 容器/轻量虚拟机cask "switchhosts" # Hosts 切换cask "typora" # Markdown 编辑器cask "wechat" # 微信cask "wetype" # 微信输入法cask "tw93/tap/kakuku" # Kaku 终端cask "farion1231/ccswitch/cc-switch" # 代理环境切换(cc-switch)批量安装:
# 安装所有软件包brew bundle install
# 更新所有软件包brew update && brew upgrade && brew cleanupSDKMAN - Java 生态工具管理
环境配置
SSH 配置
生成和配置 SSH 密钥:
ssh_key_path="$HOME/.ssh/id_ed25519"mkdir -p "$HOME/.ssh"chmod 700 "$HOME/.ssh"if [[ ! -f "$ssh_key_path" ]]; then ssh-keygen -t ed25519 -C "$(whoami)@$(hostname)" -f "$ssh_key_path" -N ""fieval "$(ssh-agent -s)"ssh-add "$ssh_key_path" 2>/dev/null || trueSSH 配置文件 ~/.ssh/config:
Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519 UseKeychain yes AddKeysToAgent yes
Host gitlab.com HostName gitlab.com User git IdentityFile ~/.ssh/id_ed25519 UseKeychain yes AddKeysToAgent yes备份策略
多层备份方案:
代码和配置:
- Git 仓库托管在 GitHub/GitLab
- dotfiles 仓库管理配置文件
- 定期推送到远程仓库
文档和项目文件:
- iCloud Drive 实时同步
- Time Machine 本地备份
- 重要文件额外备份到外部存储
系统备份:
- Time Machine 每小时自动备份
- 每月创建系统快照
- 重要软件列表(Brewfile)版本控制
数据库和配置:
- 数据库定期导出
- 应用配置文件备份
- SSH 密钥和证书安全存储
性能优化
macOS 系统优化
基础性能调整:
# 设置计算机名称sudo scutil --set ComputerName "chensoul-mac"sudo scutil --set HostName "chensoul-mac"sudo scutil --set LocalHostName "chensoul-mac"
# 设置时区sudo systemsetup -settimezone "Asia/Shanghai"
# 取消 4 位数密码限制sudo pwpolicy -clearaccountpolicies
# 允许安装任意来源的应用sudo spctl --master-disable
# 加快键盘重复速度defaults write NSGlobalDomain KeyRepeat -int 1defaults write NSGlobalDomain InitialKeyRepeat -int 10
# 显示滚动条defaults write NSGlobalDomain AppleShowScrollBars -string "WhenScrolling"
# 禁用不必要的动画defaults write com.apple.dock launchanim -bool falsedefaults write NSGlobalDomain NSAutomaticWindowAnimationsEnabled -bool falsedefaults write com.apple.dock expose-animation-duration -float 0.1
# 加快 Mission Control 动画defaults write com.apple.dock expose-animation-duration -float 0.1
# 禁用窗口缩放动画defaults write NSGlobalDomain NSAutomaticWindowAnimationsEnabled -bool false
# 加快对话框显示速度defaults write NSGlobalDomain NSWindowResizeTime -float 0.001
# 重启相关服务killall Dockkillall FinderFinder 优化:
# 显示隐藏文件defaults write com.apple.finder AppleShowAllFiles -bool true
# 显示文件扩展名defaults write NSGlobalDomain AppleShowAllExtensions -bool true
# 显示路径栏defaults write com.apple.finder ShowPathbar -bool true
# 显示状态栏defaults write com.apple.finder ShowStatusBar -bool true
# 默认搜索当前文件夹defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"
# 禁用创建 .DS_Store 文件defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool truedefaults write com.apple.desktopservices DSDontWriteUSBStores -bool true开发环境优化
Node.js 性能优化:
# 增加内存限制export NODE_OPTIONS="--max-old-space-size=8192"
# 启用 V8 优化export NODE_OPTIONS="$NODE_OPTIONS --optimize-for-size"Java 性能优化:
# JVM 参数优化export JAVA_OPTS="-Xms1g -Xmx1g -XX:+UseG1GC -XX:+UseStringDeduplication"
# Maven 性能优化export MAVEN_OPTS="-Xms1g -Xmx4g -XX:+TieredCompilation -XX:TieredStopAtLevel=1"文件监控限制调整:
# 增加文件监控限制(适用于大型项目)echo kern.maxfiles=65536 | sudo tee -a /etc/sysctl.confecho kern.maxfilesperproc=65536 | sudo tee -a /etc/sysctl.conf结论
记住:最好的开发设置是那些让你忘记工具存在,专注于创造价值的设置。