Zsh 安装和美化指南

本文适合想在新机器上从零搭建一套高颜值 zsh 环境的用户。你会学到:安装 zsh 及增强工具、切换默认 shell、配置 Starship 提示符与 fnm、写入 ~/.zshrc~/.zsh_aliases,以及安装 Nerd Font 并逐项验证。

这份文档基于当前机器上的 ~/.zshrc~/.zsh_aliases 整理,目标是从零安装并复现一套兼顾颜值和效率的 zsh 环境。

当前方案的核心组件如下:

  • zsh:Shell 本体
  • zinit:插件管理器
  • starship:跨 Shell 提示符
  • fnm:Node.js 版本管理
  • zsh-autosuggestions:命令自动建议
  • zsh-syntax-highlighting:命令语法高亮
  • zsh-history-substring-search:历史记录子串搜索
  • zsh-z:目录跳转增强
  • fzf-tab:更友好的补全体验
  • lsdbatcattldrncdufdfind:常用命令增强工具

1. 效果概览

这套配置完成后,你会得到:

  • 更现代的命令提示符
  • 输入历史命令时的灰色自动建议
  • 命令语法高亮
  • Tab 补全增强
  • 常用目录快速跳转
  • 更美观的 lscat、帮助查看和磁盘分析体验

2. 安装基础软件

以下命令以 Debian/Ubuntu 系发行版为例。

sudo apt update
sudo apt install -y zsh git curl unzip wget 

安装补全工具fzf

apt install fzf

安装常用增强工具:

sudo apt install -y lsd bat fd-find ncdu

安装 tldr

需要配置node和nvm

npm i -g tldr

如果系统仓库没有 tldr,可按官方方式单独安装。

3. 切换默认 Shell 为 zsh

先确认 zsh 路径:

which zsh

切换默认 Shell:

chsh -s "$(which zsh)"

执行后重新登录,或者临时进入:

exec zsh

4. 安装 Starship

starship 用于生成更现代的提示符。

curl -sS https://starship.rs/install.sh | sh

安装完成后确认版本:

starship --version

5. 安装 fnm

fnm 是一个轻量的 Node.js 版本管理器。

curl -fsSL https://fnm.vercel.app/install | bash

安装完成后,重新打开终端,或手动加载环境后检查:

fnm --version

示例:

fnm install 24

6. 准备配置文件

建议先备份现有配置:

cp ~/.zshrc ~/.zshrc.bak 2>/dev/null
cp ~/.zsh_aliases ~/.zsh_aliases.bak 2>/dev/null

6.1 ~/.zshrc

将下面内容写入 ~/.zshrc

# ~/.zshrc
# 仅在交互式 zsh 会话中加载;用于初始化环境变量、别名、补全、插件和提示符。

# -----------------------------------------------------------------------------
# 基础环境变量
# -----------------------------------------------------------------------------
if [[ -z "${debian_chroot:-}" && -r /etc/debian_chroot ]]; then
  debian_chroot="$(< /etc/debian_chroot)"
fi

# 项目或私有环境变量。
# 更推荐迁移到单独的私有文件中再 source,避免敏感信息直接写入公开配置。
export AUTH_TOKEN=123
export PROXY_TOKEN=123

# -----------------------------------------------------------------------------
# PATH
# -----------------------------------------------------------------------------
typeset -U path PATH

# -----------------------------------------------------------------------------
# 工具链初始化
# -----------------------------------------------------------------------------
FNM_PATH="$HOME/.local/share/fnm"
if [ -d "$FNM_PATH" ]; then
  export PATH="$FNM_PATH:$PATH"
  eval "$(fnm env --shell zsh)"
fi

source "$HOME/.zsh_aliases"

# -----------------------------------------------------------------------------
# 历史记录与 shell 选项
# -----------------------------------------------------------------------------
HISTCONTROL=ignoreboth
HISTSIZE=1000
SAVEHIST=2000
HISTFILE="$HOME/.zsh_history"

setopt APPEND_HISTORY
setopt HIST_IGNORE_DUPS
setopt HIST_IGNORE_SPACE
setopt HIST_REDUCE_BLANKS
setopt SHARE_HISTORY

