Difference between revisions of "Zsh (简体中文)"

From ArchWiki
Jump to navigation Jump to search
m (修饰语句)
 
(27 intermediate revisions by 12 users not shown)
Line 1: Line 1:
 
[[Category:Command shells (简体中文)]]
 
[[Category:Command shells (简体中文)]]
{{i18n|Zsh}}
+
[[cs:Zsh]]
 +
[[de:Zsh]]
 +
[[en:Zsh]]
 +
[[es:Zsh]]
 +
[[fa:Zsh]]
 
[[fr:Zsh]]
 
[[fr:Zsh]]
[http://www.zsh.org Zsh]是一款强大的虚拟终端,既是一个系统的虚拟终端,也可以作为一个脚本语言的交互解析器。它相对[[Bash]] (not by default, only if you issue "emulate sh")有如下优点:
+
[[ja:Zsh]]
 +
[[ru:Zsh]]
 +
{{TranslationStatus (简体中文)|Zsh|2016-01-17|386240}}
 +
[http://zsh.sourceforge.net/Intro/intro_1.html Zsh] 是一款功能强大的终端(shell)软件,既可以作为一个交互式终端,也可以作为一个脚本解释器。它在兼容 [[Bash]] 的同时 (默认不兼容,除非设置成 {{ic|emulate sh}}) 还有提供了很多改进,例如:
  
*更快
+
* 更高效
*优化了的自动补全
+
* 更好的自动补全
*优化的模式识别
+
* 更好的文件名展开(通配符展开)
*Improved array handling
+
* 更好的数组处理
*全面可定制
+
* 可定制性高
  
Zsh的常见问题解答有[http://zsh.sourceforge.net/FAQ/zshfaq01.html#l4 更详细的解释]
+
Zsh [http://zsh.sourceforge.net/FAQ/zshfaq01.html#l4 常见问题解答] 中提供了更多使用 Zsh 的理由。
  
==安装==
+
== 安装 ==
  
未免重复安装,可以先看看目前所使用的终端是什么:
+
在开始安装之前,你或许想查看一下自己目前使用的终端是什么:
  
 
  $ echo $SHELL
 
  $ echo $SHELL
  
{{Package Official|zsh}}在[[Official Repositories|官方维护仓库]]中,可以和其他类似软件一样[[pacman|安装]] .
+
{{Pkg|zsh}} 在[[Official repositories|官方维护仓库]]中,可以和其他类似软件一样[[pacman|安装]]。如果希望使用额外的补全功能,可以安装 {{pkg|zsh-completions}} 软件包。
  
===初始化配置文件===
+
=== 初始化配置文件 ===
  
先运行一下,看看软件是否已经正确安装:
+
可以运行下面的命令来检查 Zsh 是否被正确得安装:
  
 
  $ zsh
 
  $ zsh
  
将会看到 '''zsh-newuser-install''',新手向导将可以帮你完成一些最基本的配置。若想跳过,按{{Codeline|q}}键退出.
+
运行后你将会看到 ''新用户向导(zsh-newuser-install)'',它可以帮助你完成一些最基本的配置。如果你想跳过它,可以按 {{ic|q}} 键退出。如果你没有看见它,你可以手动打开 ''新用户向导'':
  
===把Zsh变成默认终端===
+
$ zsh /usr/share/zsh/functions/Newuser/zsh-newuser-install -f
  
若{{Filename|/etc/shells}}文件中已列有zsh,则可以使用 {{Codeline|chsh}} 来改变默认的终端——此命令不需要以根账户使用,但使用过程中需要使用根账户密码。
+
=== 将 Zsh 作为默认终端 ===
如果是从[[Official Repositories|官方维护的仓库]]中安装Zsh,则{{Filename|/etc/shells}}已列有zsh。
 
  
让目前使用的用户改变默认虚拟终端:
+
另请参见 [[Command-line shell#Changing your default shell|更改你的默认终端]]
  
$ chsh -s $(which zsh)
+
{{小贴士|如果你要替换 {{Pkg|bash}},你也许想转移 {{ic|~/.bashrc}} 中的某些配置到 {{ic|~/.zshrc}} (例如:命令提示符和[[Bash#Aliases|别名]]),以及转移 {{ic|~/.bash_profile}} 中的配置到 {{ic|~/.zprofile}} (例如:[[xinitrc#Autostart X at login|启动 X Window System 的代码]])。}}
  
{{Note|修改完后要重新登录才能见效}}
 
  
重新登录之后,会在终端中看到Zsh的提示符,和Bash是不一样的。如果还有疑惑,可输入下面命令看看默认终端是那个:
+
==配置文件介绍==
 +
当 Zsh 启动时,它会按照顺序依次读取下面的配置文件:
  
$ echo $SHELL
+
;{{ic|/etc/zsh/zshenv}}:该文件应该包含用来设置[[#Configuring $PATH|PATH 环境变量]]{{Broken section link}}以及其他一些[[environment variables|环境变量]]的命令;不应该包含那些可以产生输出结果或者假设终端已经附着到 tty 上的命令。
 +
;{{ic|~/.zshenv}}:该文件和 {{ic|/etc/zsh/zshenv}} 相似,但是它是针对每个用户而言的。一般来说是用来设置一些有用的环境变量。
 +
;{{ic|/etc/zsh/zprofile}}:这是一个全局的配置文件,在用户登录的时候加载。一般是用来在登录的时候执行一些命令。请注意,在 Arch Linux 里该文件默认包含[https://projects.archlinux.org/svntogit/packages.git/tree/trunk/zprofile?h=packages/zsh 一行配置],用来加载 {{ic|/etc/profile}} 文件,详见 [[#全局配置文件]]。
 +
;{{ic|/etc/profile}}:在登录时,该文件应该被所有和伯克利(Bourne)终端相兼容的终端加载:它在登录的的时候会加载应用相关的配置({{ic|/etc/profile.d/*.sh}})。注意在 Arch Linux 里,Zsh 会默认加载该文件。
 +
;{{ic|~/.zprofile}}:该文件一般用来在登录的时候自动执行一些用户脚本。
 +
;{{ic|/etc/zsh/zshrc}}:当 Zsh 被作为交互式终端的时候,会加载这样一个全局配置文件。
 +
;{{ic|~/.zshrc}}:当 Zsh 被作为交互式终端的时候,会加载这样一个用户配置文件。
 +
;{{ic|/etc/zsh/zlogin}}:在登录完毕后加载的一个全局配置文件。
 +
;{{ic|~/.zlogin}}:和 {{ic|/etc/zsh/zlogin}} 相似,但是它是针对每个用户而言的。
 +
;{{ic|/etc/zsh/zlogout}}:在注销的时候被加载的一个全局配置文件。
 +
;{{ic|~/.zlogout}}:和 {{ic|/etc/zsh/zlogout}} 相似,但是它是针对每个用户而言的.
 +
 
 +
{{注意|
 +
* 在 Arch 源中的 {{Pkg|zsh}} 所使用的文件路径和 Zsh 的 man 手册中默认的不同(详见 [[#全局配置文件]])
 +
* {{ic|/etc/profile}} 不是 Zsh 常规启动配置文件的一部分,但是 Arch 源中的 {{Pkg|zsh}} 会在 {{ic|/etc/zsh/zprofile}} 里面加载它。用户应该注意 {{ic|/etc/profile}} 里面设置的 {{ic|$PATH}} 环境变量会覆盖掉 {{ic|~/.zshenv}} 里面配置的任何 {{ic|$PATH}}。为了防止这一点,请在 {{ic|~/.zshrc}} 当中设置 {{ic|$PATH}}(不推荐替换掉 {{ic|/etc/zsh/zprofile}} 里面的[https://projects.archlinux.org/svntogit/packages.git/tree/trunk/zprofile?h=packages/zsh 默认配置],因为这样会破坏其他提供了 {{ic|/etc/profile.d}} 的软件包和 Zsh 的联动关系)
 +
}}
 +
 
 +
=== 全局配置文件 ===
  
{{Tip|If you are replacing {{Package Official|bash}}, you may want to move some code from {{Filename|~/.bashrc}} to {{Filename|~/.zshrc}} (e.g. the prompt and the aliases) and from {{Filename|~/.bash_profile}} to {{Filename|~/.zprofile}} (e.g. [[Start X at Boot|the code that starts your X Window System]]).}}
+
有时候你可能想提供一些所有 Zsh 用户共享的配置。在帮助手册 zsh(1) 提到的一些全局配置文件(例如 {{ic|/etc/zshrc}})的路径,在 Arch Linux 里是有一些不同的,因为 it has been compiled with  flags specifically to target[https://projects.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/zsh#n34] {{ic|/etc/zsh/}} instead.
  
==配置文件介绍==
+
所以,Arch 源中 {{Pkg|zsh}} 的全局配置文件会使用 {{ic|/etc/zsh/zshrc}} 而不是 {{ic|/etc/zshrc}}。类似的还有 {{ic|/etc/zsh/zshenv}}{{ic|/etc/zsh/zlogin}} {{ic|/etc/zsh/zlogout}}。注意这些文件不是默认就被创建好的,你可以根据需要来创建它们。
{{Accuracy}}
 
At login, Zsh sources the following files in this order:
 
;{{Filename|/etc/profile}}:This file is sourced by all Bourne-compatible shells upon login: it sets up an environment upon login and application-specific (/etc/profile.d/*.sh) settings.
 
;{{Filename|~/.zshenv}}:This file should contain commands to set the command search path, plus other important environment variables; it should not contain commands that produce output or assume the shell is attached to a tty.
 
;{{Filename|~/.zprofile}}:This file is generally used for automatic execution of user's scripts.
 
;{{Filename|~/.zshrc}}:这是Zsh的主配置文件。
 
;{{Filename|~/.zlogin}}:This file is generally used for automatic execution of user's scripts.
 
  
At logout it sources '''{{Filename|~/.zlogout}}''', which is used for automatic execution of user's scripts.
+
唯一的例外是 {{ic|zprofile}},请使用 {{ic|/etc/profile}}  
  
{{Note|
 
*The paths used in Arch's {{Package Official|zsh}} package are different from the default ones used in the man pages.
 
*{{Codeline|$ZDOTDIR}} defaults to {{Codeline|$HOME}}}}
 
  
==用于定制的配置文件 ~/.zshrc==
+
== 配置 Zsh ==
  
Although Zsh is usable out of the box, it is almost certainly not set up the way you would like to use it, but due to the sheer amount of customisation available in Zsh, configuring Zsh can be a daunting and time-consuming experience.
+
尽管 Zsh 基本不需要怎么配置就能满足大多数用户的需求,但是因为其中包含太多的可定制选项,导致配置 Zsh 可能会比较耗时。
  
Included below is a sample configuration file, it provides a decent set of default options as well as giving examples of many ways that Zsh can be customised. In order to use this configuration save it as a file named {{Filename|.zshrc}}. You can then apply the changes without needing to logout and then back in by running:
+
=== 简单的 .zshrc ===
 
$ source ~/.zshrc
 
  
===简单的 .zshrc===
+
下面是一个简单的 {{ic|.zshrc}} 配置文件,它提供一个配置 Zsh 的生动的例子。你可以将下面的配置保存为文件 {{ic|.zshrc}} 来使用它。
  
下面是一个简单的{{Filename|.zshrc}}配置文件,足够用于起步:
+
{{hc|~/.zshrc|
 
{{File|name=~/.zshrc|content=
 
 
autoload -U compinit promptinit
 
autoload -U compinit promptinit
 
compinit
 
compinit
 
promptinit
 
promptinit
+
 
# This will set the default prompt to the walters theme
+
# 设置 walters 主题的默认命令行提示符
 
prompt walters}}
 
prompt walters}}
  
=== 命令提示和补全 ===
+
{{小贴士|你可以执行命令 {{ic|source ~/.zshrc}} 来生效修改的配置,而不需要重新登录}}
自动补全是Zsh的王牌功能,不可不好好利用。加入下列行到配置文件{{Filename|.zshrc}}中,开启此功能:
+
 
 +
=== 配置 $PATH ===
 +
 
 +
将下面的配置放到 {{ic|~/.zshenv}} 中:
 +
{{hc|~/.zshenv|
 +
typeset -U path
 +
path=(~/bin /other/things/in/path $path[@])}}
 +
 
 +
另请参见 [http://zsh.sourceforge.net/Guide/zshguide02.html#l24 《A User's Guide to the Z-Shell(Z-Shell 用户指南)》] 和 [[#Configuration files]]{{Broken section link}} 中的相关内容。
 +
 
 +
=== 命令补全 ===
 +
 
 +
也许 Zsh 最引人注目的特性就是它先进的自动补全功能。在 {{ic|~/.zshrc}} 最后加入下面的配置,开启自动补全:
  
{{File|name=~/.zshrc|content=
+
{{hc|~/.zshrc|
 
autoload -U compinit
 
autoload -U compinit
compinit}}
+
compinit
 +
}}
 +
 
 +
上面的补全配置包括 ssh/scp/sftp 命令中的主机名(host name)补全。但是要让这个特性正常工作,你需要防止 {{ic|~/.ssh/known_hosts}} 中的主机名被散列化(hash)。
  
The above configuration includes ssh/scp/sftp hostnames completion but in order for this feature to work you will need to prevent ssh from hashing hosts names in ~/.ssh/known_hosts (Warning: be aware that this makes your computer vulnerable to [http://itso.iu.edu/Hashing_the_OpenSSH_known__hosts_File "Island-hopping" attacks]). In that intention, comment the following line or set the value to "no":
+
{{警告|主机名去散列化可能会导致本机成为 [http://blog.rootshell.be/2010/11/03/bruteforcing-ssh-known_hosts-files/ 跳跃式攻击("Island-hopping" attacks)]的跳板。如果你希望 Zsh 自动补全主机名,你可以注释掉 {{ic|/etc/ssh/ssh_config}} 当中的这行配置,或者设置为 {{ıc|no}}:
{{File|name=/etc/ssh/ssh_config|content=
+
{{hc|/etc/ssh/ssh_config|
 
#HashKnownHosts yes}}
 
#HashKnownHosts yes}}
And move your ~/.ssh/known_hosts somewhere else so that ssh creates a new one with with un-hashed hostnames (warning: previously known hosts will thus be lost).
+
你可以将原来的 {{ic|~/.ssh/known_hosts}} 移动到别的地方,之后 ssh 创建的 {{ic|~/.ssh/known_hosts}} 文件就不会散列化主机名(但是之前信任的主机如果需要,还得重新导入进来)。具体请参考 ssh 的 README 文件中[http://nms.lcs.mit.edu/projects/ssh/README.hashed-hosts 散列化主机名]的相关内容。
 +
}}
  
For autocompletion with an arrow-key driven interface, add the following to:
+
添加下面的配置可以启动使用方向键控制的自动补全:
{{File|name=~/.zshrc|content=
+
 
 +
{{hc|~/.zshrc|
 
zstyle ':completion:*' menu select}}
 
zstyle ':completion:*' menu select}}
  
For autocompletion of command line switches for aliases, add the following to:
+
:''按两次 tab 键启动菜单''
{{File|name=~/.zshrc|content=
+
 
 +
添加下面的配置可以启动命令行别名的自动补全:
 +
 
 +
{{hc|~/.zshrc|
 
setopt completealiases}}
 
setopt completealiases}}
 +
 +
=== "command not found" 钩子 ===
 +
 +
另请参见 [[Pkgfile#Command not found]]。
 +
 +
=== 消除历史记录中的重复条目 ===
 +
 +
{{hc|~/.zshrc|
 +
setopt HIST_IGNORE_DUPS}}
 +
 +
假如目前的历史记录中已经有重复条目,可以运行下面的命令清除
 +
 +
$ sort -t ";" -k 2 -u ~/.zsh_history | sort -o ~/.zsh_history
 +
 +
=== ttyctl 命令 ===
 +
 +
[http://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html#index-tty_002c-freezing] 描述了 Zsh 中的 {{ic|ttyctl}} 命令。它可以用来锁定/解锁(freeze/unfreeze)终端。许多程序会修改终端的状态并且在异常退出的时候不会还原初始状态。下面的配置可以避免手动重置终端。
 +
 +
{{hc|~/.zshrc|
 +
ttyctl -f}}
  
 
=== 快捷键绑定 ===
 
=== 快捷键绑定 ===
Zsh does not use readline, instead it uses its own and more powerful zle. It does not read {{Filename|/etc/inputrc}} or {{Filename|~/.inputrc}}.
 
zle has an emacs mode and a vi mode. By default, it tries to guess whether you want emacs or vi keys from the $EDITOR environment variable. If it is empty, it will default to [[emacs]]. You can change this with bindkey -v or bindkey -e.
 
  
To get some special keys working:
+
Zsh 使用自带的 zle 代替 readline,并且不会读取 {{ic|/etc/inputrc}} 或者 {{ic|~/.inputrc}}。
{{File|name=~/.zshrc|content=
+
Zle 有 [[emacs]] 和 [[vi]] 两个模式,默认情况下它根据环境变量 {{ic|$EDITOR}} 来决定使用哪一个模式,如果为空默认为 emacs 模式。使用 {{ic|bindkey -e}} 或者 {{ic|bindkey -v}} 来手动指定模式。
bindkey "\e[1~" beginning-of-line # Home
+
另请参见 [http://zshwiki.org/home/zle/bindkeys zshwiki: bindkeys].
bindkey "\e[4~" end-of-line # End
+
 
bindkey "\e[5~" beginning-of-history # PageUp
+
==== ncurses 应用的快捷键绑定 ====
bindkey "\e[6~" end-of-history # PageDown
+
 
bindkey "\e[2~" quoted-insert # Ins
+
(译者注:ncurses 是一个字符界面下的 GUI 框架)如果直接将 ncurses 应用绑定到某个快捷键,那么它会失去交互性。可以使用变量 {{ic|BUFFER}} 来解决这个问题。下面的例子是使用 {{ic|Alt+\}} 来打开 ncmpcpp:
bindkey "\e[3~" delete-char # Del
+
{{hc|~/.zshrc|2=
bindkey "\e[5C" forward-word
+
ncmpcppShow() { BUFFER="ncmpcpp"; zle accept-line; }
bindkey "\eOc" emacs-forward-word
+
zle -N ncmpcppShow
bindkey "\e[5D" backward-word
+
bindkey '^[\' ncmpcppShow
bindkey "\eOd" emacs-backward-word
 
bindkey "\e\e[C" forward-word
 
bindkey "\e\e[D" backward-word
 
bindkey "\e[Z" reverse-menu-complete # Shift+Tab
 
# for rxvt
 
bindkey "\e[7~" beginning-of-line # Home
 
bindkey "\e[8~" end-of-line # End
 
# for non RH/Debian xterm, can't hurt for RH/Debian xterm
 
bindkey "\eOH" beginning-of-line
 
bindkey "\eOF" end-of-line
 
# for freebsd console
 
bindkey "\e[H" beginning-of-line
 
bindkey "\e[F" end-of-line
 
 
}}
 
}}
  
Alternatively, you can convert /etc/inputrc for Zsh:
+
==== 另一种方法 ====
{{File|name=~/.zshrc|content=
+
 
# bind special keys according to readline configuration
+
该方法会在启动应用之前,将你的输入保存在一行当中。
eval "$(sed -n 's/^/bindkey /; s/: / /p' /etc/inputrc)"
+
{{hc|~/.zshrc|2=
 +
ncmpcppShow() { ncmpcpp <$TTY; zle redisplay; }
 +
zle -N ncmpcppShow
 +
bindkey '^[\' ncmpcppShow
 
}}
 
}}
  
{{Note|To get the proper sequences for certain key combinations, start {{Codeline|cat}} or {{Codeline|read}} without any parameters and press them; they should then be printed in the terminal. Both can be closed again via {{Keypress|Ctrl}}+{{Keypress|C}}.}}
+
==== 文件管理器的快捷键绑定 ====
 +
 
 +
图形化文件管理器中使用快捷键可能很实用(译者注:你也可以在 Zsh 中自定义快捷键达到这样的效果)。第一个使用 {{ic|Alt+Left}} 让用户撤销最近的 cd 操作,第二个使用 {{ic|Alt+Up}} 让用户进入上层目录。这两个快捷键同时也会显示目录中的内容。
  
===历史类似操作查看===
+
{{hc|~/.zshrc|<nowiki>
把下面的文字加入配置文件.zshrc中:
+
cdUndoKey() {
 +
  popd      > /dev/null
 +
  zle      reset-prompt
 +
  echo
 +
  ls
 +
  echo
 +
}
  
{{File|name=~/.zshrc|content=<nowiki>
+
cdParentKey() {
bindkey "^[[A" history-search-backward
+
  pushd .. > /dev/null
bindkey "^[[B" history-search-forward
+
  zle      reset-prompt
 +
  echo
 +
  ls
 +
  echo
 +
}
 +
 
 +
zle -N                cdParentKey
 +
zle -N                cdUndoKey
 +
bindkey '^[[1;3A'      cdParentKey
 +
bindkey '^[[1;3D'      cdUndoKey
 
</nowiki>}}
 
</nowiki>}}
  
这可以使开头和目前已输入的部分相同的历史操作会被显示出来。
+
=== 查找历史记录 ===
  
===Prompts===
+
{{hc|~/.zshrc|<nowiki>
 +
[[ -n "${key[PageUp]}"  ]]  && bindkey  "${key[PageUp]}"    history-beginning-search-backward
 +
[[ -n "${key[PageDown]}" ]]  && bindkey  "${key[PageDown]}"  history-beginning-search-forward
 +
</nowiki>}}
  
There is a quick and easy way to set up a colored prompt in Zsh. Make sure that prompt is set to autload in your {{Filename|.zshrc}}. This can be done by adding these lines to:
+
使用这段配置会只显示以当前命令开头的历史记录。
  
{{File|name=~/.zshrc|content=
+
=== 命令提示符 ===
 +
 
 +
这是一种 Zsh 中简单快速设置彩色提示符的方法。首先确保 {{ic|.zshrc}} 中配置了自动加载提示符。具体配置如下:
 +
 
 +
{{hc|~/.zshrc|
 
autoload -U promptinit
 
autoload -U promptinit
 
promptinit
 
promptinit
 
}}
 
}}
  
You can now see available prompts by running the command:
+
然后你可以运行下面的命令查看可用的提示符:
 
   
 
   
 
  $ prompt -l
 
  $ prompt -l
  
To try one of the commands that is listed, use the command prompt followed by the name of the prompt you like. For example, to use the "walters" prompt, you would enter:
+
使用下面命令来启动其中一种提示符,例如启动 "walters" 提示符:
 
   
 
   
 
  $ prompt walters
 
  $ prompt walters
  
===Customizing your prompt===
+
使用下面的命令查看所有可用的主题:
 +
 
 +
$ prompt -p
  
In case you are dissatisfied with the prompts mentioned above(or want to expand their usefulness), zsh offers the possibility to build your own custom prompt. Zsh supports a left- and right-sided prompt additional to the single, left-sided prompt that is common to all shells. To customize it, the following variables can be used:
+
=== 自定义命令提示符 ===
  
====Prompt variables====
+
对于那些不满足默认提示符的用户,Zsh 提供了自定义提示符的方法。除了普通终端会提供的靠左的提示符外,Zsh 还提供了靠右的提示符。通过配置 {{ic|1=PROMPT=}} 来设置。
=====常用=====
 
; %n : 用户名
 
; %m : The computer's hostname(truncated to the first period)
 
; %M : The computer's hostname
 
; %l : The current tty
 
; %? : The return code of the last-run application.
 
; %# : The prompt based on user privileges ({{Codeline|#}} for root and {{Codeline|%}} for the rest)
 
  
=====时间=====
+
可以参考 [http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html Prompt Expansion] 来获得所有可用的 prompt variables 和 conditional substrings。
; %T : 系统时间(格式为HH:MM)
 
; %* : 系统时间(格式为HH:MM:SS)
 
; %D : 系统日期(格式为YY-MM-DD)
 
  
=====路径=====
+
==== 彩色 ====
; %~ : 表示目前所在的工作路径。若在你的家目录$HOME,则会被替换为"~"。
 
; %d : 表示目前所在的工作路径。
 
  
For the options mentioned above: You can prefix an integer to show only certain parts of your working path. If you entered {{Codeline|%1d}} and found yourself in {{Codeline|/usr/bin}} it would show {{Codeline|bin}}. This can also be done with negative integers:
+
Zsh 设置彩色提示符的方法和 [[Color_Bash_Prompt|Bash]] 不同。 在 {{ic|.zshrc}} {{ic|1=PROMPT=}} 前面添加 {{ic|autoload -U colors && colors}} 来启用彩色提示符。通常你需要将这些配置放在 {{ic|%{ [...] %} }} 里面确保光标不移动。
{{Codeline|%-1d}} using the same directory as above would show {{Codeline|/}}.
 
  
=====格式化=====
+
{{ic|$fg[color]}} 会设置文本的颜色(红,绿,蓝,等等。默认是和之前的文本颜色保持一致)
; %U [...] %u : 给某段话下划线的开始和结束标识
 
; %B [...] %b : 给某段话加粗的开始和结束标识
 
; %{ [...] %} : 让某段话不显示在屏幕上的开始和结束标识。这是有用的,比如用于颜色设置。
 
  
=====配色=====
+
{| class="wikitable"
Zsh has a different approach to setting colors on the terminal than the one depicted [https://wiki.archlinux.org/index.php/Color_Bash_Prompt here]. First you write in your {{Codeline|.zshrc}}:
+
! 命令 || 描述
autoload -U colors && colors
+
|-
 +
| {{ic|%F{color} [...] %f}} || 和前面介绍的 $fg 是一样的,但是更简洁。还可以在 F 前面添加数字。
 +
|-
 +
| {{ic|$fg_no_bold[color]}}|| 设置文本为非粗体同时设定文本颜色
 +
|-
 +
| {{ic|$fg_bold[color]}}|| 设置文本为粗体同时设定文本颜色
 +
|-
 +
| {{ic|$reset_color}}|| 重置文本颜色(改为默认颜色)。不会重置粗体设定。使用 {{ic|%b}} 来重置粗体设定。可以使用 {{ic|%f}} 来简化配置。
 +
|-
 +
| {{ic|%K{color} [...] %k}} ||  设置背景颜色。和非粗体文本颜色一样。任何单一数字前缀会设置背景为黑色。
 +
|}
  
Following commands would now produce the color escape sequence needed to set the requested color when the prompt is printed:
+
{| class="wikitable"
; $fg[color] : will set the textcolor(red,green,blue, etc)
+
|-
; $reset_color : will reset the textcolor to white
+
! colspan="2" | Possible color values
It is useful to put these commands in {{Codeline|%{ [...] %}}}.
+
|-
 +
| 黑 {{ic|black}} or {{ic|0}} || 红 {{ic|red}} or {{ic|1}}
 +
|-
 +
| 绿 {{ic|green}} or {{ic|2}} || 黄 {{ic|yellow}} or {{ic|3}}
 +
|-
 +
| 蓝 {{ic|blue}} or {{ic|4}} || 紫 {{ic|magenta}} or {{ic|5}}
 +
|-
 +
| 青 {{ic|cyan}} or {{ic|6}} || 白 {{ic|white}} or {{ic|7}}
 +
|}
 +
 
 +
{{注意| 粗体文本不一定会和普通文本使用同一种颜色。例如, {{ic|$fg['yellow']}} 会使用暗一点的黄色, 而 {{ic|$fg_bold['yellow']}} 可能会使用亮一点的黄色。(译者注:具体是由你的终端模拟器配置决定的)}}
  
 
====示例====
 
====示例====
To have a two-sided prompt you could write:
+
 
 +
左右双边的提示符:
 
  PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%1~ %{$reset_color%}%#"
 
  PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%1~ %{$reset_color%}%#"
 
  RPROMPT="[%{$fg[yellow]%}%?%{$reset_color%}]"
 
  RPROMPT="[%{$fg[yellow]%}%?%{$reset_color%}]"
  
It would equal(without colors):
+
效果如下(忽略颜色):
 
  username@host ~ %                                                        [0]
 
  username@host ~ %                                                        [0]
  
===Advanced .zshrc files===
 
  
One could also find a great way to manage its Zsh configuration by using [https://github.com/robbyrussell/oh-my-zsh Oh-my-zsh] created by Robby Russel which contains a lot of user contributed plugins and themes but most importantly a great community of more than 900 forks on github.
+
=== 目录栈(dirstack) ===
 +
 
 +
Zsh 可以配置 DIRSTACK 相关变量来加速 cd 访问常用目录。在你的配置文件中添加下面的配置:
 +
 
 +
{{hc|.zshrc|<nowiki>
 +
DIRSTACKFILE="$HOME/.cache/zsh/dirs"
 +
if [[ -f $DIRSTACKFILE ]] && [[ $#dirstack -eq 0 ]]; then
 +
  dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
 +
  [[ -d $dirstack[1] ]] && cd $dirstack[1]
 +
fi
 +
chpwd() {
 +
  print -l $PWD ${(u)dirstack} >$DIRSTACKFILE
 +
}
 +
 
 +
DIRSTACKSIZE=20
 +
 
 +
setopt autopushd pushdsilent pushdtohome
 +
 
 +
## Remove duplicate entries
 +
setopt pushdignoredups
 +
 
 +
## This reverts the +/- operators.
 +
setopt pushdminus
 +
</nowiki>}}
  
This is an example of a more advanced {{Filename|.zshrc}}.
+
现在你可以使用
 +
dirs -v
 +
来打印目录栈(dirstack)。使用 {{ic|cd -<NUM>}} 来跳转到以前访问过的目录。你还可以在连字符后面使用自动补全,非常方便。
  
{{File|name=~/.zshrc|content=<nowiki>
 
###########################################################       
 
# Options for Zsh
 
  
export HISTFILE=~/.zsh_history
+
=== 帮助命令 ===
export HISTSIZE=50000
+
和 [[bash]] 不同的是 ''zsh'' 没有内置的 {{ic|help}} 命令,要想在 zsh 中使用 {{ic|help}},可以添加下面的配置:
export SAVEHIST=50000
 
eval `dircolors -b`
 
  
autoload -U compinit compinit
+
{{bc|1=
setopt autopushd pushdminus pushdsilent pushdtohome
+
autoload -U run-help
setopt autocd
+
autoload run-help-git
setopt cdablevars
+
autoload run-help-svn
setopt ignoreeof
+
autoload run-help-svk
setopt interactivecomments
+
unalias run-help
setopt nobanghist
+
alias help=run-help
setopt noclobber
+
}}
setopt HIST_REDUCE_BLANKS
 
setopt HIST_IGNORE_SPACE
 
setopt SH_WORD_SPLIT
 
setopt nohup
 
  
# PS1 and PS2
 
export PS1="$(print '%{\e[1;34m%}%n%{\e[0m%}'):$(print '%{\e[0;34m%}%~%{\e[0m%}')$ "
 
export PS2="$(print '%{\e[0;34m%}>%{\e[0m%}')"
 
  
# Vars used later on by Zsh
+
=== 仿 Fish 命令高亮 ===
export EDITOR="nano"
 
export BROWSER=links
 
export XTERM="aterm +sb -geometry 80x29 -fg black -bg lightgoldenrodyellow -fn -xos4-terminus-medium-*-normal-*-14-*-*-*-*-*-iso8859-15"
 
  
##################################################################
+
(译者注:Fish 是一款比较新的终端软件)[[Fish]] 提供了非常强大的命令高亮。如果你希望在 zsh 中使用类似的功能,你可以从官方仓库里安装 {{pkg|zsh-syntax-highlighting}},然后添加下面的配置到你的 zshrc 中:
# Stuff to make my life easier
+
{{bc|
 +
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
 +
}}
  
# allow approximate
 
zstyle ':completion:*' completer _complete _match _approximate
 
zstyle ':completion:*:match:*' original only
 
zstyle ':completion:*:approximate:*' max-errors 1 numeric
 
  
# tab completion for PID :D
+
=== .zshrc 样例 ===
zstyle ':completion:*:*:kill:*' menu yes select
 
zstyle ':completion:*:kill:*' force-list always
 
  
# cd not select parent dir
+
* 官方仓库里来自 http://grml.org/zsh 的软件包 {{Pkg|grml-zsh-config}} 中包含了很多 Zsh 的配置技巧
zstyle ':completion:*:cd:*' ignore-parents parent pwd
+
* http://github.com/MrElendig/dotfiles-alice/blob/master/.zshrc 包含一些动态提示符和终端窗口标题等基本配置
 +
* https://github.com/slashbeast/things/blob/master/configs/DOTzshrc 拥有很多特性的 zsh 配置,注意阅读它的注释。值得注目的特性:关机、重启和睡眠的用户确认交互函数,命令提示符内支持 GIT(没有使用 vcsinfo),菜单使用 tab 补全,打印当前执行的命令到终端窗口的标题上,等等。
  
# useful for path editing — backward-delete-word, but with / as additional delimiter
 
backward-delete-to-slash () {
 
  local WORDCHARS=${WORDCHARS//\//}
 
  zle .backward-delete-word
 
}
 
zle -N backward-delete-to-slash
 
  
##################################################################
+
=== 配置框架 ===
# Key bindings
+
 
# http://mundy.yazzy.org/unix/zsh.php
+
* [https://github.com/robbyrussell/oh-my-zsh oh-my-zsh] 是一个著名的,社区驱动的框架,它拥有很多有用的函数,helpers,插件,主题,可以用来简化复杂的 Zsh 配置。
# http://www.zsh.org/mla/users/2000/msg00727.html
+
* [https://github.com/sorin-ionescu/prezto Prezto - Instantly Awesome Zsh](可以通过 {{AUR|prezto-git}} 获取) 它是一个模块化的 Zsh 配置框架,里面有很多顺手的默认配置、别名、函数、自动补全和命令提示符主题。
 +
* [https://github.com/zsh-users/antigen Antigen] (可以通过 {{AUR|antigen-git}} 获取) 这个一个 zsh 插件管理器,受到 oh-my-zsh 和 vundle 的启发
 +
 
 +
 
 +
=== 自启动程序 ===
 +
 
 +
{{注意|{{ic|$ZDOTDIR}} 默认指向 {{ic|$HOME}}}}
 +
 
 +
Zsh 经常执行 {{ic|/etc/zsh/zshenv}} 和 {{ic|$ZDOTDIR/.zshenv}},所以不要让他们变得很臃肿。
 +
 
 +
如果是一个登录了的终端,会加载 {{ic|/etc/profile}} 然后加载 {{ic|$ZDOTDIR/.zprofile}}。然后如果是交互式模式,会继续加载 {{ic|/etc/zsh/zshrc}} 接着加载 {{ic|$ZDOTDIR/.zshrc}} 。最后如果还是登录了的终端,{{ic|/etc/zsh/zlogin}} 和 {{ic|$ZDOTDIR/.zlogin}} 也会被加载。
 +
 
 +
另请参见 {{man|1|zsh}} 的 ''STARTUP/SHUTDOWN FILES'' 章节。
 +
 
 +
 
 +
=== 刷新自动补全 ===
 +
 
 +
一般来说,compinit 不会自动在 $PATH 里面查找新的可执行文件。例如当你安装了一个新的软件包,/usr/bin 里的新文件不会立即自动添加到自动补全当中。所以你需要执行下面的命令来将它们添加进自动补全:
  
typeset -g -A key
+
$ rehash
bindkey '^?' backward-delete-char
 
bindkey '^[[1~' beginning-of-line
 
bindkey '^[[5~' up-line-or-history
 
bindkey '^[[3~' delete-char
 
bindkey '^[[4~' end-of-line
 
bindkey '^[[6~' down-line-or-history
 
bindkey '^[[A' up-line-or-search
 
bindkey '^[[D' backward-char
 
bindkey '^[[B' down-line-or-search
 
bindkey '^[[C' forward-char
 
bindkey '^[w' backward-delete-to-slash
 
# completion in the middle of a line
 
bindkey '^i' expand-or-complete-prefix
 
  
##################################################################
+
这个 'rehash' 可以被放到你的 {{ic|zshrc}} 来自动执行
# My aliases
 
  
# Set up auto extension stuff
+
{{hc|~/.zshrc|zstyle ':completion:*' rehash true}}
alias -s html=$BROWSER
 
alias -s org=$BROWSER
 
alias -s php=$BROWSER
 
alias -s com=$BROWSER
 
alias -s net=$BROWSER
 
alias -s png=feh
 
alias -s jpg=feh
 
alias -s gif=feg
 
alias -s sxw=soffice
 
alias -s doc=soffice
 
alias -s gz='tar -xzvf'
 
alias -s bz2='tar -xjvf'
 
alias -s java=$EDITOR
 
alias -s txt=$EDITOR
 
alias -s PKGBUILD=$EDITOR
 
  
# Normal aliases
+
{{注意|这个技巧在 Oh My Zsh [https://github.com/robbyrussell/oh-my-zsh/issues/3440] 的一次 PR 中被发现}}
alias ls='ls --color=auto -F'
 
alias lsd='ls -ld *(-/DN)'
 
alias lsa='ls -ld .*'
 
alias f='find |grep'
 
alias c="clear"
 
alias dir='ls -1'
 
alias gvim='gvim -geom 82x35'
 
alias ..='cd ..'
 
alias nicotine='/home/paul/downloads/nicotine-1.0.8rc1/nicotine'
 
alias ppp-on='sudo /usr/sbin/ppp-on'
 
alias ppp-off='sudo /usr/sbin/ppp-off'
 
alias firestarter='sudo su -c firestarter'
 
alias mpg123='mpg123 -o oss'
 
alias mpg321='mpg123 -o oss'
 
alias vba='/home/paul/downloads/VisualBoyAdvance -f 4'
 
alias hist="grep '$1' /home/paul/.zsh_history"
 
alias irssi="irssi -c irc.freenode.net -n yyz"
 
alias mem="free -m"
 
alias msn="tmsnc -l hutchy@subdimension.com"
 
  
# command L equivalent to command |less
 
alias -g L='|less'
 
  
# command S equivalent to command &> /dev/null &
 
alias -g S='&> /dev/null &'
 
</nowiki>}}
 
  
There are many more ways that you can customise Zsh, obviously far too many to list here, see the [http://zsh.sourceforge.net/Doc/Release/zsh.html Zsh manual] for more information.
+
== 卸载 ==
  
===.zshrc文件实例===
+
在卸载 {{Pkg|zsh}} 之前请先更换默认终端。
  
这是一些用户的{{Filename|.zshrc}}配置文件,如果你认为你的配置也很有特色,欢迎加进这个列表里:
+
{{警告|如果不遵循下面的步骤可能会导致用户无法访问任何终端}}
  
 +
运行下面的命令:
  
* [https://github.com/robbyrussell/oh-my-zsh Oh-my-zsh Plugin and Theme system for Zsh] is a must have to manage your zshrc file and to take advantage of a huge community of over 900 forks on github;
+
$ chsh -s /bin/bash ''user''
* Basic setup, with dynamic prompt and window title/hardinfo => http://github.com/MrElendig/dotfiles-alice/blob/master/.zshrc;
 
* An Arch package named [https://www.archlinux.org/packages/extra/any/grml-zsh-config/ grml-zsh-config] comes from http://grml.org/zsh and provides a zshrc file that includes many tweaks for your zshell.
 
* https://github.com/slashbeast/things/blob/master/configs/DOTzshrc - zshrc with multiple features, be sure to check out comments into it. Notable features: confirm function to ensure that user wnat to run poweroff, reboot or hibernate, support for GIT in prompt (done without vcsinfo), tab complation with menu, printing current executed command into window's title bar and more.
 
  
==全局配置==
+
每一个使用 ''zsh'' 作为默认终端的用户都需要执行一遍条命令。当完成之后就可以把 {{Pkg|zsh}} 软件包删除了。
Occasionally you might want to have some settings applied globally to all zsh users. The zsh wiki tells us that there are some global configuration files, for example {{Filename|/etc/zshrc}}. This however is slightly different on ArchLinux, since it has been compiled with flags specifically to target {{Filename|/etc/zsh/}} instead.
 
  
So, for global configuration use {{Filename|/etc/zsh/zshrc}}, not {{Filename|/etc/zshrc}}. The same goes for {{Filename|/etc/zsh/zshenv}}, {{Filename|/etc/zsh/zlogin}} and {{Filename|/etc/zsh/zlogout}}. Note that these files are not installed by default, so you need to create them yourself if you want to use them.
+
当然你也也可以以 root 身份修改 {{ic|/etc/passwd}} 文件,来批量更改用户的默认终端。
  
The only exception is zprofile, use {{Filename|/etc/profile}} instead.
+
{{警告|强烈建议使用 {{ic|vipw}} 来修改 {{ic|/etc/passwd}},因为它可以帮助你消灭格式错误}}
  
===自动开启应用===
+
例如将下面的配置中的 /bin/zsh
Zsh always executes {{Filename|/etc/zsh/zshenv}} and {{Filename|$ZDOTDIR/.zshenv}} so do not bloat these files.
 
  
If the shell is a login shell, commands are read from {{Filename|/etc/profile}} and then {{Filename|$ZDOTDIR/.zprofile}}. Then, if the shell is interactive, commands are read from {{Filename|/etc/zsh/zshrc}} and then {{Filename|$ZDOTDIR/.zshrc}}. Finally, if the shell is a login shell, {{Filename|/etc/zsh/zlogin}} and {{Filename|$ZDOTDIR/.zlogin}} are read.
+
''username'':x:1000:1000:''Full Name'',,,:/home/''username'':/bin/zsh
  
==卸载==
+
改成 /bin/bash
若想卸载,先要改变默认虚拟终端,比如,先恢复成Bash。
 
  
按照[[Zsh#Making Zsh your default shell]]的方法改变默认虚拟终端,把zsh替换为bash即可恢复默认虚拟终端为bash。
+
''username'':x:1000:1000:''Full Name'',,,:/home/''username'':/bin/bash
  
之后,就可以安全地卸载Zsh软件包了。
 
  
{{Warning| 若上述步骤失败,将引发众多问题,所以请务必严格执行之。}}
 
  
若没按照上面所述去做,还可以用另外的方式改变默认虚拟终端,方法是以根用户身份修改 /etc/passwd 例如:
+
== 另请参见 ==
 
把:
 
username:x:1000:1000:Full Name,,,:/home/username:/bin/zsh
 
改为:
 
username:x:1000:1000:Full Name,,,:/home/username:/bin/bash
 
  
==更多信息可见==
+
*[http://zsh.sourceforge.net/Guide/zshguide.html A User's Guide to ZSH]
*[http://zsh.sourceforge.net/Intro/intro_1.html#SEC1 Zsh Introduction]
+
*[http://zsh.sourceforge.net/Doc/Release/index-frame.html The Z Shell Manual] (different format available [http://zsh.sourceforge.net/Doc/ here])
*[http://zsh.sourceforge.net/Guide/zshguide.html Users Guide]
 
*[http://zsh.sourceforge.net/Doc/Release/index-frame.html Zsh Docs] (you can choose a different format for the doc in http://zsh.sourceforge.net/Doc/)
 
 
*[http://zsh.sourceforge.net/FAQ/zshfaq01.html Zsh FAQ]
 
*[http://zsh.sourceforge.net/FAQ/zshfaq01.html Zsh FAQ]
 +
*[http://grml.org/zsh/zsh-lovers.html zsh-lovers(1)] (this is also available as {{pkg|zsh-lovers}} in offical repository)
 
*[http://zshwiki.org/home/ Zsh Wiki]
 
*[http://zshwiki.org/home/ Zsh Wiki]
*[http://grml.org/zsh/zsh-lovers.html Zsh-lovers]
+
*[https://wiki.gentoo.org/wiki/Zsh/HOWTO Gentoo Wiki: Zsh/HOWTO]
 
*[http://www.bash2zsh.com/zsh_refcard/refcard.pdf Bash2Zsh Reference Card]
 
*[http://www.bash2zsh.com/zsh_refcard/refcard.pdf Bash2Zsh Reference Card]
*[https://github.com/robbyrussell/oh-my-zsh Oh My Zshell by Robby Russell]
 
*[http://www.gentoo.org/doc/en/zsh.xml Gentoo zsh wiki article]
 
*[http://my.opera.com/blackbelt_jones/blog/2007/06/05/zsh-prompt-configuration-issue-solved Setting up the zsh prompt]
 
 
*'''IRC channel''': #zsh at irc.freenode.org
 

Latest revision as of 08:46, 5 June 2019

翻译状态: 本文是英文页面 Zsh翻译,最后翻译时间:2016-01-17,点击这里可以查看翻译后英文页面的改动。

Zsh 是一款功能强大的终端(shell)软件,既可以作为一个交互式终端,也可以作为一个脚本解释器。它在兼容 Bash 的同时 (默认不兼容,除非设置成 emulate sh) 还有提供了很多改进,例如:

  • 更高效
  • 更好的自动补全
  • 更好的文件名展开(通配符展开)
  • 更好的数组处理
  • 可定制性高

Zsh 常见问题解答 中提供了更多使用 Zsh 的理由。

安装

在开始安装之前,你或许想查看一下自己目前使用的终端是什么:

$ echo $SHELL

zsh官方维护仓库中,可以和其他类似软件一样安装。如果希望使用额外的补全功能,可以安装 zsh-completions 软件包。

初始化配置文件

可以运行下面的命令来检查 Zsh 是否被正确得安装:

$ zsh

运行后你将会看到 新用户向导(zsh-newuser-install),它可以帮助你完成一些最基本的配置。如果你想跳过它,可以按 q 键退出。如果你没有看见它,你可以手动打开 新用户向导

$ zsh /usr/share/zsh/functions/Newuser/zsh-newuser-install -f

将 Zsh 作为默认终端

另请参见 更改你的默认终端

提示: 如果你要替换 bash,你也许想转移 ~/.bashrc 中的某些配置到 ~/.zshrc (例如:命令提示符和别名),以及转移 ~/.bash_profile 中的配置到 ~/.zprofile (例如:启动 X Window System 的代码)。


配置文件介绍

当 Zsh 启动时,它会按照顺序依次读取下面的配置文件:

/etc/zsh/zshenv
该文件应该包含用来设置PATH 环境变量[broken link: invalid section]以及其他一些环境变量的命令;不应该包含那些可以产生输出结果或者假设终端已经附着到 tty 上的命令。
~/.zshenv
该文件和 /etc/zsh/zshenv 相似,但是它是针对每个用户而言的。一般来说是用来设置一些有用的环境变量。
/etc/zsh/zprofile
这是一个全局的配置文件,在用户登录的时候加载。一般是用来在登录的时候执行一些命令。请注意,在 Arch Linux 里该文件默认包含一行配置,用来加载 /etc/profile 文件,详见 #全局配置文件
/etc/profile
在登录时,该文件应该被所有和伯克利(Bourne)终端相兼容的终端加载:它在登录的的时候会加载应用相关的配置(/etc/profile.d/*.sh)。注意在 Arch Linux 里,Zsh 会默认加载该文件。
~/.zprofile
该文件一般用来在登录的时候自动执行一些用户脚本。
/etc/zsh/zshrc
当 Zsh 被作为交互式终端的时候,会加载这样一个全局配置文件。
~/.zshrc
当 Zsh 被作为交互式终端的时候,会加载这样一个用户配置文件。
/etc/zsh/zlogin
在登录完毕后加载的一个全局配置文件。
~/.zlogin
/etc/zsh/zlogin 相似,但是它是针对每个用户而言的。
/etc/zsh/zlogout
在注销的时候被加载的一个全局配置文件。
~/.zlogout
/etc/zsh/zlogout 相似,但是它是针对每个用户而言的.
注意:
  • 在 Arch 源中的 zsh 所使用的文件路径和 Zsh 的 man 手册中默认的不同(详见 #全局配置文件
  • /etc/profile 不是 Zsh 常规启动配置文件的一部分,但是 Arch 源中的 zsh 会在 /etc/zsh/zprofile 里面加载它。用户应该注意 /etc/profile 里面设置的 $PATH 环境变量会覆盖掉 ~/.zshenv 里面配置的任何 $PATH。为了防止这一点,请在 ~/.zshrc 当中设置 $PATH(不推荐替换掉 /etc/zsh/zprofile 里面的默认配置,因为这样会破坏其他提供了 /etc/profile.d 的软件包和 Zsh 的联动关系)

全局配置文件

有时候你可能想提供一些所有 Zsh 用户共享的配置。在帮助手册 zsh(1) 提到的一些全局配置文件(例如 /etc/zshrc)的路径,在 Arch Linux 里是有一些不同的,因为 it has been compiled with flags specifically to target[1] /etc/zsh/ instead.

所以,Arch 源中 zsh 的全局配置文件会使用 /etc/zsh/zshrc 而不是 /etc/zshrc。类似的还有 /etc/zsh/zshenv/etc/zsh/zlogin/etc/zsh/zlogout。注意这些文件不是默认就被创建好的,你可以根据需要来创建它们。

唯一的例外是 zprofile,请使用 /etc/profile


配置 Zsh

尽管 Zsh 基本不需要怎么配置就能满足大多数用户的需求,但是因为其中包含太多的可定制选项,导致配置 Zsh 可能会比较耗时。

简单的 .zshrc

下面是一个简单的 .zshrc 配置文件,它提供一个配置 Zsh 的生动的例子。你可以将下面的配置保存为文件 .zshrc 来使用它。

~/.zshrc
autoload -U compinit promptinit
compinit
promptinit

# 设置 walters 主题的默认命令行提示符
prompt walters
提示: 你可以执行命令 source ~/.zshrc 来生效修改的配置,而不需要重新登录

配置 $PATH

将下面的配置放到 ~/.zshenv 中:

~/.zshenv
typeset -U path
path=(~/bin /other/things/in/path $path[@])

另请参见 《A User's Guide to the Z-Shell(Z-Shell 用户指南)》#Configuration files[broken link: invalid section] 中的相关内容。

命令补全

也许 Zsh 最引人注目的特性就是它先进的自动补全功能。在 ~/.zshrc 最后加入下面的配置,开启自动补全:

~/.zshrc
autoload -U compinit
compinit

上面的补全配置包括 ssh/scp/sftp 命令中的主机名(host name)补全。但是要让这个特性正常工作,你需要防止 ~/.ssh/known_hosts 中的主机名被散列化(hash)。

警告: 主机名去散列化可能会导致本机成为 跳跃式攻击("Island-hopping" attacks)的跳板。如果你希望 Zsh 自动补全主机名,你可以注释掉 /etc/ssh/ssh_config 当中的这行配置,或者设置为 no
/etc/ssh/ssh_config
#HashKnownHosts yes

你可以将原来的 ~/.ssh/known_hosts 移动到别的地方,之后 ssh 创建的 ~/.ssh/known_hosts 文件就不会散列化主机名(但是之前信任的主机如果需要,还得重新导入进来)。具体请参考 ssh 的 README 文件中散列化主机名的相关内容。

添加下面的配置可以启动使用方向键控制的自动补全:

~/.zshrc
zstyle ':completion:*' menu select
按两次 tab 键启动菜单

添加下面的配置可以启动命令行别名的自动补全:

~/.zshrc
setopt completealiases

"command not found" 钩子

另请参见 Pkgfile#Command not found

消除历史记录中的重复条目

~/.zshrc
setopt HIST_IGNORE_DUPS

假如目前的历史记录中已经有重复条目,可以运行下面的命令清除

$ sort -t ";" -k 2 -u ~/.zsh_history | sort -o ~/.zsh_history

ttyctl 命令

[2] 描述了 Zsh 中的 ttyctl 命令。它可以用来锁定/解锁(freeze/unfreeze)终端。许多程序会修改终端的状态并且在异常退出的时候不会还原初始状态。下面的配置可以避免手动重置终端。

~/.zshrc
ttyctl -f

快捷键绑定

Zsh 使用自带的 zle 代替 readline,并且不会读取 /etc/inputrc 或者 ~/.inputrc。 Zle 有 emacsvi 两个模式,默认情况下它根据环境变量 $EDITOR 来决定使用哪一个模式,如果为空默认为 emacs 模式。使用 bindkey -e 或者 bindkey -v 来手动指定模式。 另请参见 zshwiki: bindkeys.

ncurses 应用的快捷键绑定

(译者注:ncurses 是一个字符界面下的 GUI 框架)如果直接将 ncurses 应用绑定到某个快捷键,那么它会失去交互性。可以使用变量 BUFFER 来解决这个问题。下面的例子是使用 Alt+\ 来打开 ncmpcpp:

~/.zshrc
ncmpcppShow() { BUFFER="ncmpcpp"; zle accept-line; }
zle -N ncmpcppShow
bindkey '^[\' ncmpcppShow

另一种方法

该方法会在启动应用之前,将你的输入保存在一行当中。

~/.zshrc
ncmpcppShow() { ncmpcpp <$TTY; zle redisplay; }
zle -N ncmpcppShow
bindkey '^[\' ncmpcppShow

文件管理器的快捷键绑定

图形化文件管理器中使用快捷键可能很实用(译者注:你也可以在 Zsh 中自定义快捷键达到这样的效果)。第一个使用 Alt+Left 让用户撤销最近的 cd 操作,第二个使用 Alt+Up 让用户进入上层目录。这两个快捷键同时也会显示目录中的内容。

~/.zshrc
cdUndoKey() {
  popd      > /dev/null
  zle       reset-prompt
  echo
  ls
  echo
}

cdParentKey() {
  pushd .. > /dev/null
  zle      reset-prompt
  echo
  ls
  echo
}

zle -N                 cdParentKey
zle -N                 cdUndoKey
bindkey '^[[1;3A'      cdParentKey
bindkey '^[[1;3D'      cdUndoKey

查找历史记录

~/.zshrc
[[ -n "${key[PageUp]}"   ]]  && bindkey  "${key[PageUp]}"    history-beginning-search-backward
[[ -n "${key[PageDown]}" ]]  && bindkey  "${key[PageDown]}"  history-beginning-search-forward

使用这段配置会只显示以当前命令开头的历史记录。

命令提示符

这是一种 Zsh 中简单快速设置彩色提示符的方法。首先确保 .zshrc 中配置了自动加载提示符。具体配置如下:

~/.zshrc
autoload -U promptinit
promptinit

然后你可以运行下面的命令查看可用的提示符:

$ prompt -l

使用下面命令来启动其中一种提示符,例如启动 "walters" 提示符:

$ prompt walters

使用下面的命令查看所有可用的主题:

$ prompt -p

自定义命令提示符

对于那些不满足默认提示符的用户,Zsh 提供了自定义提示符的方法。除了普通终端会提供的靠左的提示符外,Zsh 还提供了靠右的提示符。通过配置 PROMPT= 来设置。

可以参考 Prompt Expansion 来获得所有可用的 prompt variables 和 conditional substrings。

彩色

Zsh 设置彩色提示符的方法和 Bash 不同。 在 .zshrcPROMPT= 前面添加 autoload -U colors && colors 来启用彩色提示符。通常你需要将这些配置放在 %{ [...] %} 里面确保光标不移动。

$fg[color] 会设置文本的颜色(红,绿,蓝,等等。默认是和之前的文本颜色保持一致)

命令 描述
%F{color} [...] %f 和前面介绍的 $fg 是一样的,但是更简洁。还可以在 F 前面添加数字。
$fg_no_bold[color] 设置文本为非粗体同时设定文本颜色
$fg_bold[color] 设置文本为粗体同时设定文本颜色
$reset_color 重置文本颜色(改为默认颜色)。不会重置粗体设定。使用 %b 来重置粗体设定。可以使用 %f 来简化配置。
%K{color} [...] %k 设置背景颜色。和非粗体文本颜色一样。任何单一数字前缀会设置背景为黑色。
Possible color values
black or 0 red or 1
绿 green or 2 yellow or 3
blue or 4 magenta or 5
cyan or 6 white or 7
注意: 粗体文本不一定会和普通文本使用同一种颜色。例如, $fg['yellow'] 会使用暗一点的黄色, 而 $fg_bold['yellow'] 可能会使用亮一点的黄色。(译者注:具体是由你的终端模拟器配置决定的)

示例

左右双边的提示符:

PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%1~ %{$reset_color%}%#"
RPROMPT="[%{$fg[yellow]%}%?%{$reset_color%}]"

效果如下(忽略颜色):

username@host ~ %                                                         [0]


目录栈(dirstack)

Zsh 可以配置 DIRSTACK 相关变量来加速 cd 访问常用目录。在你的配置文件中添加下面的配置:

.zshrc
DIRSTACKFILE="$HOME/.cache/zsh/dirs"
if [[ -f $DIRSTACKFILE ]] && [[ $#dirstack -eq 0 ]]; then
  dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
  [[ -d $dirstack[1] ]] && cd $dirstack[1]
fi
chpwd() {
  print -l $PWD ${(u)dirstack} >$DIRSTACKFILE
}

DIRSTACKSIZE=20

setopt autopushd pushdsilent pushdtohome

## Remove duplicate entries
setopt pushdignoredups

## This reverts the +/- operators.
setopt pushdminus

现在你可以使用

dirs -v

来打印目录栈(dirstack)。使用 cd -<NUM> 来跳转到以前访问过的目录。你还可以在连字符后面使用自动补全,非常方便。


帮助命令

bash 不同的是 zsh 没有内置的 help 命令,要想在 zsh 中使用 help,可以添加下面的配置:

autoload -U run-help
autoload run-help-git
autoload run-help-svn
autoload run-help-svk
unalias run-help
alias help=run-help


仿 Fish 命令高亮

(译者注:Fish 是一款比较新的终端软件)Fish 提供了非常强大的命令高亮。如果你希望在 zsh 中使用类似的功能,你可以从官方仓库里安装 zsh-syntax-highlighting,然后添加下面的配置到你的 zshrc 中:

source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh


.zshrc 样例


配置框架

  • oh-my-zsh 是一个著名的,社区驱动的框架,它拥有很多有用的函数,helpers,插件,主题,可以用来简化复杂的 Zsh 配置。
  • Prezto - Instantly Awesome Zsh(可以通过 prezto-gitAUR 获取) 它是一个模块化的 Zsh 配置框架,里面有很多顺手的默认配置、别名、函数、自动补全和命令提示符主题。
  • Antigen (可以通过 antigen-gitAUR 获取) 这个一个 zsh 插件管理器,受到 oh-my-zsh 和 vundle 的启发


自启动程序

注意: $ZDOTDIR 默认指向 $HOME

Zsh 经常执行 /etc/zsh/zshenv$ZDOTDIR/.zshenv,所以不要让他们变得很臃肿。

如果是一个登录了的终端,会加载 /etc/profile 然后加载 $ZDOTDIR/.zprofile。然后如果是交互式模式,会继续加载 /etc/zsh/zshrc 接着加载 $ZDOTDIR/.zshrc 。最后如果还是登录了的终端,/etc/zsh/zlogin$ZDOTDIR/.zlogin 也会被加载。

另请参见 zsh(1)STARTUP/SHUTDOWN FILES 章节。


刷新自动补全

一般来说,compinit 不会自动在 $PATH 里面查找新的可执行文件。例如当你安装了一个新的软件包,/usr/bin 里的新文件不会立即自动添加到自动补全当中。所以你需要执行下面的命令来将它们添加进自动补全:

$ rehash

这个 'rehash' 可以被放到你的 zshrc 来自动执行

~/.zshrc
zstyle ':completion:*' rehash true
注意: 这个技巧在 Oh My Zsh [3] 的一次 PR 中被发现


卸载

在卸载 zsh 之前请先更换默认终端。

警告: 如果不遵循下面的步骤可能会导致用户无法访问任何终端

运行下面的命令:

$ chsh -s /bin/bash user

每一个使用 zsh 作为默认终端的用户都需要执行一遍条命令。当完成之后就可以把 zsh 软件包删除了。

当然你也也可以以 root 身份修改 /etc/passwd 文件,来批量更改用户的默认终端。

警告: 强烈建议使用 vipw 来修改 /etc/passwd,因为它可以帮助你消灭格式错误

例如将下面的配置中的 /bin/zsh

username:x:1000:1000:Full Name,,,:/home/username:/bin/zsh

改成 /bin/bash

username:x:1000:1000:Full Name,,,:/home/username:/bin/bash


另请参见