苹果已经宣布,在macOS 10.15 Catalina中,默认外壳为zsh
。html
在本系列中,我将记录我将bash
设置,配置和脚本移至的经验zsh
。git
本系列 已发展成一本书:进行了从新设计,并扩展了更多详细信息和主题。 与其余书籍同样,我计划在发行后也进行更新和添加,以保持其相关性和实用性。您如今 能够在Apple Books Store上订购它。
正如我在前面的帖子中所提到的,我知道有不少解决方案能够为您提供预先配置的“捷径”,从而使您zsh
受益不浅。可是我有兴趣学习这种没有捷径的“艰难方式”。叫我老式。(“上坡!在雪中!双向!”)github
bash
macOS上的默认提示很是详尽。它显示用户名,主机名_和_当前目录。shell
Calypso:~ armin$
另外一方面,默认的bash提示符不显示前一个命令的退出代码,我发现这条信息很是有用。在从新配置bash
提示以获取所需信息以前,我已经写了如下内容:express
固然,我想在中从新建立相同的体验zsh
。macos
与bash
提示惟一(视觉上)的区别是%
而不是$
。vim
注意:建立文件~/.hushlogin
将在每一个终端会话开始zsh
以及以后bash
(或任何其余Shell中)禁止显示状态消息。
尽管使用不一样的语法,但基本zsh
提示配置的工做原理与类似bash
。手册中详细zsh
描述了不一样的占位符。bash
zsh
使用相同的shell变量PS1
存储默认提示。可是,变量名PROMPT
和prompt
是它们的同义词PS1
,您将在各类示例中看到这三个变量中的任何一个。我要用PROMPT
。app
中的默认提示zsh
是%m%#
。在%m
示出了主机名的第一个元素,所述%#
示出了#
当电流提示具备超级用户权限(例如后一sudo -s
)和不然%
符号(默认zsh
提示符号)。布局
在zsh
默认的提示是远远高于短bash
默认,但即便是用处不大。因为我大部分时间都在本地系统上工做,所以主机名不包含任何有用的信息,所以每行重复一次都是多余的。
注意:您能够争辩说,当您常常有多个终端窗口打开到不一样的主机时,提示中的主机名颇有用。的确如此,可是提示是由_远程_外壳程序及其在_远程_主机上的配置文件定义的。在配置文件中,您能够测试是否
SSH_CLIENT
设置了变量,并显示不一样的远程会话提示。在远程Shell会话中有更多显示主机的方法,例如在“终端”窗口标题栏中或使用不一样的窗口背景颜色。
在咱们的第一次迭代中,我想显示当前的工做目录而不是主机名。当你经过zsh的文档中的提示占位符列表中,你会发现%d
,%/
和%~
。前两个彻底同样。最后一个替换将显示一个路径,该路径从用户的主目录开始,并带有~
,所以它将缩短/Users/armin/Projects/
为~/Projects
。
注意:最后,您要PROMPT
在.zshrc
文件中设置变量,这样它将在全部zsh
会话中生效。可是,对于测试,您能够只PROMPT
在交互式外壳中更改变量。这将当即为您提供反馈,说明您当前的设置如何工做。
% PROMPT='%/ %# ' /Users/armin/Projects/dotfiles/zshfunctions % % PROMPT='%~ %# ' ~/Projects/dotfiles/zshfunctions %
请注意提示字符串中的尾随空格,以将最后一个%
或#
命令条目分隔开。
我更喜欢该%~
选项的较短输出,可是根据您的工做目录,它仍然可能很长。zsh
有一个技巧:在和n
之间插入数字时,只会显示路径的最后一个元素:%
`~`n
% PROMPT='%2~ %# ' dotfiles/zshfunctions %
当您执行%1~
此操做时,它将仅显示工做目录的名称或~
它是否为主目录。(%/
例如,这也适用%2/
。)
在提示中添加一些颜色或灰色阴影可使其更具可读性。在其中,bash
您须要使用隐蔽的转义码来切换颜色。zsh
提供了一种更简单的方法。要将路径中的目录变为蓝色,可使用:
PROMPT='%F{blue}%1~%f %# '
该F
表明“前景颜色”。zsh
理解颜色black
,red
,green
,yellow
,blue
,magenta
,cyan
和white
。%F
或%f
重置为默认文本颜色。此外,Terminal.app将自身表示为外壳的256色终端。您可使用
% echo $TERM xterm-256color
您能够经过访问256调色板%F{0}
经过%F{255}
。表格显示哪些数字对应哪一种颜色:
所以,因为我但愿在提示符下为当前工做目录添加深灰色,所以我选择了240
,并使用如下%B
代码将其设置为粗体:
PROMPT='%B%F{240}%1~%f%b %# '
我写了整篇文章,介绍如何bash
显示最后一个命令的用颜色编码的退出代码。事实证实,这在中_要_容易_得多_zsh
。
提示代码之一提供了“三进制条件”,这意味着它将根据条件显示两个表达式之一。您可使用几种条件。再次能够在文档中找到详细信息。
前面的命令退出代码有一个条件:
%(?.<success expression>.<failure expression>)
<success expression>
当前一个命令成功退出(退出代码为零)和<failure expression>
前一个命令失败(退出代码为非零)时,该表达式将使用。所以,创建条件提示很是容易:
% PROMPT='%(?.√.?%?) %1~ %# ' √ ~ % false ?1 ~ %
您能够√
在美国或国际macOS键盘布局上使用选项-V得到字符。三元组的最后一部分?%?
看起来使人困惑。第一部分?
将打印文字问号,第二部分%?
将替换为先前命令的退出代码。
您也能够在三元表达式中添加颜色:
PROMPT='%(?.%F{green}√.%F{red}?%?)%f %B%F{240}%1~%f%b %# '
另外一个有趣的条件代码是!
返回是否对shell授予特权(即以root用户身份运行)。这使咱们能够将默认提示符号从更改成其余提示%
,同时以root身份运行时保持警告功能:
% PROMPT='%1~ %(!.#.>) ' ~ > sudo -s ~ # exit ~ >
这是咱们组装的完整提示,其中解释了全部部分:
PROMPT='%(?.%F{green}√.%F{red}?%?)%f %B%F{240}%1~%f%b %# '
%(?.√.?%?)
若是返回码?
为0,则显示√
,不然显示?%?
%?
上一条命令的退出代码
%1~
当前工做目录,缩短到~
,仅显示最后一个1
元素
%#
#
具备root特权,%
不然
%B
`%b`
开始/中止加粗
%F{...}
文字(前景)颜色,请参见表
%f
重置为默认文本颜色
zsh
还提供了右侧提示。它使用与“普通”提示相同的占位符。使用RPROMPT
变量设置右侧提示:
% RPROMPT='%*' √ zshfunctions % 11:02:55
zsh
键入长命令时,光标到达时将自动隐藏右提示。您能够在左侧提示中使用全部其余替换,包括右侧提示中的颜色和其余可视标记。
zsh
包括版本控制系统的一些基本集成。再次有大量但难以理解的文档描述。
我在“ Pro git”文档中找到了一个更好,更具体的示例。此示例将在右侧提示中显示当前分支。
我已经更改了示例,以包括存储库名称和分支,并更改了颜色。
autoload -Uz vcs_info precmd_vcs_info() { vcs_info } precmd_functions+=( precmd_vcs_info ) setopt prompt_subst RPROMPT=\$vcs_info_msg_0_ zstyle ':vcs_info:git:*' formats '%F{240}(%b)%r%f' zstyle ':vcs_info:*' enable git
在这种状况下%b
,%r
它们是分支机构和存储库名称的VCS(版本控制系统)系统的占位符。
git
除了内置模块以外,还有其余快速解决方案,它们可提供更多信息。存储库中有一个脚本git
,而且许多较大的zsh
主题项目,例如“oh-my-zsh”和“prezto”,具备各类git status小部件或模块或主题,或它们所谓的名称。
您可能会花费不少时间(或浪费时间)来微调提示。这些修改是否真的能够提升您的生产率是一个问题。