R 提示符中有缺陷的 ANSI 转义序列

buggy ANSI escape sequences in R prompt

当 R 在支持颜色的终端中以交互方式 运行 时,可以使用 ANSI 转义序列在提示中添加颜色,例如

options(prompt = "3[0;31mThis is red3[0m> ")

不幸的是,出了点问题,因为对于长命令行,续行会覆盖提示而不是写在下一行中。 当使用多种颜色时,问题会变得更糟,因为不知何故,命令行中的每个转义序列 "takes up some space", 直到提示的结尾可能会覆盖开头 。在我的配置中,例如

options(prompt = paste("3[0;31m With 3[0;32m multiple",
                   "3[0;33m colors 3[0;34m this",
                   "3[0;35m gets 3[0;36m really",
                   "3[0;37m wrong! 3[0m"))

为什么会这样?有解决方法吗?

PS:这个相当古老的post似乎与http://r.789695.n4.nabble.com/Xterm-escape-sequences-in-Prompt-td906375.html

有关

更新: 使用 R 版本 3.6.0 和 readline 8.0(不知道这里哪个重要),上述大部分问题都消失了,但仍然存在一些奇怪的行为。下面接受的答案解决了所有问题。

r-devel 邮件列表中的 Gábor Csárdi 说我无法轻易改变这种行为 (http://r.789695.n4.nabble.com/buggy-ANSI-escape-sequences-in-R-prompt-td4728671.html)。他提出的解决方法是使用两行提示符,这很适合我。

您需要用特殊的 «marks» 包围每个 «invisible» 颜色代码:[=11=]1[=12=]2:

options(prompt = "[=10=]13[0;31m[=10=]2This is red[=10=]13[0m[=10=]2> ")

有关解释,请参阅 $ info readline(或 this short answer)。