我在Zsh中有一个自定义提示。最后,我将最后一个字符涂成红色或绿色,这取决于最后一个命令是成功还是失败。但是,当我执行此操作时,我无法返回并编辑以前的命令。
这是提示代码:
%{%F%(?.$fg[green].$fg[red])>%f%}
示例工作流程:
- 我输入一个命令,该命令换行到一行:
> 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."
- 运行后,我点击向上箭头,通过删除并重新键入"是吗"来修改命令。现在,命令行显示:
> 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."
- 这会打印出来:
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 '