如何在zsh中更改提示符的颜色(与普通文本不同)?

229
为了更好地识别命令行输出的开头和结尾,我想改变我的提示符颜色,以便于它在程序输出中能够清晰可见。由于我使用的是zsh,有谁能给我一些提示吗?
12个回答

425

将以下内容放入~/.zshrc文件中:

autoload -U colors && colors
PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "

支持的颜色:
红色蓝色绿色青色黄色洋红色黑色白色(来自这个答案)。不过,不同的计算机可能有不同的有效选项。

将颜色代码(以及任何其他不可打印的字符)用%{....%}括起来。这是为了使文本换行正确工作。

此外,以下是如何使此功能与这里的目录修剪一起使用的方法。

PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%(5~|%-1~/.../%3~|%4~) %{$reset_color%}%% "

5
同意,这明显是比较优秀的答案(幸运的是这个答案是谷歌搜索结果的第三项 ;) - new123456
5
对我来说无法工作。 :( zsh: 颜色:找不到函数定义文件 - balki
16
%{...%} 表示该内容将被解释为字面意义的转义序列,因此在打印序列时光标不会移动。如果不使用此选项,颜色代码实际上可以移动光标并产生不良效果。这在 zshmisc man page 的“Visual Effects”部分有详细记录。 - Bruno Penteado
2
你介意详细解释一下提示符中所有符号的作用,或者至少提供一个参考链接吗?例如,外面的%是做什么的?还有像{$fg...}这样的东西是做什么的?因为你的回答假设了太多关于shell或zsh的知识,所以很难理解。你能让它更加自包含一些或者提供参考链接吗? - Charlie Parker
截至2023年2月,macOS Ventura 13.1终端对于%{$fg[red]%}%n命令没有响应以进行颜色更改。我不得不使用%F{red}%n代替。不确定原因是什么。可能是由于版本更新导致的。 - Tong Zhao
显示剩余2条评论

105

Zsh自带有彩色提示符。尝试执行以下命令:

autoload -U promptinit && promptinit

然后输入prompt -l命令来查看可用的提示符,-p fire可以预览“fire”提示符,-s fire则将其设为当前提示符。

当你准备添加一个新的提示符时,只需在上面autoload行下方添加类似以下的内容:

prompt fade red

有没有一种方法可以着色所有主题?我喜欢 Walter's 提示符,但想让它变成红色。 - Pat Myron
6
听起来不错,但是我不喜欢这些选项中的任何一个... - szeitlin

80

以下是设置红色提示的示例:

PS1=$'\e[0;31m$ \e[0m'

这个魔法是由\e[0;31m(开启红色前景)和\e[0m(关闭字符属性)组成的,它们被称为转义序列。不同的转义序列会带来不同的结果,包括绝对光标定位、颜色、能够更改窗口标题栏等。

要了解更多关于转义序列的知识,请参阅维基百科中有关ANSI转义代码的条目


3
我可以翻译您的内容。您想知道如何给 .zshrc 文件中的 PROMPT='[%!]' 添加颜色。您尝试使用 PROMPT='\e[0;31m[%!] \e[0m',但未成功。 - Léo Léopold Hertz 준영
3
为什么你说它是错误的?我能做些什么来改善回答吗?对我来说,执行上述操作会显示一个红色美元符号,所以我不明白为什么你认为它是错误的。 - Bryan Oakley
4
它正在工作,但字符串前的$会使zshrc出现故障。当我使用制表符时,文本被放在左侧。我更喜欢@Joe the Person的答案。 - Moebius
1
我同意@Moebius的看法。我本来想让这个工作的,因为它很清晰简单,但是它完全搞砸了CD上的标签页。 - diek
3
我认为zsh不需要疯狂奇怪的ANSI转义字符...一定有更好的答案... - Charlie Parker
4
你的答案缺少标识转义序列的 %{%} 标记。如果没有这些标记,zsh 将会将转义序列计入提示符展示长度中,导致在输入更长的命令时出现奇怪的光标定位和行编辑器行为。请参见 man zshmisc 中关于提示符序列扩展和视觉效果的部分。并非所有 shell 都需要你这样做;例如 Korn shell 会解析 PS1 字符串中的常见转义序列(尽管在它无法正确识别的序列上,通常是不常见的序列,也会显示上述问题)。 - Perette

49

正如已经指出的那样,Bryan Oakley上面的答案有一个错误,并且Andrew Marshall提供的解决方案虽然没有该错误,但它并不能使太多自定义颜色使用变得明显。

由于macOS Catalina现在要求将zsh作为默认shell,我认为会有更多人想要自定义其提示符,并可能在这里寻找答案。因此,我想尝试给出更广泛的摘要并涉及其他非常相关的概念,以允许更多的自定义。

用于各种颜色的3位代码。 首先,我们可以在此处找到各种颜色的3位代码:https://unix.stackexchange.com/a/124409/194343。 例如,214是一种橙色。

前景和背景。 另一个关键信息是,对于景和景颜色,可以分别使用FK来定义所需的颜色。来源是zsh视觉效果手册:http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Visual-effects

因此,例如以下两个命令

autoload -U colors && colors
export PS1="%F{214}%K{000}%m%F{015}%K{000}:%F{039}%K{000}%~%F{015}%K{000}\$ "

用黑色背景搭配橙色字体显示主机名,接着是白色背景的冒号和黑色字体,再接着是黑色背景的明亮蓝色字体的当前工作目录,最后是白色背景的美元符号和黑色字体。

更多相关信息请查看下方。

右侧提示信息。例如,添加时间戳,请参见https://superuser.com/a/1251045/290299。当然,这可以进行彩色编码,例如使用浅蓝色/紫色等颜色,如下所示:

RPROMPT="%F{111}%K{000}[%D{%f/%m/%y}|%@]"

使用颜色的ls命令。在阅读了ls的手册后,例如,可以使用以下两个命令来激活ls的颜色:

export CLICOLOR=1
export LSCOLORS=gafacadabaegedabagacad

最后,作为我的最后一条评论,我没有测试过的一个选择是让某人从MacPorts安装端口coreutils然后使用gdircolors。(来源:https://unix.stackexchange.com/a/174596/194343)。(由于上述所有内容都是相关的部分,使得每天的生活更加有趣、更容易应对,所以我可能会在未来编辑这个最后一部分。)


2
这是一个非常有帮助的答案。感谢您的整理。 - shaunakde

32

我认为autoload -U colors && colors不再需要,可以直接执行以下命令:

PS1="%{%F{red}%}%n%{%f%}@%{%F{blue}%}%m %{%F{yellow}%}%~ %{$%f%}%% "

为了达到与FireDude的回答相同的结果。请参考ZSH文档获取更多信息。


1
顺便说一下,我刚在Ubuntu 11.04上尝试了一下,如果没有“autoload -U colors && colors”,颜色不起作用。 - dpc.pw
2
很奇怪,在我的OS X和Ubuntu 10.04上能正常工作。 - Andrew Marshall
1
@Andrew Marshall 是的,但使用autoload更有可能起作用。 - Joe the Person
我需要在Crunchbang(实际上是Debian)和“zsh 4.3.17(x86_64-unknown-linux-gnu)”中使用“autoload”。 - Eric Dand
2
如果您不需要 autoload -U colors,那么这意味着您的发行版已经在某个其他的 zsh 初始化文件中包含了它。但是,您仍应该在您打算与他人共享的脚本中包含它。 - kindall
显示剩余3条评论

22

尝试我的最爱:放进去

~/.zshrc

这一行:

PROMPT='%F{240}%n%F{red}@%F{green}%m:%F{141}%d$ %F{reset}'

不要忘记

source ~/.zshrc

你可以测试更改

当然,你可以更改颜色/颜色代码 :-)


1
只有这个对我有效,尝试了数百个PS1,它们都无效。 - a55

9
为了避免在终端中使用特殊字符来表示信息的碎片,您可以使用多种颜色来区分信息。
例如,要获得所需的效果:

Desired Outcome

您可以对提示进行以下操作:

PROMPT='%F{magenta}${PWD/#$HOME/~} %F{green}${vcs_info_msg_0_} %F{cyan}$%F{reset_color} '

每次使用$F{myColor}设置颜色后,从那一点开始的颜色将保持不变。重要的是在结尾处添加%{reset_color},以便输入文本返回原始颜色(或者您可以将其设置为其他颜色)。

7

Debian/Ubuntu/Raspberry Pi OS 风格的 bash 提示符:

autoload -U colors && colors
PS1="%B%F{034}%n@%m%f%b:%B%F{019}%~ %#%f%b "

截图

不完全确定是否需要autoload -U colors && colors,但是我在使用$fg[...]而不是%F{...}时确实需要它。
在我的例子中:

  • %F(%f) 开始(停止)前景色——我使用的是256COLOR值,但你也可以使用十六进制,例如,我使用了普通绿色%F{034},但%F{#00aa00}也可以。
  • %B(%b) 开始(停止)粗体
  • %n $USERNAME
  • %m 短机器名
  • %~ 登录 / 工作目录,在主目录中带有 ~
  • %# 如果是普通用户显示 %,如果是 su 则显示 #

编辑:已在 macOS Big Sur、Monterey 和 Ventura 上测试。不确定早期的 zsh 版本,但 Ventura 13.0 是 zsh 5.8.1 (x86_64-apple-darwin22.0)。


5
我发现,在Debian Jessie上,默认的zsh5版本,所有这些解决方案都有效:
  • $'\e[00m
  • $fg[white]
  • $fg{white}
但它们存在一个问题:它们会移动光标,在自动补全时会导致丑陋的贴花。解决方法很简单,只需要用%{FOOBAR%}来包围转义序列即可。我花了一段时间才想到这个方法。 对于第2和第3个解决方案,必须加载colors模块。 为了使第1个解决方案易读,只需为所使用的颜色定义变量即可。

4
为了获得一个与上一条命令的退出状态相关联的带有颜色提示符,你可以使用以下代码:
PS1='%(?.%F{green}.%F{red})%n@%m:%~%# %f'

将以下内容添加到您的~/.zshrc文件中。

文档列出了可能的占位符。


PS1='%(?.%F{green}.%F{red})%n@%m:%F{141}%d$ %F{reset}' 我用这个添加了当前工作目录 (PWD)。 - jsquaredz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接