哦,我的无法在 Zsh 中编辑命令



我在Zsh中有一个自定义提示。最后,我将最后一个字符涂成红色或绿色,这取决于最后一个命令是成功还是失败。但是,当我执行此操作时,我无法返回并编辑以前的命令。

这是提示代码:

%{%F%(?.$fg[green].$fg[red])>%f%}

示例工作流程:

  1. 我输入一个命令,该命令换行到一行:

> printf "%sn" "This is a very long printf. How long is it? It's so very very long that it wraps onto the next line."

  1. 运行后,我点击向上箭头,通过删除并重新键入"是吗"来修改命令。现在,命令行显示:

> printf "%sn" "This is a very long printf. How long is it It's so very very long that it wraps onto the next line."

  1. 这会打印出来:

This is a very long printf. How long iis it It's so very very long that it wraps onto the next line.

我假设我没有以某种方式终止颜色代码,这样提示就会溢出到我试图输入的实际命令中。只有当提示换行时,它才会表现不佳。有人能看到我的提示有什么问题吗?

我已经验证了,如果没有这段代码,提示的其余部分就可以正常工作,并且可以像您预期的那样工作。

zsh对提示的实际长度感到困惑。shell已经知道它自己的%F转义不会增加提示的屏幕长度;您不需要像在bash中一样将其封装在%{...%}中。

PS1="%F%(?.$fg[green].$fg[red])>%f"

如果fg包含实际的特定于终端的转义序列,那么你需要%{...%},但你根本不会使用%F,因为这不是你使用它的方式

PS1="%(?.%{$fg[green]%}.%{$fg[red]}%})>%f"

但是,您不需要单独的颜色阵列;zsh也内置了它们。

PS1='%(?.%F{green}.%F{red})>%f '

最新更新