本文简要介绍了如何配置 Zsh Terminal 终端。
配置文件
目前 macOS 的 Terminal 终端默认为 Zsh (Z shell)。
相较于 Bash (Bourne Again SHell), Zsh
- 灵活性和可定制性更高;
- 支持 Vim 文本编辑器的 Vi 模式;
- 强大且活跃的社区支持;
- 基本兼容 Bash 脚本。
Zsh 的配置文件默认存放在用户主目录 ~/
或 $HOME
下,其读取顺序及功能如下:
.zshenv
:只应包含用户的环境变量。
.zprofile
:仅在用户登录后执行的命令。
.zshrc
:可用于配置 Shell 以及执行命令。
.zlogin
:功能与 .zprofile
相同,但在 .zshrc
后读取。
.zlogout
:用户退出 Shell 时执行的命令。
一般将主要配置放在 .zshrc
中。
登录远程服务器
添加 Host
将常用服务器的 IP 地址及其简称添加至 Host 文件。
1
2
|
100.101.102.103 Host1
200.201.202.203 Server2
|
添加指令别名
为常用的登录服务器以及传输数据的指令设置别名。
1
2
3
4
5
|
alias sshh1="ssh -i path/of/rsa user@Host1"
alias sftph1="sftp -i path/of/ras user@Host1"
alias sshh2="ssh user@Host2"
alias sftph2="sftp user@Host2"
|
浏览和查找
1
2
3
4
5
6
7
8
9
|
alias ls="ls -h --color='auto'"
alias ll="ls -l"
alias la="ls -a"
# safe remove
alias rm="rm -iv"
alias grep="grep --color -rn"
alias tree="tree -C"
|
Zsh 可选项
可通过 setopt/unsetopt
打开/关闭 Zsh 的众多可选项(Zsh Options)来配置 Zsh 的各种功能。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
setopt AUTO_CD # Go to folder path without using cd.
setopt CORRECT # Spelling correction
setopt CDABLE_VARS # Change directory to a path stored in a variable.
setopt EXTENDED_GLOB # Use extended globbing syntax.
setopt EXTENDED_HISTORY # Write the history file in the ':start:elapsed;command' format.
setopt SHARE_HISTORY # Share history between all sessions.
setopt HIST_EXPIRE_DUPS_FIRST # Expire a duplicate event first when trimming history.
setopt HIST_IGNORE_DUPS # Do not record an event that was just recorded again.
setopt HIST_IGNORE_ALL_DUPS # Delete an old recorded event if a new event is a duplicate.
setopt HIST_FIND_NO_DUPS # Do not display a previously found event.
setopt HIST_IGNORE_SPACE # Do not record an event starting with a space.
setopt HIST_SAVE_NO_DUPS # Do not write a duplicate event to the history file.
setopt HIST_VERIFY # Do not execute immediately upon history expansion.
|
其他配置
1
2
3
|
# Colors Output
autoload -U colors; colors
export CLICOLOR=1
|
自动补全
相较于其他 Shell,Zsh 的补全系统是其一个较大的优势。
1
|
autoload -U compinit; compinit
|
命令提示符
命令提示符配置请参考配置 Terminal 终端的 Prompt 命令提示符。
1
|
PROMPT="%(?.%F{green}.%F{red})%B%U%*%u%b%f@%2~ %(!.%F{red}%B#%b.%F{green}%%)%f "
|
目录堆栈
Zsh 可以向一个目录堆栈(Directory Stack)中压入或弹出目录,以便我们快速切换至相应目录。
1
2
3
4
5
6
|
setopt AUTO_PUSHD # Push the current directory visited on the stack.
setopt PUSHD_IGNORE_DUPS # Do not store duplicates in the stack.
setopt PUSHD_SILENT # Do not print the directory stack after pushd or popd.
alias d='dirs -v'
for index ({1..9}) alias "$index"="cd +${index}"; unset index
|
这样我们浏览过的每个目录都会被压入目录堆栈中。当我们需要使用堆栈功能时只需输入 d
,Zsh 会列出堆栈最上层的 10 个目录且每个目录前带有编号,我们只需输入相应编号便可直达对应的目录。
目录返回
bd
命令可以快速返回某一个上层目录。例如目前工作目录为 ~/a/b/c/d
,只需输入命令 bd a
即可返回目录 ~/a
,或命令 bd 3
向上返回 3 层目录。
使用 bd 命令,只需在 .zshrc
中引入 bd.zsh 即可。
也可直接将 bd.zsh
代码复制到 .zshrc
中。
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
bd () {
(($#<1)) && {
print -- "usage: $0 <name-of-any-parent-directory>"
print -- " $0 <number-of-folders>"
return 1
} >&2
# example:
# $PWD == /home/arash/abc ==> $num_folders_we_are_in == 3
local num_folders_we_are_in=${#${(ps:/:)${PWD}}}
local dest="./"
# First try to find a folder with matching name (could potentially be a number)
# Get parents (in reverse order)
local parents
local i
for i in {$num_folders_we_are_in..2}
do
parents=($parents "$(echo $PWD | cut -d'/' -f$i)")
done
parents=($parents "/")
# Build dest and 'cd' to it
local parent
foreach parent (${parents})
do
dest+="../"
if [[ $1 == $parent ]]
then
cd $dest
return 0
fi
done
# If the user provided an integer, go up as many times as asked
dest="./"
if [[ "$1" = <-> ]]
then
if [[ $1 -gt $num_folders_we_are_in ]]
then
print -- "bd: Error: Can not go up $1 times (not enough parent directories)"
return 1
fi
for i in {1..$1}
do
dest+="../"
done
cd $dest
return 0
fi
# If the above methods fail
print -- "bd: Error: No parent directory named '$1'"
return 1
}
_bd () {
# Get parents (in reverse order)
local num_folders_we_are_in=${#${(ps:/:)${PWD}}}
local i
for i in {$num_folders_we_are_in..2}
do
reply=($reply "`echo $PWD | cut -d'/' -f$i`")
done
reply=($reply "/")
}
compctl -V directories -K _bd bd
|
Zsh 的 Vi 模式及其配置
【参考】Configuring Zsh Without Dependencies
插件配置
自动提示与语法高亮
Homebrew 安装插件
1
2
3
4
5
|
# zsh 自动提示
brew install zsh-autosuggestions
# zsh 语法高亮
brew install zsh-syntax-highlighting
|
插件配置
1
2
3
4
5
|
# Auto Suggestions
source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh
# Syntax highlight
source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
|
注意
语法高亮插件需在 zshrc 配置文件的最后引入,才能保证其能完整处理所有终端输出内容。
【参考】