我知道你可以在 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
短。PROMPT
RPROMPT
演示
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 本身将只有一行。