Lylove Blog
返回首页

文章

macOS 终端优化实战:用 Oh My Zsh、fzf、zoxide 搭一套顺手的命令行环境

记录一次在 macOS 上用 Oh My Zsh、fzf、zoxide、eza、bat、fd 和 tmux 优化终端环境的过程,兼顾可读性、易用性与维护成本。


title: macOS 终端优化实战:用 Oh My Zsh、fzf、zoxide 搭一套顺手的命令行环境 description: 记录一次在 macOS 上用 Oh My Zsh、fzf、zoxide、eza、bat、fd 和 tmux 优化终端环境的过程,兼顾可读性、易用性与维护成本。 pubDate: 2026-05-02 tags:

  • macOS
  • Terminal
  • Zsh
  • Oh My Zsh
  • CLI
  • Homebrew

在 macOS 上把开发环境装齐之后,终端通常还是停留在“能用”的状态:能敲命令,但不好找历史、不方便跳目录、列表展示一般、跨窗口工作也不顺手。

这篇文章记录一套偏实用的终端优化方案:不用引入太重的主题体系,也不追求花哨效果,而是用 oh-my-zsh 加上一组高频工具,把日常命令行体验提升到一个比较顺手的状态。

目标

这次优化有几个约束:

  • 保留现有的代理和镜像配置
  • 不重构原有环境变量组织方式
  • 选择维护成本低的方案
  • 优先提升目录跳转、模糊搜索、文件列表、历史补全和多窗口能力

基于这些约束,最终采用的是:

  • oh-my-zsh:提供 shell 框架和常用插件
  • fzf:模糊搜索与历史检索
  • zoxide:更聪明的目录跳转
  • eza:替代 ls
  • bat:替代 cat
  • fd:替代 find 的常见场景
  • tmux:终端多窗口与多面板管理
  • zsh-autosuggestions:命令建议
  • zsh-syntax-highlighting:语法高亮

为什么不用更重的主题方案

终端美化常见有两条路线:

  1. oh-my-zsh 内置主题,简单直接
  2. 再叠加 starship、Powerline 字体、更多外部主题

如果目标是“先把终端变顺手”,第一条路线通常更稳。

原因很简单:

  • 配置项少,出问题更容易排查
  • 不依赖额外提示符框架
  • 在多台机器间迁移成本更低
  • 先把效率工具接起来,比先折腾主题收益更高

所以这次主题直接使用 oh-my-zsh 内置的 robbyrussell,不额外引入 starship

安装命令

如果已经装好了 Homebrew,可以直接安装这些工具:

bash
env HOMEBREW_NO_AUTO_UPDATE=1 \
  brew install \
  fzf \
  zoxide \
  eza \
  bat \
  fd \
  tmux \
  zsh-autosuggestions \
  zsh-syntax-highlighting

然后安装 oh-my-zsh

bash
env RUNZSH=no CHSH=no KEEP_ZSHRC=yes \
  sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

这里有两个小点值得注意:

  • KEEP_ZSHRC=yes 可以避免安装脚本覆盖已有 ~/.zshrc
  • RUNZSH=noCHSH=no 可以让安装过程更可控,适合在已有环境上增量配置

一份够用的 ~/.zshrc

下面是一份偏实用的配置思路。

zsh
export PATH="$HOME/bin:$PATH"

export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="robbyrussell"
plugins=(
  git
  sudo
  extract
  colored-man-pages
  copypath
  copyfile
)

if [[ -o interactive ]] && [ -d "$ZSH" ]; then
  source "$ZSH/oh-my-zsh.sh"
fi

HISTFILE="$HOME/.zsh_history"
HISTSIZE=10000
SAVEHIST=10000
setopt HIST_IGNORE_DUPS
setopt HIST_IGNORE_SPACE
setopt SHARE_HISTORY
setopt AUTO_CD
setopt INTERACTIVE_COMMENTS

autoload -Uz compinit
compinit
zstyle ':completion:*' menu select
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

if [[ -o interactive ]] && [ -f /usr/local/opt/fzf/shell/completion.zsh ]; then
  source /usr/local/opt/fzf/shell/completion.zsh
fi

if [[ -o interactive ]] && [ -f /usr/local/opt/fzf/shell/key-bindings.zsh ]; then
  source /usr/local/opt/fzf/shell/key-bindings.zsh
fi

if command -v zoxide >/dev/null 2>&1; then
  eval "$(zoxide init zsh)"
fi

if [[ -o interactive ]] && [ -f /usr/local/share/zsh-autosuggestions/zsh-autosuggestions.zsh ]; then
  source /usr/local/share/zsh-autosuggestions/zsh-autosuggestions.zsh
