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

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

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

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

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

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

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

Calypso:~ armin$

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

固然,我想在中从新建立相同的体验zshmacos

最小的Zsh提示

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

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

基本提示配置

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

zsh使用相同的shell变量PS1存储默认提示。可是,变量名PROMPTprompt是它们的同义词PS1,您将在各类示例中看到这三个变量中的任何一个。我要用PROMPTapp

中的默认提示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

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

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

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

摘要

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

相关文章
相关标签/搜索