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

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

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

最佳答案

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

如果你控制字符串的内容,你可以通过计算宽度

  • 将字符串复制到临时变量
  • 将转义序列替换为空字符串,例如,更改以 \x1b 开头的模式, 允许 [ 的任意组合, ] , < , > ', = , ? , ;或十进制数字 through @ 范围内的“最终”字符至 ~
  • 测量剩下的(如果有的话)的长度。

在你的例子中

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

只有">> "将留待测量。

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

进一步阅读:

关于terminal - 如何使用 ANSI 转义码计算 CLI 提示符的显示宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35587099/

相关文章:

terminal - Rasa 超时问题

ruby - 通过 macports 安装 ruby​​ 没有进展。这个 Action 需要多长时间?

rust - 为什么我可以对具有不同生命周期的变量使用相同的生命周期标签?

c - execvp系统调用问题

c - 如何共享现有内存?

c - UDP服务器套接字IP分配

node.js - Mac 终端中的 Node 。 3 个点不断出现,如 '...'

linux - 'tree' 和 'ls' 在 Linux 命令行上更改文本颜色

rust - 在8位整数中插入一位

vector - 如何最好地保留Vec中的前N个元素并释放未使用的容量?