【发布时间】:2015-09-18 21:57:31
【问题描述】:
我在这里和通过 Google 搜索了几个答案,但我仍然不确定我的提示出了什么问题。
根据我阅读的文档,这应该可以工作
setopt prompt_subst
autoload -U colors && colors
PROMPT="%{[00m[38;5;245m%}test %D%{[00m%}"
不过,我的提示如下:
[00m[38;5;245mtest 15-07-01[00m
请注意,日期扩展确实有效,因此提示替换有效。用于提示扩展的 ZSH 手册页指出 %{...%} 应被视为原始转义码,但这似乎没有发生。将该字符串传递给print -P 也会产生上面的输出。我在 Internet 上找到了 ZSH 的示例提示,这些提示似乎也表明上述语法应该有效。参见this 的一个示例 - $FG 和 $FX 数组填充了转义码并定义为here。我已经通过合并上面的两个文件直接尝试了这个示例,将setopt prompt_subst 添加到开头只是为了确保它已设置,然后获取它并且提示是一堆转义码。
以下作品
setopt prompt_subst
autoload -U colors && colors
PROMPT=$'%{\e[00m\e[38;5;245m%}test %D%{\e[00m%}'
我得到了test 15-07-01 的预期结果,颜色正确。
我已经在 OSX Yosimite 的 ZSH 5.0.5、MacPorts 的 5.0.7 和 Debian 的 4.3.17 上对此进行了测试,结果相同。我知道我已经通过工作示例在这里为我自己的问题提供了一个有效的解决方案,但我想知道为什么第一个语法不能正常工作。
【问题讨论】:
-
这里没有问题;如果您正在阅读的文档省略了转义字符,那就错了。指示终端切换颜色的 ANSI 代码都以
ESC[开头,而不仅仅是[。 -
请注意,使用内置转义来更改颜色比处理原始控制序列更容易。
prompt="%F{245}test %D%f" -
您可能会假设
%{ ... %}为每个序列的开头提供了转义字符;它实际上所做的只是指示 shell 大括号的内容在输出中占用零空间,以便可以计算正确的屏幕提示长度。 -
zshmisc 的手册页指出“%{...%} 包含一个字符串作为文字转义序列。大括号内的字符串不应更改光标位置。大括号对可以嵌套。”这似乎表明内容不应该改变光标位置,而不是
%{...%}本身的功能。它确实声明内容将被视为文字转义序列。我很困惑,因为我看到了据称在%{...%}序列中不包含转义字符ESC[的工作示例。 -
文档措辞不佳。转义序列不包含可打印字符;整个事情由终端解释而不是显示。如果您确实将可打印字符放在大括号内,那么您的提示实际上会longer 计算出的
zsh,相比之下,如果您计算出的提示短于zsh根本没有使用%{...%}。
标签: zsh prompt ansi-escape