# -----------------------------------------------------------------------------
# 终端行为
# -----------------------------------------------------------------------------
autoload -Uz add-zsh-hook
update_terminal_size() {
  export LINES COLUMNS
}
add-zsh-hook precmd update_terminal_size

# -----------------------------------------------------------------------------
# Zinit 插件管理
# -----------------------------------------------------------------------------
ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git"
[[ ! -d "$ZINIT_HOME" ]] && mkdir -p "$(dirname "$ZINIT_HOME")"
[[ ! -d "$ZINIT_HOME/.git" ]] && git clone https://github.com/zdharma-continuum/zinit.git "$ZINIT_HOME"
source "$ZINIT_HOME/zinit.zsh"

autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit

zinit light zsh-users/zsh-completions
zstyle ':completion:*' menu select

# -----------------------------------------------------------------------------
# 补全系统
# -----------------------------------------------------------------------------
autoload -Uz compinit
compinit

zinit light Aloxaf/fzf-tab

# -----------------------------------------------------------------------------
# 交互增强插件
# -----------------------------------------------------------------------------
zinit light zsh-users/zsh-autosuggestions
zinit light zsh-users/zsh-history-substring-search
zinit light agkozak/zsh-z
zinit light zsh-users/zsh-syntax-highlighting

# -----------------------------------------------------------------------------
# 提示符
# -----------------------------------------------------------------------------
eval "$(starship init zsh)"

6.2 ~/.zsh_aliases

将下面内容写入 ~/.zsh_aliases

# lsd 替换 ls(带图标,需要 Nerd Fonts)
alias ls='lsd --group-dirs first'
alias ll='ls -l'
alias la='ls -al'
alias lt='ls --tree --depth=2'

alias cat='batcat'
alias man='tldr'
alias du='ncdu'
alias fd='fdfind -HI'

6.3 配置zsh主题

使用startship快速配置zsh主题

starship preset pastel-powerline -o ~/.config/starship.toml

7. 配置说明

7.1 插件部分

当前插件组合分别解决不同问题:

  • zsh-users/zsh-completions:补充更多命令补全定义
  • Aloxaf/fzf-tab:让补全选择界面更友好
  • zsh-users/zsh-autosuggestions:根据历史命令提供自动建议
  • zsh-users/zsh-history-substring-search:根据当前输入检索历史
  • agkozak/zsh-z:根据访问频率快速跳转目录
  • zsh-users/zsh-syntax-highlighting:命令输入时直接高亮

其中 zsh-syntax-highlighting 建议保持最后加载,否则容易被后续配置影响效果。

7.2 历史记录配置

这部分配置解决的是命令历史的可用性问题:

  • APPEND_HISTORY:历史记录追加写入
  • HIST_IGNORE_DUPS:忽略重复命令
  • HIST_IGNORE_SPACE:忽略以空格开头的命令
  • SHARE_HISTORY:多个终端共享历史记录

7.3 别名部分

这些别名主要做了两类事情:命令替换和体验增强。

  • ls 替换成 lsd,目录展示更直观
  • cat 替换成 batcat,带语法高亮
  • man 映射到 tldr,适合快速查命令用法
  • du 映射到 ncdu,适合交互式查看磁盘占用
  • fd 映射到 fdfind -HI,默认显示隐藏文件并忽略系统命名差异

8. Nerd Font 字体设置

如果你希望 lsd 图标、提示符符号显示正常,终端需要使用 Nerd Font。

常见可选字体:

  • MesloLGS Nerd Font
  • JetBrainsMono Nerd Font
  • Hack Nerd Font

8.1 手动安装 Nerd Font

下面以 JetBrainsMono Nerd Font 为例。

  1. 创建用户字体目录:

    mkdir -p ~/.local/share/fonts
    cd /tmp
    
  2. 下载字体压缩包:

    wget https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/0xProto.zip
    

    如果你想装 MesloHack,把文件名替换成:

    Meslo.zip
    Hack.zip
    
  3. 解压到本地字体目录:

    unzip -o JetBrainsMono.zip -d ~/.local/share/fonts/JetBrainsMonoNerdFont
    
  4. 刷新字体缓存:

    fc-cache -fv
    
  5. 检查字体是否已被系统识别:

    fc-list | grep "JetBrainsMono Nerd Font"
    或者
    fc-list | ge "JetBrainsMono Nerd Font"
    

