一个简单的实现:
extern crate unicode_width;
fn main () {
let prompt = "\x1b[1;32m>>\x1b[0m ";
println!("{}", unicode_width::UnicodeWidthStr::width(prompt));
}
返回 12
但应返回 3
。
如果有的话,我也很乐意使用已经做到这一点的 crate 。
最佳答案
您不会使用 Unicode 宽度计算来获得转义序列的宽度,这仅仅是因为没有一个字符串是可打印的——在终端上。
如果你控制字符串的内容,你可以通过计算宽度
- 将字符串复制到临时变量
- 将转义序列替换为空字符串,例如,更改以
\x1b
开头的模式, 允许[
的任意组合,]
,<
,>
',=
,?
,;
或十进制数字 through@
范围内的“最终”字符至~
- 测量剩下的(如果有的话)的长度。
在你的例子中
let prompt = "\x1b[1;32m>>\x1b[0m ";
只有">> "
将留待测量。
对于模式...您可以从这里开始:Regex
进一步阅读:
- crate Regex
- 17.3 Strings , Rust 实例
关于terminal - 如何使用 ANSI 转义码计算 CLI 提示符的显示宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35587099/