zsh 中的多行 RPROMPT

zsh 中的多行 RPROMPT

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

PROMPT='
test
→ '

但我很奇怪,为什么不能定义多行右提示?我试过:

RPROMPT='
test
still test '

但什么都没显示出来。这可能吗?

答案1

precmd您可以使用每次在提示显示之前执行的函数来获得所需的(如果我猜对了)效果,以便在提示上方打印额外的行。

例如使用此代码

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

解释

  • $LEFT$RIGHT分别保存左侧和右侧的字符串。您可以将命令的输出与语法一起使用$(...)
  • $RIGHTWIDTH是当前终端宽度的差值(存储为$COLUMNS参数中)和左字符串的宽度。$((...))用于数学表达式
  • 魔法来自于${(l:$RIGHTWIDTH::.:)RIGHT},其中参数$RIGHT左侧用l点填充( )(如果需要空格,则省略最后一个点:.:)到 的长度$RIGHTWIDTH
  • 打印附加行。如果需要更多行,请重复该命令。
  • PS1和比和RPS1短。PROMPTRPROMPT

演示

The time is............................................Fri, Sep 18, 2015  8:20:22 PM 
foo > _                                                                          bar

答案2

显然设置多行正确提示并非不可能:这个管理这一点。然而,我认为它是这样实现的:

 local top_left='%F{blue}%~%f'
  local top_right="%F{green}${git_branch}%f"
  local bottom_left='%B%F{%(?.green.red)}%#%f%b '
  local bottom_right='%F{yellow}%T%f'

  local REPLY
  fill-line "$top_left" "$top_right"
  PROMPT=$REPLY$'\n'$bottom_left
  RPROMPT=$bottom_right

通过让PROMPT占据左上角和右上角以及左下角,让 RPROMPT 占据右下角。不过,RPROMPT 本身将只有一行。

相关内容