Zsh 安装和美化指南(Arch Linux 版)

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

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

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

效果概览

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

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

安装基础软件

sudo pacman -S --noconfirm zsh git curl unzip wget fzf lsd bat fd ncdu tldr

部分工具说明:

  • bat:代替 cat,带语法高亮(Arch 上命令名就是 bat,不是 batcat
  • fd:代替 find(Arch 上命令名就是 fd,不是 fdfind
  • tldr:来自 community 仓库的社区版 tldr,无需 npm

如果要用 npm 版 tldr 也可以:

npm i -g tldr

切换默认 Shell 为 zsh

先确认 zsh 路径:

which zsh

切换默认 Shell:

chsh -s "$(which zsh)"

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

exec zsh

安装 Starship

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

方式一(推荐,从 Arch 官方仓库安装):

sudo pacman -S starship

方式二(官方安装脚本):

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

安装完成后确认版本:

starship --version

安装 fnm

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

方式一(AUR,需要已安装 AUR Helper 如 yay / paru):

yay -S fnm-bin

方式二(官方安装脚本):

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

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

fnm --version

示例:

fnm install 24

准备配置文件

建议先备份现有配置:

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

~/.zshrc

将下面内容写入 ~/.zshrc

# ~/.zshrc


# 项目或私有环境变量。
# 如需提高安全性,建议迁移到单独的私有文件中再 source。
export AUTH_TOKEN=123
export PROXY_TOKEN=123



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

# 加载 .zsh_alias
source .zsh_aliases


# -----------------------------------------------------------------------------
# 历史记录与 shell 选项
# -----------------------------------------------------------------------------
# 控制历史记录的数量和保存位置。
# 注意:HISTCONTROL 是 bash 变量,在 zsh 中无效。下面通过 setopt 实现同样的效果。
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 安装目录;若不存在则自动克隆。
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"

# 注册 Zinit 自身补全。
autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit


# ==================== 插件配置(按需添加) ====================
# 🔹 必装基础插件
# 先加载补全扩展,再初始化 compinit,使扩展补全立即生效。
zinit light zsh-users/zsh-completions            # 丰富的命令补全库
zinit light zsh-users/zsh-syntax-highlighting    # 命令语法高亮

# -----------------------------------------------------------------------------



# -----------------------------------------------------------------------------
# 交互增强插件
# -----------------------------------------------------------------------------
# 🔹 异步延迟加载(不阻塞启动)
zinit ice lucid wait='0' atload='_zsh_autosuggest_start'
zinit light zsh-users/zsh-autosuggestions      # 历史命令自动提示

zinit ice lucid wait='0'
zinit light agkozak/zsh-z                      # 快速目录跳转

zinit ice lucid wait='0'
zinit light Aloxaf/fzf-tab                     # fzf 命令补全

zinit ice lucid wait='0'
zinit light zsh-users/zsh-history-substring-search



# ==================== 初始化补全 ====================
autoload -Uz compinit
compinit


# -----------------------------------------------------------------------------
# 使用 starship 作为提示符;放在最后初始化,避免提示符被后续配置覆盖。
eval "$(starship init zsh)"

配置 zsh 主题

使用 starship 快速配置 zsh 主题:

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

配置说明

插件部分

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

  • 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 建议保持最后加载,否则容易被后续配置影响效果。

历史记录配置

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

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

别名部分

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

  • ls 替换成 lsd,目录展示更直观
  • cat 替换成 bat,带语法高亮(Arch 上命令名就是 bat,无需别名)
  • man 映射到 tldr,适合快速查命令用法
  • du 映射到 ncdu,适合交互式查看磁盘占用
  • fd 映射到 fd -HI,默认显示隐藏文件

Nerd Font 字体设置

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

常见可选字体:

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

通过 pacman 安装

Arch Linux 官方仓库直接提供了 Nerd Font 包,一行命令搞定:

# JetBrainsMono Nerd Font(推荐)
sudo pacman -S ttf-jetbrains-mono-nerd

# 或者 Meslo Nerd Font
sudo pacman -S ttf-meslo-nerd

# 或者 Hack Nerd Font
sudo pacman -S ttf-hack-nerd

安装完成后刷新字体缓存:

fc-cache -fv

检查是否安装成功:

fc-list | grep "Nerd Font"

终端中启用字体

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

常见设置路径如下:

  • Kitty:编辑 ~/.config/kitty/kitty.conf,设置 font_family(见下方优化配置)
  • GNOME Terminal:首选项 -> 你的配置 -> 文本 -> 自定义字体
  • Konsole(KDE 默认):设置 -> 编辑当前方案 -> 外观 -> 字体
  • Warp/Tabby/Termius:Settings -> Appearance -> Font
  • Windows Terminal:Profiles -> Appearance -> Font face
  • Alacritty:在配置文件中设置 font.family

推荐直接选择:

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

常见问题排查

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

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

设置方法

  1. 通过 pacman -S 安装对应 Nerd Font 包
  2. 在终端模拟器设置中把字体切换为对应 Nerd Font
  3. 关闭并重新打开终端

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

Kitty 终端优化配置

Kitty 是一款 GPU 加速的终端模拟器,配置路径为 ~/.config/kitty/kitty.conf

mkdir -p ~/.config/kitty

将以下内容写入 ~/.config/kitty/kitty.conf

# =============================================================================
# Kitty 终端配置
# 适配 ttf-jetbrains-mono-nerd + zsh + starship
# =============================================================================

# ── 字体 ────────────────────────────────────────────────────────────────────
font_family      JetBrainsMono Nerd Font
bold_font         auto
italic_font       auto
bold_italic_font  auto
font_size         12.0

# ── 窗口 ────────────────────────────────────────────────────────────────────
remember_window_size   yes
initial_window_width   900
initial_window_height 600
window_border_width    0.5px
window_margin_width    0
window_padding_width   8

# ── 颜色 ────────────────────────────────────────────────────────────────────
# Tokyo Night 配色(适配 dark 主题)
foreground           #a9b1d6
background           #1a1b26
selection_foreground #c0caf5
selection_background #2f3346

# 黑色
color0  #1d202f
color8  #414868

# 红色
color1  #f7768e
color9  #f7768e

# 绿色
color2  #9ece6a
color10 #9ece6a

# 黄色
color3  #e0af68
color11 #e0af68

# 蓝色
color4  #7aa2f7
color12 #7aa2f7

# 紫色
color5  #bb9af7
color13 #bb9af7

# 青色
color6  #7dcfff
color14 #7dcfff

# 白色
color7  #a9b1d6
color15 #c0caf5

# ── 光标 ─────────────────────────────────────────────────────────────────────
cursor              #c0caf5
cursor_text_color   #1a1b26
cursor_shape        block
cursor_beam_thickness 1.5

# ── Tab 栏 ──────────────────────────────────────────────────────────────────
tab_bar_style           powerline
tab_bar_margin_width    0.0
tab_bar_edge            top
tab_bar_style           separator
tab_separator           " | "
active_tab_foreground   #1a1b26
active_tab_background   #7aa2f7
inactive_tab_foreground #a9b1d6
inactive_tab_background #1d202f

# ── 滚动与性能 ───────────────────────────────────────────────────────────────
scrollback_lines       10000
scrollback_pager_history_size 100

# GPU 渲染(Kitty 默认已开启,这里显式确认)
renderer             gl

# ── Shell 集成 ──────────────────────────────────────────────────────────────
# 让 Kitty 识别 Shell 提示符,支持点击跳转输出
shell_integration   enabled

# ── 快捷键 ───────────────────────────────────────────────────────────────────
# 让 Ctrl+Shift+↑/↓ 也能滚动
map ctrl+shift+up    scroll_line_up
map ctrl+shift+down  scroll_line_down

# 新建窗口 / 标签页
map ctrl+shift+enter new_window
map ctrl+shift+t     new_tab

# 字体放大/缩小
map ctrl+plus         change_font_size all +2.0
map ctrl+minus        change_font_size all -2.0
map ctrl+0            change_font_size all 0

配置说明:

  • 字体:直接指定 JetBrainsMono Nerd Font,与你安装的包 ttf-jetbrains-mono-nerd 对应
  • 配色:Tokyo Night 主题,与 starship 的 pastel-powerline 预设风格一致
  • 窗口边距window_padding_width 8 让内容不贴边,阅读更舒适
  • Tab 栏:顶部显示带分隔符的标签页
  • GPU:Kitty 默认使用 OpenGL 渲染,滚动流畅

应用配置后重启 Kitty 即可生效。

使配置生效

执行:

source ~/.zshrc

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

验证命令

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

继续检查别名是否生效:

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

检查 z 是否可用:

z /tmp

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

常见问题

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

kitty 终端或者 vscode 终端图标乱码

解决方法:使用支持 powerline 的字体。

优先排查两项:

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

bat / fd 命令名说明

Arch Linux 上 batfd 的包名与命令名一致,无需额外别名:

  • bat 包提供 bat 命令(Debian/Ubuntu 上叫 batcat
  • fd 包提供 fd 命令(Debian/Ubuntu 上叫 fdfind

如果你是从 Debian 迁移过来,之前的别名 alias cat=batcat 需要改成 alias cat=bat

安全建议

你当前 ~/.zshrc 中包含:

export AUTH_TOKEN=123
export PROXY_TOKEN=123

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

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

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

总结

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

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

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

参考