如何在 zsh 提示中格式化路径?

Nic*_*zet 28 zsh

我希望有一个可读的彩色路径。例如,不是简单地使用 %~ 返回,~/path/to/foo我想将其格式化~$RED/$NOCOLORpath$RED/$NOCOLORto$RED/$NOCOLORfoo为突出显示路径分隔符。

我可以定义 PROMPT 的内容,以便在每个显示器上重新评估路径表达式吗?类似的东西${${(%):-%~}//\//_some_format_expression/}显然不起作用。

或者我应该进一步破解它,并在每次我们更改目录时强制重置 PROMPT 值?

欢迎任何实现路径格式化目标的解决方案。

谢谢 :)

Den*_*son 39

zsh

尝试这个:

setopt PROMPT_SUBST
PROMPT='%{$(pwd|grep --color=always /)%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '
Run Code Online (Sandbox Code Playgroud)

这是提示的细分:

  • PROMPT_SUBST 在提示中打开命令替换(以及参数扩展和算术扩展)
  • %{...%} - 转义序列
  • $(pwd|grep --color=always /)- 打印当前目录并突出显示/- 颜色将取决于 $GREP_COLORS 环境变量(或其默认值)- 粗体红色是默认值
  • %${#PWD}G- 使用当前目录名称的字符长度作为故障值。这使得 shell 将其视为前一个字符序列(在 " %{" 之后)的长度,而不是包含 ANSI 转义序列的字符串的实际长度。这可以防止 shell 混淆光标相对于提示结尾的位置。
    - - - - - - - 这是回答您问题的部分的结尾 - - - - - - -
  • %(!.%F{red}.%F{cyan}) - 如果这是一个特权 shell (root) 将前景色设置为红色,否则为青色
  • %n - 输出用户名
  • %f - 将前景色重置为默认值
  • @ - 字面量 at 符号
  • %F{yellow} - 使前景色变黄
  • %m - 输出主机名
  • %f - 将前景色重置为默认值
  • %(!.%F{red}.) - 如果这是一个特权 shell (root) 将前景色设置为红色
  • %#-输出#为特权shell或%用于非特权一个
  • %f - 将前景色重置为默认值

我在这个提示中将路径放在首位以示强调,因为问题与路径有关。

替代文字

这是 zsh 的一个版本,它通过操作$GREP_COLORS变量来根据您是否是 root(特权)来更改斜杠颜色:

setopt PROMPT_SUBST
PROMPT='%{$(pwd|([[ $EUID == 0 ]] && GREP_COLORS="mt=01;31" grep --color=always /|| GREP_COLORS="mt=01;34" grep --color=always /))%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '
Run Code Online (Sandbox Code Playgroud)

重击

您可以在 Bash 中执行类似的提示。在这个例子中,我把用户名和主机名放在第一位,当 UID 为 0 时,斜线的颜色也会改变。警告:这会覆盖 Bash 的$PS1提示变量。这应该不是问题,除非您正在做一些特殊的事情,或者您希望在直接设置该变量时行为会发生变化并且这有效。此外,这使用了一个名为“ usercolor”的变量,它可能会与其他东西发生冲突,尽管这整个东西可以放在一个函数中并且变量声明为本地。

PROMPT_COMMAND='usercolor="\[\033[0;36m\]";[[ $EUID == 0 ]] && usercolor="\[\033[1;31m\]";PS1="$(pwd)";PS1="$usercolor\u\[\033[0m\]@\[\033[0;33m\]\h\[\033[0m\]:${PS1//\//$usercolor/\[\033[0m\]}$usercolor\\$\[\033[0m\] "'
Run Code Online (Sandbox Code Playgroud)

替代文字

我利用 Bash 没有 zsh 的“故障”功能这一事实来使用参数扩展替换来有条件地为斜杠着色(而不是使用 grep)。


Nic*_*zet 5

一个纯粹的 zsh 解决方案:

PROMPT='%n@%m: %{$PR_BOLD_RED%}${${(%):-%~}//\//${PR_BOLD_RED}/%f}%f '
Run Code Online (Sandbox Code Playgroud)
  • ${(%):-%~}是当前路径。
  • ${xxxxx//\//${PR_BOLD_RED}/%f}将 xxxxx 中的每个 / 替换为粗体红色
  • 当然,PROMPT_SUBST 必须打开。

我在测试中使用了双引号,这不允许替换。单引号一切正常。