fi

if [[ -o interactive ]] && [ -f /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ]; then
  source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
fi

alias ls='eza --group-directories-first'
alias ll='eza -lah --group-directories-first --git'
alias la='eza -la --group-directories-first'
alias lt='eza --tree --level=2 --icons=auto'
alias cat='bat --paging=never --style=plain'
alias findf='fd'
alias grep='rg'
alias c='clear'
alias t='tmux'

这份配置解决了什么问题

1. 目录切换更快

有了 zoxide 之后,不需要每次都从当前目录一级一级 cd

只要平时正常进入目录,zoxide 会记录访问频率,之后可以直接:

bash
z 项目名关键字

这比手工敲长路径更省时间,尤其是在多个仓库之间来回切换时很明显。

2. 文件列表可读性更好

eza 比原生 ls 更适合日常开发:

  • 默认更清晰
  • 可以按目录优先显示
  • ll 可以顺手看到 Git 状态
  • lt 可以快速看两层目录树

例如:

bash
ll
lt

3. 查看文件内容更舒服

cat 别名到 bat 之后,查看配置文件、代码片段时会更舒服,尤其是有语法高亮的场景。

如果只是想纯输出文本,可以继续直接调用 command cat

4. 模糊搜索和命令建议更顺手

fzfzsh-autosuggestionszsh-syntax-highlighting 组合起来之后,终端的反馈会好很多:

  • 历史命令更容易找回
  • 输入时能看到灰色建议
  • 命令拼写和参数结构更容易被肉眼识别

对于高频命令行用户,这类体验提升是持续性的。

tmux 的基础配置

如果经常同时开多个项目、日志窗口、编辑器窗口,tmux 还是很值得加上的。

一份轻量配置就够:

tmux
set -g mouse on
set -g history-limit 100000
set -g base-index 1
setw -g pane-base-index 1
set -g renumber-windows on
set -g default-terminal "screen-256color"

unbind C-b
set -g prefix C-a
bind C-a send-prefix

bind r source-file ~/.tmux.conf \; display-message "tmux config reloaded"
bind | split-window -h
bind - split-window -v
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

这里主要做了几件事:

  • 打开鼠标支持
  • 把前缀键改成 Ctrl-a
  • 提供更顺手的分屏和 pane 切换
  • 提高历史滚动上限

如果只是第一次使用 tmux,这些就已经足够日常开发了。

一个容易忽略的小坑

在接入 fzf 的 shell 脚本时,最好只在交互式 shell 中加载:

zsh
if [[ -o interactive ]] && [ -f /usr/local/opt/fzf/shell/key-bindings.zsh ]; then
  source /usr/local/opt/fzf/shell/key-bindings.zsh
fi

原因是 fzf 的部分 key binding 会依赖 zle。如果在某些“伪交互但没有真实 TTY”的场景下强行加载,可能会出现类似下面的提示:

text
can't change option: zle

这个问题在真实终端里通常不会影响使用,但把交互式加载条件写清楚,可以减少脚本模式下的噪音。

验证方式

改完之后,至少可以做几步验证:

bash
zsh -n ~/.zshrc
zsh -lc 'echo shell ok'
tmux -f ~/.tmux.conf new-session -d -s check "sleep 1"
tmux -f ~/.tmux.conf show-options -g mouse
tmux -f ~/.tmux.conf show-options -g prefix

另外也建议实际打开一个新终端,手动确认这些行为:

  • ls 是否已经走 eza
  • ll 是否能正常显示
  • zoxide 是否已初始化
  • tmux 是否能正常进入
  • 自动建议和语法高亮是否已经生效

这套方案适合谁

如果你符合下面几种情况,这套配置会比较合适:

  • 已经在 macOS 上长期做开发
  • 终端使用频率很高
  • 想先提升效率,不想先折腾视觉主题
  • 希望配置能长期维护,不依赖太多花哨组件

如果你更在意视觉统一、跨语言提示信息、Git 分支展示细节,再考虑在这套基础上叠加 starship 也不迟。

小结

终端优化这件事,最容易走偏的方向是把大量时间花在“看起来很强”的主题和插件上,却没有先解决真正高频的痛点。

相比之下,一套以 oh-my-zsh 为框架、再补上 fzfzoxideezabatfdtmux 的组合,通常更实用:

  • 学习成本不高
  • 提升立竿见影
  • 维护成本可控
  • 对现有环境侵入不大

先把终端变顺手,再决定要不要继续美化,通常是更稳的路径。