Featured image of post 使用 Zim 配置称手且快速的 Zsh⸺语法高亮、自动补全、键位配置等

使用 Zim 配置称手且快速的 Zsh⸺语法高亮、自动补全、键位配置等

Zim 是 Zsh 的插件管理器,其主要特点为极快的速度。 本文介绍了如何配置 Zim 以及推荐了几款笔者使用的 Zsh 插件。

安装 Zim

笔者偏好将配置整理到不同文件并在 .zshrcsource,而 Zim 的自动安装脚本会在 .zshrc 添加一大段内容,所以选择手动安装。

创建 init_zim.zsh 用于存放 Zim 配置,并添加以下内容1

zstyle ':zim:zmodule' use 'degit'

ZIM_HOME=~/.zim

# 安装 Zim
if [[ ! -e ${ZIM_HOME}/zimfw.zsh ]]; then
  curl -fsSL --create-dirs -o ${ZIM_HOME}/zimfw.zsh \
      https://github.com/zimfw/zimfw/releases/latest/download/zimfw.zsh
fi

# 自动安装缺失插件 + 更新 Zim 初始化脚本
if [[ ! ${ZIM_HOME}/init.zsh -nt ${ZDOTDIR:-${HOME}}/.zimrc ]]; then
  source ${ZIM_HOME}/zimfw.zsh init -q
fi

# 加载插件
source ${ZIM_HOME}/init.zsh

文件的第一行配置了 degit 来安装插件。 degit 只下载 Git 仓库的最新版本,所以比直接使用 git clone 下载整个仓库历史快。

接着在 .zshrc 中添加导入配置文件,笔者将所有 Zsh 相关配置文件都放在 ~/.config/zsh 目录下:

source ~/.config/zsh/init_zim.zsh

# ...

安装插件

Zim 的插件需要在 ~/.zimrc 中配置。 添加插件的基本命令为 zmodule 插件(内置插件)或者 zmodule 作者/仓库,如果插件在子目录下则为zmodule 作者/仓库 --root 插件相对路径。 具体用法可以参考 文档。 Zim 内置插件可以参考官网上的 列表,第三方插件可以参考 awesome-zsh-plugins

推荐插件

必要

可选

  • history ,命令历史相关设置,比直接使用 setopt 方便和快速
  • command-not-found ,输入不存在的命令时提示安装命令
  • sudo ,双击 esc 时在命令前添加 sudo
  • completion ,自动补全相关设置
  • utility ,命令缩写以及为 lsgrepless 命令输出上色
  • termtitle ,设置终端标题,例如设置为当前路径

.zimrc 内容如下:

zmodule z-shell/F-Sy-H
zmodule zsh-users/zsh-history-substring-search
zmodule zsh-users/zsh-autosuggestions
zmodule sorin-ionescu/prezto --root modules/history --no-submodules

zmodule termtitle
zmodule utility
zmodule input
zmodule sorin-ionescu/prezto --root modules/command-not-found --no-submodules
zmodule ohmyzsh/ohmyzsh --root plugins/sudo

zmodule zsh-users/zsh-completions --fpath src
zmodule completion

安装太多插件可能会拖慢 Zsh 速度,所以建议读者只安装必要的插件。

插件设置

init_zim.zsh 最后添加插件设置:

# ...
source ${ZIM_HOME}/init.zsh

# 加载后才能设置这些插件

# 命令建议的匹配顺序:上一命令、命令补全
ZSH_AUTOSUGGEST_STRATEGY=(match_prev_cmd completion)

# 模糊搜索命令历史
HISTORY_SUBSTRING_SEARCH_FUZZY=true

# 配置上下方向键搜索命令历史
bindkey "$terminfo[kcuu1]" history-substring-search-up
bindkey "$terminfo[kcud1]" history-substring-search-down

测速

配置好后使用 hyperfine 测试 Zsh 启动速度。 测试环境为 WSL Ubuntu 22.04 LTS。

启用 Zim

> hyperfine --warmup 3 "zsh -l -i -c exit"
Benchmark 1: zsh -l -i -c exit
  Time (mean ± σ):      30.3 ms ±   1.0 ms    [User: 14.5 ms, System: 5.9 ms]
  Range (min … max):    28.1 ms …  32.9 ms    85 runs
  • hyperfine 的参数 --warmup 3 用于在测速前运行几遍命令以避免冷启动影响结果。
  • Zsh 的参数 -l-i 用于模拟用户启动 Zsh,具体可参考 文档
  • -c 用于执行 exit 命令以结束 Zsh。

禁用 Zim(不读取 .zshrc

> hyperfine --warmup 3 "zsh --no-rcs -l -i -c exit"
Benchmark 1: zsh --no-rcs -l -i -c exit
  Time (mean ± σ):       6.8 ms ±   0.9 ms    [User: 1.1 ms, System: 0.1 ms]
  Range (min … max):     5.1 ms …  12.0 ms    244 runs

注意到,Zim 还是比较快的,仅增加了约 20 毫秒的启动时间。

更新 Zim 和插件

在终端中输入命令 zimfw help 就可以看到所有 Zim 提供的命令,其中常用的:

  • zimfw upgrade:更新 Zim
  • zimfw update:更新所有插件

解决 WSL 下语法高亮的延迟

/etc/wsl.conf 中添加以下内容以取消加载 Windows 的 PATH 环境变量2

[interop]
appendWindowsPath = false

这同时也会导致 WSL 下无法直接运行 Windows 中的程序。 如果需要在 WSL 中运行 Windows 中的程序,可以将路径以 WSL 下的 格式 添加到 Zsh 的 PATH 环境变量。

使用 Hugo 构建
主题 StackJimmy 设计