无法在 Zsh 中编辑命令

Can't edit command in Zsh

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

这是提示码:

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

示例工作流程:

  1. 我输入一个换行的命令:

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

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

> printf "%s\n" "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 '