我可以在 zsh 中突出显示当前提示行吗?

我可以在 zsh 中突出显示当前提示行吗?

是否可以突出显示(设置背景颜色)中的整行提示zsh?在我的 emacs 配置中,光标所在的行与窗口背景的颜色略有不同,这是一个很好的视觉辅助。我想知道是否可以在我的终端/zsh 提示符中执行相同的操作,以便它在已运行的所有内容下有效地“画一条线”。

我尝试过PROMPT='%{$bg[grey]%}# '在 my 中进行设置.zshrc,但突出显示仅延伸到我键入的范围,而不是延伸到终端的边缘。

我想要实现的目标可能吗?

答案1

尝试将 RPROMPT 设置为空格。空格数应为终端宽度(减去#和其他字符。)

答案2

您可以使用提示行*做任何您想做的事情 - 有问题的方面是让它撤消之后。我假设您不希望曾经有过提示的每一行都以突出显示颜色显示。

之后删除该行几乎会更容易,但随后您就没有命令了。也许删除提示然后回显命令(使用类似的伪提示$)。您可以让提示以 ANSI 光标保存序列开始ESC [s,然后在precmd恢复它ESC [u并清除光标之后的所有内容ESC [0J,然后回显该命令(我不记得如何从内部获取该命令precmd)。

*这是一个不完整的答案,我不知道如何让它以不同的背景颜色突出显示命令。

答案3

如果我改为greywhite你的例子实际上对我有用。

您使用什么终端?也许它以不同的方式处理背景颜色擦除?

以下是一些可供尝试的替代方案:

将整个提示行设置为灰色背景:

setopt promptsubst
preexec() {
    tput sgr0
}
PS1="$(tput setab 7)# "

(应该与您的示例相同,但编写方式不同。)

在提示符前打印一行:

precmd() {
    tput smul
    for ((n=0; n<COLUMNS; n++)) { printf " "; }
    printf "\n"
}
preexec() {
    tput sgr0
}

(如果您更改"\n""\r",则应该下划线当前行,但这似乎不起作用。我猜 zsh 在打印提示时会删除当前行,这就是我找到第一个解决方案的原因。)

将命令(即您键入的所有内容)设置为粗体:

setopt promptsubst
preexec() {
    tput sgr0
}
PS1="# $(tput bold)"

相关内容