如何使用 ANSI 转义码计算 CLI 提示符的显示宽度?

How to compute the display width of a prompt on the CLI with ANSI escape codes?

一个简单的实现:

extern crate unicode_width;

fn main () {
    let prompt = "\x1b[1;32m>>\x1b[0m ";
    println!("{}", unicode_width::UnicodeWidthStr::width(prompt));
}

returns 123 是预期的。

如果有的话,我也很乐意使用已经做到这一点的板条箱。

您不会使用 Unicode 宽度计算获得转义序列的宽度,仅仅是因为字符串的 none 是可打印的——在终端上。

如果控制字符串的内容,可以通过

计算宽度
  • 正在将字符串复制到临时变量
  • 将转义序列替换为空字符串,例如,更改以 \x1b 开头的模式,允许 []<、[= 的任意组合15=]'、=?; 或十进制数字 [=19= 范围内的 "final" 个字符] 至 ~
  • 测量剩下的(如果有的话)的长度。

在你的例子中

let prompt = "\x1b[1;32m>>\x1b[0m ";

只剩下 ">> " 待测量。

对于模式...您可以从这里开始:Regex

进一步阅读: