经过多年的调整和优化,我最终确定了一套既能最大程度提升效率又能提升乐趣的开发配置。以下是我在 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:

Terminal window
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=true
sdk install java 25.0.2-graal
sdk install java 17.0.12-graal
sdk install java 8.0.482-zulu
sdk 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 命令

Terminal window
# 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 --here
EOF
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 → push
function 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:

Terminal window
# 安装 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)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

使用 Brewfile 管理软件包:

# Brewfile — brew bundle install(https://docs.brew.sh/Manpage#bundle-subcommand)
# --- Taps ---
tap "farion1231/ccswitch" # cc-switch
tap "sdkman/tap" # SDKMAN(Java/Maven 等)
tap "tw93/tap" # Kaku
# --- 开发工具 ---
brew "gh" # GitHub CLI
brew "go-task" # Taskfile(若已只用 just,可删本行)
brew "fnm" # Node 版本管理
brew "uv" # Python 包/环境
brew "pandoc" # 文档转换
# --- 命令行(搜索、列表、编辑)---
brew "bash" # 较新 bash
brew "bat" # 带高亮的 cat
brew "eza" # ls
brew "fd" # find
brew "fzf" # 模糊查找
brew "git-delta" # diff 高亮
brew "gnupg" # GPG
brew "jq" # JSON
brew "just" # 命令 runner(可与 go-task 并存)
brew "ripgrep" # rg 搜索
brew "sd" # sed 替代
brew "watchexec" # 文件变更重跑命令
brew "wget" # 下载
brew "yq" # YAML
brew "chezmoi" # 管理 dotfiles
# --- 命令行(数据、HTTP)---
brew "duckdb" # 分析数据库 CLI
brew "xh" # HTTP 客户端(与 httpie 同类,二选一即可)
# --- 命令行(语言与包管理)---
brew "node" # Node
brew "python@3.14" # Python 3.14
brew "pipx" # 隔离安装 Python CLI
brew "pnpm" # Node 包管理器
brew "sdkman-cli" # sdk install java / maven
brew "aliyunpan" # 阿里云盘 CLI
# --- 图形界面(cask)---
cask "1password" # 密码管理
cask "ayugram" # Telegram 客户端
cask "baidunetdisk" # 百度网盘
cask "claude-code" # Anthropic Claude Code
cask "codex" # OpenAI Codex(以实际 formula 为准)
cask "codex-app" # Codex 桌面端
cask "cursor" # Cursor 编辑器
cask "feishu" # 飞书
cask "google-chrome" # Chrome 浏览器
cask "insomnia" # API 调试
cask "intellij-idea" # IntelliJ IDEA
cask "orbstack" # 容器/轻量虚拟机
cask "switchhosts" # Hosts 切换
cask "typora" # Markdown 编辑器
cask "wechat" # 微信
cask "wetype" # 微信输入法
cask "tw93/tap/kakuku" # Kaku 终端
cask "farion1231/ccswitch/cc-switch" # 代理环境切换(cc-switch)

批量安装:

Terminal window
# 安装所有软件包
brew bundle install
# 更新所有软件包
brew update && brew upgrade && brew cleanup

SDKMAN - Java 生态工具管理

环境配置

SSH 配置

生成和配置 SSH 密钥:

Terminal window
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 ""
fi
eval "$(ssh-agent -s)"
ssh-add "$ssh_key_path" 2>/dev/null || true

SSH 配置文件 ~/.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

备份策略

多层备份方案

  1. 代码和配置

    • Git 仓库托管在 GitHub/GitLab
    • dotfiles 仓库管理配置文件
    • 定期推送到远程仓库
  2. 文档和项目文件

    • iCloud Drive 实时同步
    • Time Machine 本地备份
    • 重要文件额外备份到外部存储
  3. 系统备份

    • Time Machine 每小时自动备份
    • 每月创建系统快照
    • 重要软件列表(Brewfile)版本控制
  4. 数据库和配置

    • 数据库定期导出
    • 应用配置文件备份
    • SSH 密钥和证书安全存储

性能优化

macOS 系统优化

基础性能调整

Terminal window
# 设置计算机名称
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 1
defaults write NSGlobalDomain InitialKeyRepeat -int 10
# 显示滚动条
defaults write NSGlobalDomain AppleShowScrollBars -string "WhenScrolling"
# 禁用不必要的动画
defaults write com.apple.dock launchanim -bool false
defaults write NSGlobalDomain NSAutomaticWindowAnimationsEnabled -bool false
defaults 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 Dock
killall Finder

Finder 优化

Terminal window
# 显示隐藏文件
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 true
defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true

开发环境优化

Node.js 性能优化

Terminal window
# 增加内存限制
export NODE_OPTIONS="--max-old-space-size=8192"
# 启用 V8 优化
export NODE_OPTIONS="$NODE_OPTIONS --optimize-for-size"

Java 性能优化

Terminal window
# JVM 参数优化
export JAVA_OPTS="-Xms1g -Xmx1g -XX:+UseG1GC -XX:+UseStringDeduplication"
# Maven 性能优化
export MAVEN_OPTS="-Xms1g -Xmx4g -XX:+TieredCompilation -XX:TieredStopAtLevel=1"

文件监控限制调整

Terminal window
# 增加文件监控限制(适用于大型项目)
echo kern.maxfiles=65536 | sudo tee -a /etc/sysctl.conf
echo kern.maxfilesperproc=65536 | sudo tee -a /etc/sysctl.conf

结论

记住:最好的开发设置是那些让你忘记工具存在,专注于创造价值的设置