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

Terminal 如何使用ANSI转义码计算CLI上提示的显示宽度?,terminal,rust,posix,readline,Terminal,Rust,Posix,Readline,一个简单的实现: extern crate unicode_width; fn main () { let prompt = "\x1b[1;32m>>\x1b[0m "; println!("{}", unicode_width::UnicodeWidthStr::width(prompt)); } 返回12,但应返回3 我也很乐意使用一个已经这样做的板条箱,如果有的话。您不会使用Unicode宽度计算得到转义序列的宽度,因为没有一个字符串可以在终端上打印 如果

一个简单的实现:

extern crate unicode_width;

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


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

您不会使用Unicode宽度计算得到转义序列的宽度,因为没有一个字符串可以在终端上打印

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

  • 将字符串复制到临时变量
  • 将转义序列替换为空字符串,例如,更改以
    \x1b
    开头的模式,允许
    [
    ]
    =
    的任意组合@
    ~
  • 测量剩下的东西(如果有的话)的长度
在你的例子中

let prompt = "\x1b[1;32m>>\x1b[0m ";
只有
“>>”
需要测量

对于模式。。。你可以从这里开始:

进一步阅读:

  • ,举例说明

某些ANSI转义符不能向前或向后移动光标,从而改变总宽度吗?如果是这样的话,转换为空字符串似乎是不完整的。您通常不会在提示符中使用这些字符串,并且您也不会通过字符类型函数找到它们的长度。无论如何,OP的例子并没有提到这一点。例如,转义序列可以保存光标位置,清除屏幕并恢复光标位置。不需要提示。。。