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

时间:2016-02-23 20:03:53

标签: 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

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

1 个答案:

答案 0 :(得分:1)

您不会使用Unicode宽度计算获取转义序列的宽度,因为在终端上没有任何字符串是可打印的。

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

计算宽度
  • 将字符串复制到临时变量
  • 将转义序列替换为空字符串,例如,更改以\x1b开头的模式,允许[]<,{{1}的任意组合}&#39;,>=?或十进制数字通过&#34; final&#34; ;@
  • 范围内的字符
  • 测量剩下的(如果有的话)的长度。

在你的例子中

~

只剩下let prompt = "\x1b[1;32m>>\x1b[0m "; 来衡量。

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

进一步阅读: