转到zsh,第6部分–自定义zsh提示
苹果已经宣布,在macOS 10.15 Catalina中,默认外壳为zsh
。
在本系列中,我将记录我将bash
设置,配置和脚本移至的经验zsh
。
本系列 已发展成一本书:进行了重新设计,并扩展了更多详细信息和主题。 与其他书籍一样,我计划在发行后也进行更新和添加,以保持其相关性和实用性。您现在 可以在Apple Books Store上订购它。
正如我在前面的帖子中所提到的,我知道有很多解决方案可以为您提供预先配置的“捷径”,从而使您zsh
受益匪浅。但是我有兴趣学习这种没有捷径的“艰难方式”。叫我老式。(“上坡!在雪中!双向!”)
bash
macOS上的默认提示非常详尽。它显示用户名,主机名_和_当前目录。
Calypso:~ armin$
另一方面,默认的bash提示符不显示前一个命令的退出代码,我发现这条信息非常有用。在重新配置bash
提示以获取所需信息之前,我已经写了以下内容:
当然,我想在中重新创建相同的体验zsh
。
与bash
提示唯一(视觉上)的区别是%
而不是$
。
注意:创建文件~/.hushlogin
将在每个终端会话开始zsh
以及之后bash
(或任何其他Shell中)禁止显示状态消息。
基本提示配置
尽管使用不同的语法,但基本zsh
提示配置的工作原理与相似bash
。手册中详细zsh
描述了不同的占位符。
zsh
使用相同的shell变量PS1
存储默认提示。但是,变量名PROMPT
和prompt
是它们的同义词PS1
,您将在各种示例中看到这三个变量中的任何一个。我要用PROMPT
。
中的默认提示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
键入长命令时,光标到达时将自动隐藏右提示。您可以在左侧提示中使用所有其他替换,包括右侧提示中的颜色和其他可视标记。
Git集成
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小部件或模块或主题,或它们所谓的名称。
摘要
您可能会花费很多时间(或浪费时间)来微调提示。这些修改是否真的可以提高您的生产率是一个问题。