如果能看到相关输出,说明字体已经安装成功。

8.2 终端中启用字体

字体安装完成后,还需要在终端模拟器里手动切换字体,否则图标仍然不会正常显示。

常见设置路径如下:

  • GNOME Terminal:首选项 -> 你的配置 -> 文本 -> 自定义字体
  • Warp/Tabby/Termius:Settings -> Appearance -> Font
  • Windows Terminal:Profiles -> Appearance -> Font face
  • Alacritty:在配置文件中设置 font.family

推荐直接选择:

  • JetBrainsMono Nerd Font
  • MesloLGS Nerd Font
  • Hack Nerd Font

8.3 一键安装脚本方式

如果你不想手动下载,也可以直接使用 Nerd Fonts 官方仓库脚本,但前提是本机已安装 git

git clone --depth 1 https://github.com/ryanoasis/nerd-fonts.git /tmp/nerd-fonts
cd /tmp/nerd-fonts
./install.sh JetBrainsMono

安装完成后同样执行:

fc-cache -fv

8.4 常见问题排查

如果字体已经安装,但图标仍然显示异常,按这个顺序排查:

  1. 确认终端里实际选中的字体就是 Nerd Font,而不是原版字体
  2. 关闭并重新打开终端
  3. 执行 fc-list | rg "Nerd Font",确认系统能识别字体
  4. 如果是远程桌面或某些轻量终端,确认该终端本身支持图标字符显示

8.5 设置方法

  1. 下载并安装 Nerd Font
  2. 在终端模拟器设置中把字体切换为对应 Nerd Font
  3. 重新打开终端

如果图标显示成方块或乱码,通常就是字体没有切换成功。

9. 使配置生效

执行:

source ~/.zshrc

如果没有报错,再验证各项功能。

10. 验证命令

echo $SHELL
zsh --version
starship --version
fnm --version

继续检查别名是否生效:

ls
ll
la
lt
cat ~/.zshrc
tldr ls
ncdu
fd zsh

检查 z 是否可用:

z /tmp

如果你还没有足够的目录访问历史,z 一开始效果不明显,属于正常现象。

11. 常见问题

11.1 source ~/.zshrc 报错找不到别名文件

请确认文件名是:

~/.zsh_aliases

不是:

~/.zsh_alias

当前配置实际使用的是 ~/.zsh_aliases

11.2 fnm 不生效

先确认目录存在:

ls ~/.local/share/fnm

再确认 ~/.zshrc 中已包含:

FNM_PATH="$HOME/.local/share/fnm"
if [ -d "$FNM_PATH" ]; then
  export PATH="$FNM_PATH:$PATH"
  eval "$(fnm env --shell zsh)"
fi

11.3 图标乱码

优先排查两项:

  • 终端字体是否换成 Nerd Font
  • 当前终端是否支持图标显示

11.4 batcatfdfind 命令名和教程不同

这是 Debian/Ubuntu 系常见差异:

  • bat 包名通常提供命令 batcat
  • fd 包名通常提供命令 fdfind

所以通过别名统一成常见用法是合理做法。

12. 安全建议

你当前 ~/.zshrc 中包含:

export AUTH_TOKEN=123
export PROXY_TOKEN=123

如果这些变量是真实敏感信息,建议改成单独的私有文件,例如:

[ -f "$HOME/.zsh_private" ] && source "$HOME/.zsh_private"

然后把敏感变量放进 ~/.zsh_private,并确保该文件不被公开同步。

13. 总结

这套 zsh 配置的思路不是堆很多主题,而是用一组明确分工的工具完成体验升级:

  • zinit 管插件
  • starship 管提示符
  • fnm 管 Node 版本
  • 各类插件负责建议、高亮、补全和目录跳转
  • 别名把日常命令替换成更友好的版本

如果你要在新机器上复刻环境,按本文顺序执行即可:先装 zsh 和依赖,再写入 ~/.zshrc~/.zsh_aliases,最后切换字体并重新加载配置。

参考