配置 Zsh 终端:配置文件

本文简要介绍了如何配置 Zsh Terminal 终端。

配置文件

目前 macOS 的 Terminal 终端默认为 Zsh (Z shell)。 相较于 Bash (Bourne Again SHell), Zsh

  • 灵活性和可定制性更高;
  • 支持 Vim 文本编辑器的 Vi 模式;
  • 强大且活跃的社区支持;
  • 基本兼容 Bash 脚本。

Zsh 的配置文件默认存放在用户主目录 ~/$HOME 下,其读取顺序及功能如下:

  1. .zshenv:只应包含用户的环境变量。
  2. .zprofile:仅在用户登录后执行的命令。
  3. .zshrc:可用于配置 Shell 以及执行命令。
  4. .zlogin:功能与 .zprofile 相同,但在 .zshrc 后读取。
  5. .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 配置文件的最后引入,才能保证其能完整处理所有终端输出内容。

【参考】

0%