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

Mne*_*nth 93 zsh prompt colors

为了更好地识别命令行上输出的开始和结束,我想更改提示的颜色,以便它与程序输出明显不同.当我使用zsh时,任何人都可以给我一个提示吗?

Joe*_*son 230

把它放进去~/.zshrc:

autoload -U colors && colors
PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "
Run Code Online (Sandbox Code Playgroud)

支持的颜色:
红色,蓝色,绿色,青色,黄色,洋红色,黑色和白色(来自此答案),虽然不同的计算机可能有不同的有效选项.

环绕颜色代码(以及任何其他不可打印的字符)red.这是为了使文本包装正常工作.

此外,这里是你如何能得到这个与从目录修剪工作在这里.

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

  • `%{...%}`表示内容将被解释为文字转义序列,因此在打印序列时光标不会移动.如果你不使用它,颜色代码实际上可以移动光标并产生不希望的效果.这在[zshmisc手册页]的"视觉效果"部分中有记录(http://linux.die.net/man/1/zshmisc) (10认同)
  • 同意,到目前为止,最好的答案(幸运的是,这个答案是谷歌的第三个结果;) (3认同)
  • 不适合我.:(`zsh:colors:找不到函数定义文件 (2认同)
  • @chakrit用允许的颜色更新答案. (2认同)
  • 您介意详细解释提示中的所有符号的用途吗?或者至少提供一个参考链接?例如,外面的“%”在做什么?另外像“{$fg...}”之类的东西有什么作用?很难理解你的答案,因为它假设你对 shell 或 zsh 有很多了解。您能否使其更加独立或链接到参考文献? (2认同)

Mit*_*tro 58

Zsh内置了彩色提示.尝试

autoload -U promptinit && promptinit
Run Code Online (Sandbox Code Playgroud)

然后prompt -l列出可用的提示,-p fire预览"开火"提示,-s fire设置它.

当您准备添加提示时,在上面的自动加载行下面添加如下内容:

prompt fade red
Run Code Online (Sandbox Code Playgroud)

  • 这听起来不错,但我不喜欢这些选项中的任何一个...... (6认同)
  • 加一用于显示官方方式。 (3认同)

Bry*_*ley 50

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

PS1=$'\e[0;31m$ \e[0m'
Run Code Online (Sandbox Code Playgroud)

神奇的是\e[0;31m(打开红色前景)和\e[0m(关闭角色属性).这些被称为转义序列.不同的转义序列为您提供不同的结果,从绝对光标定位到颜色,再到能够更改窗口的标题栏等等.

有关转义序列的更多信息,请参阅ANSI转义码的维基百科条目

  • 我在我的 .zshrc 中使用 PROMPT='[%!]'。你怎么能上色?我在我的 .zshrc 中运行失败 PROMPT='\e[0;31m[%!] \e[0m' 。 (3认同)
  • 它正在工作,但字符串前的$使zshrc出现故障.当我使用制表时,文本放在左侧.我更喜欢@Joe的回答 (3认同)
  • 我认为 zsh 不需要疯狂奇怪的 ANSI 转义的东西......一定有一个更好的答案...... (3认同)
  • @Masi尝试$'string' (2认同)
  • @ erikb85:你为什么说这是错的?我能做些什么来使答案更好吗?对我来说,做上面给我一个红色的美元符号,所以我不明白为什么你认为这是错的. (2认同)
  • 您的答案缺少标识转义序列的“%{”和“%}”标记。如果没有这些,“zsh”会将转义序列计算为提示显示长度的一部分,并且您最终会在较长的命令上出现奇怪的光标定位和行编辑器行为。请参阅“man zshmisc”,提示序列的扩展,视觉效果。并非所有 shell 都要求您这样做;例如,Korn shell 解析 PS1 字符串中的常见转义序列(尽管它会在无法正确识别的序列(通常是不常见的序列)上显示上述问题)。 (2认同)

Mig*_*use 32

上面 Bryan Oakley 的答案有一个小故障,因为它已经被指出,而 Andrew Marshall 提供的解决方案虽然没有出现故障,但它并没有使所用颜色的太多定制变得明显。

由于 macOS Catalina 要求从现在起将 zsh 设为默认 shell,我认为可能会有更多人想要自定义他们的提示,并且可能会来这里寻求答案。所以,我想我会尝试给出一个更广泛的总结,并触及允许更多定制的其他非常密切相关的概念。

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

前景和背景。 另外一个关键的信息是,对˚F oreground和BAC ķ地面颜色可以定义他们想要什么˚Fķ分别。来源是关于视觉效果的 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}\$ "
Run Code Online (Sandbox Code Playgroud)

以黑色背景的橙色显示主机名,然后是黑色背景的白色冒号,然后是黑色背景的亮蓝色当前工作目录,然后是黑色背景的白色美元符号。

更多相关信息见下文。

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

RPROMPT="%F{111}%K{000}[%D{%f/%m/%y}|%@]"
Run Code Online (Sandbox Code Playgroud)

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

export CLICOLOR=1
export LSCOLORS=gafacadabaegedabagacad
Run Code Online (Sandbox Code Playgroud)

最后,作为我没有测试过的最后一句话,因为我对我的配置感到满意,另一种途径可能是有人coreutilsMacPorts安装端口然后使用gdircolors(来源:https : //unix.stackexchange.com/a/174596 /194343)。(我可能会在未来编辑这最后一部分,因为以上所有内容都是相关的部分,它们使日常生活变得更加有趣和更容易应对。)

  • 这是一个非常有帮助的答案。感谢您将这些放在一起。 (2认同)

And*_*all 21

我认为autoload -U colors && colors不再需要了,人们可以这样做:

PS1="%{%F{red}%}%n%{%f%}@%{%F{blue}%}%m %{%F{yellow}%}%~ %{$%f%}%% "
Run Code Online (Sandbox Code Playgroud)

达到与FireDude的答案相同的结果.有关详细信息,请参阅ZSH文档.

  • 奇怪的。在 OS X 和 Ubuntu 10.04 上对我有用。 (2认同)
  • 如果您不需要“autoload -U color”,则意味着您的发行版已在其他 zsh 初始化文件中包含它。您仍然应该将其包含在打算与其他人共享的脚本中。 (2认同)

Her*_*arz 10

试试我最喜欢的:放入

~/.zshrc
Run Code Online (Sandbox Code Playgroud)

这一行:

PROMPT='%F{240}%n%F{red}@%F{green}%m:%F{141}%d$ %F{reset}'
Run Code Online (Sandbox Code Playgroud)

不要忘记

source ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

测试更改

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


Bar*_*yle 9

为了不浪费终端中带有特殊字符的信息片段的空间,您可以使用多种颜色来区分信息。

例如。为了得到这个想要的效果:

期望的结果

您可以根据提示执行以下操作:

PROMPT='%F{magenta}${PWD/#$HOME/~} %F{green}${vcs_info_msg_0_} %F{cyan}$%F{reset_color} '
Run Code Online (Sandbox Code Playgroud)

它的工作方式是每次您使用$F{myColor}该颜色设置颜色时,从该点开始都会坚持该颜色。%{reset_color}在最后添加很重要,以便输入文本恢复到原始颜色(或者如果您愿意,您可以将其设置为其他颜色)。


Tim*_*imD 7

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

autoload -U colors && colors
PS1="%B%F{034}%n@%m%f%b:%B%F{019}%~ %#%f%b "
Run Code Online (Sandbox Code Playgroud)

截屏

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

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

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


use*_*474 5

我发现,使用 zsh5(Debian Jessie 上的默认版本),所有这些解决方案都有效:

  • $'\e[00m
  • $fg[white]
  • $fg{white}

现在,他们有一个问题:他们会移动光标,导致在制表符(用于自动完成)时出现丑陋的贴花。解决方案很简单,就是用 包围转义序列%{FOOBAR%}。我花了一段时间才弄清楚这一点。对于第二和第三解决方案,加载colors模块是强制性的。为了保持第一个解决方案的可读性,只需为您使用的颜色定义变量即可。


Mar*_*tin 5

要根据最后一个命令\xe2\x80\x99s 退出状态获得带有颜色的提示,您可以使用以下命令:

\n\n
PS1=\'%(?.%F{green}.%F{red})%n@%m:%~%# %f\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

只需将此行添加到您的~/.zshrc.

\n\n

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

\n