转到zsh,第6部分–自定义zsh提示

转到zsh,第6部分–自定义zsh提示

苹果已经宣布,在macOS 10.15 Catalina中默认外壳为zsh

在本系列中,我将记录我将bash设置,配置和脚本移至的经验zsh

本系列 已发展成一本书:进行了重新设计,并扩展了更多详细信息和主题。 与其他书籍一样,我计划在发行后也进行更新和添加,以保持其相关性和实用性。您现在 可以在Apple Books Store上订购它

正如我在前面的帖子中所提到的,我知道有很多解决方案可以为您提供预先配置的“捷径”,从而使您zsh受益匪浅。但是我有兴趣学习这种没有捷径的“艰难方式”。叫我老式。(“上坡!在雪中!双向!”)

bashmacOS上的默认提示非常详尽。它显示用户名,主机名_和_当前目录。

Calypso:~ armin$

另一方面,默认的bash提示符不显示前一个命令的退出代码,我发现这条信息非常有用。在重新配置bash提示以获取所需信息之前,我已经写了以下内容:

当然,我想在中重新创建相同的体验zsh

最小的Zsh提示

bash提示唯一(视觉上)的区别是% 而不是$

注意:创建文件 ~/.hushlogin将在每个终端会话开始 zsh以及之后 bash(或任何其他Shell中)禁止显示状态消息。

基本提示配置

尽管使用不同的语法,但基本zsh提示配置的工作原理与相似bash手册中详细zsh描述不同的占位符。

zsh使用相同的shell变量PS1存储默认提示。但是,变量名PROMPTprompt是它们的同义词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理解颜色blackredgreenyellowbluemagentacyanwhite%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

提示代码之一提供了“三进制条件”,这意味着它将根据条件显示两个表达式之一。您可以使用几种条件。再次可以在文档中找到详细信息

前面的命令退出代码有一个条件:

%(?..)

当前一个命令成功退出(退出代码为零)和前一个命令失败(退出代码为非零)时,该表达式将使用。因此,建立条件提示非常容易:

% 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小部件或模块或主题,或它们所谓的名称。

摘要

您可能会花费很多时间(或浪费时间)来微调提示。这些修改是否真的可以提高您的生产率是一个问题。

你可能感兴趣的:(zsh)