1. 简介
1.1. 什么是 zsh
Z shell
,即zsh
是一个 UNIX
shell
。
1.2. 常见 shell 比较
详见 ZSH 有什么优势
值得一提,就我个人体验而言,zsh
对比 fish
:
zsh
的主要优点在于:
zsh
兼容bash
。一方面,我的脚本多是 bash 脚本,另一方面,软件包提供的脚本也多是bash
脚本,在此情况下,使用兼容bash
语法的zsh
会更方便修改和使用脚本。zsh
具备更完善的补全。安装 zsh-completions
后,我目前没有遇到不支持的补全,这是令fish
暂时望其项背的。
fish
的主要优点在于:
- 开箱即用的配置。
zsh
+oh-my-zsh
因拖慢启动速度饱受诟病,而fish
拥有开箱即用的友善默认配置。但是,oh-my-zsh
之外,还有其他选择,比如使用zim
插件,兼顾速度和功能。 - 暂时没想到。
总之,对于有条件深度定制shell
的用户而言,zsh
暂时有着相当优势;而对shell
,特别是对于bash
既了解不多,也依赖不深的用户,不妨大胆尝试一下fish
。
2. 安装并启用 zim
zim 是一个 zsh 配置框架,既速度惊人,还支持诸多扩展模块。
2.1. 安装zsh
,并设置zsh
为默认shell
运行以下命令以更改默认shell
:
1
2
| chsh -l
chsh -s /usr/bin/zsh
|
2.2. 安装zim
从wget
和curl
中选择一种安装方式,将对应命令输入终端并运行:
1
2
| curl -fsSL https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh<br>
wget -nv -O - https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh
|
2.3. 配置主题
1.3-1 编辑$ZDOTDIR/.zimrc
:
1.3-2 在文件末尾加入下面一行内容,以添加powerlevel10k
模块,保存并退出
1
| zmodule romkatv/powerlevel10k
|
1.3-3 在终端输入以下命令以安装powerlevel10k
模块
1
2
| zimfw install
#之后的模块也由此方法安装
|
安装之后,powerlevel10k
会要求用户进行配置,请确保安装了 Nerd Font
字体,若要再次配置,在终端输入p10k configure
即可。
2.4. 配置模块
2.4-1 安装zsh
模块包:
1
| sudo pacman -S zsh-autosuggestions zsh-syntax-highlighting zsh-completions
|
说明
zsh-autosuggestions
—— 命令补全
zsh-syntax-highlighting
—— 语法高亮
zsh-completions
—— 定义补全
2.4-2 安装 zoxide
插件:
2.4-3 在$ZDOTDIR/.zshrc
中写入以下内容,使以上模块和插件生效:
1
2
3
| source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
eval "$(zoxide init zsh)"
|
3. 优化 .zshrc
随着配置不断深入,.zshrc 文件会愈发复杂冗长,为了提高维护效率,可以把不同功能的代码至于不同的文件内,再以 .zshrc 为纽带,通过 source 链接起来,。
3.1. 分化
创建$XDG_CONFIG_HOME/shell
,并根据以下分类分别创建配置文件:
3.1-1 环境变量类
将设定环境变量的代码部分移植到$XDG_CONFIG_HOME/shell/profile
内,形如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| #!/usr/bin/zsh
#LANG & INPUT
#-------------------
export GTK_IM_MODULE=fcitx5
export QT_IM_MODULE=fcitx5
export XMODIFIERS="@im=fcitx5"
export SDL_IM_MODULE=fcitx5
export GLFW_IM_MODULE=ibus
# export LANG="zh_CN.UTF-8"
# export LC_CTYPE="zh_CN.UTF-8"
#
#-------------------
#DEFAULT_PROGS
#-------------------
export EDITOR="nvim"
export TERMINAL="st"
export TERMINAL_PROG="st"
export BROWSER="chromium"
#-------------------
#XDG_PATH
#-------------------
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_STATE_HOME="$HOME/.local/state"
export XDG_RUNTIME_DIR="$HOME/.local/tmp"
export PATH="/usr/bin:/usr/local/bin:$HOME/.local/bin"
#-------------------
#CONFIG
#-------------------
export _JAVA_OPTIONS=-Djava.util.prefs.userRoot="$XDG_CONFIG_HOME"/java
#--------------------
#DATA
#--------------------
export CARGO_HOME="$XDG_DATA_HOME/cargo"
#---------------------
#CACHE
#---------------------
export CUDA_CACHE_PATH="$XDG_CACHE_HOME"/nv
#---------------------
#STATE
#---------------------
export W3M_DIR="$XDG_STATE_HOME/w3m"
...
|
3.1-2 扩展功能类
将增加扩展功能的代码部分移植到$XDG_CONFIG_HOME/shell/functionsrc
内,形如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #!/usr/bin/zsh
# fzf
export FZF_DEFAULT_COMMAND="fd --hidden --exclude .git --type f"
export FZF_DEFAULT_OPTS='--color=fg:#f8f8f2,bg:#282a36,hl:#bd93f9
--color=fg+:#f8f8f2,bg+:#44475a,hl+:#bd93f9
--color=info:#ffb86c,prompt:#50fa7b,pointer:#ff79c6
--color=marker:#ff79c6,spinner:#ffb86c,header:#6272a4
--height 90%
--layout=reverse
--bind=alt-j:down,alt-k:up,alt-i:toggle+down
--border
--preview "bat --color=always --style=numbers --line-range=:30 {}"
--preview-window=down'
export FZF_COMPLETION_OPTS='\'
...
|
3.1-3 快捷键位类
将配置快捷按键的代码部分移植到$XDG_CONFIG_HOME/shell/aliasrc
内,形如:
1
2
3
4
5
6
7
8
9
10
11
12
13
| #!/usr/bin/sh
alias \
zrc="nvim ~/.config/zsh/.zshrc" \
arc="nvim ~/.config/shell/aliasrc" \
prc="nvim ~/.config/shell/profile" \
frc="nvim ~/.config/shell/functionsrc" \
lrc="nvim ~/.config/lf/lfrc" \
alias \
cp="cp -iv" \
mv="mv -iv" \
rm="rm -vI" \
mkd="mkdir -pv" \
|
3.2. 联合
在.zshrc
的合适位置链接上以上三个文件:
1
2
3
4
5
6
7
8
9
| ...
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
eval "$(zoxide init zsh)"
[ -f "$HOME/.config/shell/profile" ] && source "$HOME/.config/shell/profile"
[ -f "$HOME/.config/shell/aliasrc" ] && source "$HOME/.config/shell/aliasrc"
[ -f "$HOME/.config/shell/functionsrc" ] && source "$HOME/.config/shell/functionsrc"
...
|
关于“合适位置”,可以参考.zshrc
里的注释,比如,任何涉及使终端输出字符的代码需要置顶(screnfetch 类的 banner 装饰代码),其次应为powerlevel10k
的配置代码等等。
三、多彩终端小工具
可以通过alias
来实现许多终端工具彩色输出,编辑$XDG_CONFIG_HOME/shell/aliasrc
:
1
2
3
4
5
6
7
8
9
10
11
| ...
alias \
ip="ip -color=auto" \
e="exa --long --header --color=auto --icons -a" \
ls="exa --long --header --color=auto --icons -a" \
grep="grep --color=auto" \
diff="diff --color=auto" \
bat="bat --color=auto" \
make="colormake" \
ping="gping" \
...
|
参考链接
- zsh
- github
- Nerd Font