无法在Zsh中编辑命令

无法在Zsh中编辑命令,zsh,oh-my-zsh,Zsh,Oh My Zsh,我在Zsh中有一个自定义提示。最后,根据最后一个命令是成功还是失败,我将最后一个字符涂成红色或绿色。但是,当我执行此操作时,我无法返回并编辑以前的命令 这是提示代码: %{%F%?。$fg[绿色]。$fg[红色]>%F%} 工作流示例: 我输入一个换行到新行的命令: >printf%s\n这是一个很长的printf。多长时间?它太长了,以至于卷到了下一行。 运行之后,我点击向上箭头,通过删除并重新键入IsIt来修改命令。现在,命令行显示: >printf%s\n这是一个很长的printf。它有

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

这是提示代码:

%{%F%?。$fg[绿色]。$fg[红色]>%F%}

工作流示例:

我输入一个换行到新行的命令: >printf%s\n这是一个很长的printf。多长时间?它太长了,以至于卷到了下一行。

运行之后,我点击向上箭头,通过删除并重新键入IsIt来修改命令。现在,命令行显示: >printf%s\n这是一个很长的printf。它有多长?它很长很长,以至于它可以绕到下一行。

这将打印出: 这是一个很长的printf。它有多长?它是如此之长以至于它被包装到下一行

我假设我没有以某种方式终止颜色代码,因此提示会溢出到我试图输入的实际命令中。只有当提示符换行到新行时,它才会出现错误行为。谁能看出我的提示有什么问题吗

我已经验证过,如果没有这段代码,提示符的其余部分就可以正常工作,并按照您的预期运行。

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

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

PS1="%(?.%{$fg[green]%}.%{$fg[red]}%})>%f"
但是,您不需要单独的颜色数组;zsh也内置了它们

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

fg阵列中到底有什么?确切地知道你是如何改变颜色的将让我清理我的答案。谢谢!正如您所指出的,问题是我使用了%{…%};接得好!
PS1='%(?.%F{green}.%F{red})>%f '