zsh 中的多行 RPROMPT

lin*_*ndy 8 zsh prompt

我知道你可以在 zsh 中定义多行提示:

PROMPT='
test
? '
Run Code Online (Sandbox Code Playgroud)

但我想知道,你为什么不能定义多行正确提示?我试过:

RPROMPT='
test
still test '
Run Code Online (Sandbox Code Playgroud)

但什么也没有出现。这可能吗?

mpy*_*mpy 12

您可以通过使用precmd每次在显示提示之前执行的函数在提示上方打印附加行来获得所需的(如果我猜对的话)效果。

例如使用此代码

precmd() {
  LEFT="The time is"
  RIGHT="$(date) "
  RIGHTWIDTH=$(($COLUMNS-${#LEFT}))
  print $LEFT${(l:$RIGHTWIDTH::.:)RIGHT}
}
PS1="foo > "
RPS1="bar"
Run Code Online (Sandbox Code Playgroud)

解释

  • $LEFT$RIGHT握住左右两侧的琴弦,分别。您可以将命令的输出与$(...)语法一起使用。
  • $RIGHTWIDTH是当前终端宽度(由zsh存储在$COLUMNS参数中)与左边字符串宽度的差值。$((...))用于数学表达式
  • 神奇的是${(l:$RIGHTWIDTH::.:)RIGHT},其中参数$RIGHT左填充 ( l) 点(:.:如果需要空格,请省略最后一个)到$RIGHTWIDTH.
  • 打印附加行。如果需要更多行,请重复这些命令。
  • PS1RPS1对于更短PROMPTRPROMPT

演示

The time is............................................Fri, Sep 18, 2015  8:20:22 PM 
foo > _                                                                          bar
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案,但是如果`LEFT` 或`RIGHT` 包含ANSI 转义序列(例如颜色),则必须小心。要计算忽略ansi转义的字符串长度,我们可以将其作为`$(( ${#${(S%%)str//(\%([KF1]|)\{*\}|\%[Bbkf]) )}} ))` (3认同)