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


21

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

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

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

任何实现路径格式化目标的解决方案都将受到欢迎

谢谢 :)


如果您仍然存在,您可能想要为此标记最佳答案:)
Dan Rosenstark

Answers:


33

zsh的

试试这个:

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

这是提示的细分:

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

我把这条路径放在这个提示中,以便强调,因为这个问题与路径有关。

alt text

这是zsh的一个版本,它通过操作来改变斜杠颜色,具体取决于你是否是root(特权) $GREP_COLORS 变量:

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 '

巴什

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

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\] "'

alt text

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


叫我傻,但我唯一错误的部分是在PROMPT定义中使用双引号而不是单引号。谢谢 :)
Nicolas Dumazet

@NicDumZ,好笑,我昨天在其他地方花了大约20分钟来解决这个问题:)
Dan Rosenstark

1
这是大规模(令人讨厌和酷)。谢谢...
Dan Rosenstark

知道如何在Bash中执行此操作,或者为什么它在Bash中不起作用?对于我与Bash,它只是卡在我启动终端的第一个目录中,并且当我四处移动时不会更新。我刚拿了$(pwd | grep --color = always /)并把它放在我的PS1中并得到了奇怪的行为。编辑:OH!没有看到Bash部分大声笑。
Ibrahim

实际上,我正试图在我更复杂的提示中使用你的PS1技巧进行Bash而且它不起作用,我的PWD又被卡住了。但是你的代码段可以正常工作。 PROMPT_COMMAND的目的是什么?这就是我所拥有的: PS1="$(pwd)"; PS1="${debian_chroot:+($debian_chroot)}\[$bldgrn\]\u@$(fgcolor $hostnamecolor)\h$(resetcolor)\[$txtrst\]:\[$bldblu\]${PS1//\//$txtred/$bldblu}\[\e[00m\]$bldred\$(parse_git_branch)\[$txtrst\] \[$undcyn\]\T \d\[$txtrst\] 95\$ " 颜色定义 github.com/ibrahima/dotfiles/blob/master/.bashrc.d/prompt.sh
Ibrahim

3

经过一些复飞后,我可以提供一个解决方案 chpwd

doprompt() {
  local my_path=${(%):-%~}
  PROMPT="${yourstuff}${my_path//\//${PR_BOLD_RED}/${reset_color}}${otherstuff}"
}
doprompt

chpwd() {
  doprompt
  # unrelated: set window title
  [[ -t 1 ]] || return;
  print -Pn "\e]2;%n@%m: %~\a";
}
  • 是否有办法改进此代码以摆脱临时 my_path VAR?我无法直接替换/ inside%〜...
  • 任何使用动态语法的解决方案都可以避免调用每个目录的更改 doprompt 可能更干净了。

3

纯zsh解决方案:

PROMPT='%n@%m: %{$PR_BOLD_RED%}${${(%):-%~}//\//${PR_BOLD_RED}/%f}%f '
  • ${(%):-%~} 是当前的路径。
  • ${xxxxx//\//${PR_BOLD_RED}/%f} 用粗体红色代替xxxxx中的每个/
  • 当然PROMPT_SUBST必须打开。

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


你必须有 $PR_BOLD_RED 别处定义。我必须使用 PROMPT='%n@%m: %{%B%F{red}%}${${(%):-%~}//\//%B%F{red\}/%b%f}%b%f ' 包括 很奇怪 在第二个“红色”之后逃避结束大括号(仅)。
Dennis Williamson

是的,我使用Aaron Toponce的命名 pthree.org/wp-content/uploads/2009/03/zsh_prompt 我发现有用。除此之外,我不必逃避任何事情,它按照提供的方式工作。
Nicolas Dumazet

0

这是我的尝试(基于NicDumZ的):

setopt PROMPT_SUBST
# red, green, yellow, blue, magenta, cyan, white, black
# B (bold), K(background color), F(foreground color)

function doprompt {
# this is just the directory (%d could be %~ -- I prefer full path always)
PROMPT='%F{yellow}${${(%):-%d}//\//%F{magenta\}%B/%b%F{yellow\}}%f'
}

function chpwd() {
    doprompt
}

不同之处在于我使用的是彩色路径,因此一旦斜线变色,我需要返回路径的原始颜色。在我的情况下,路径通常是黄色,斜线用洋红色着色,然后返回黄色。我也更喜欢使用%F%f序列,因为它们对我来说看起来更具可读性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.