是否可以在具有删除效果的控制台中显示文本?

soc*_*soc 10 terminal console text ansi-escape strikethrough

我已经查看了ANSI转义码,但看起来只支持下划线.

我想念一些东西还是有其他选择?

如果不可能,那么"这是否已被弃用"的含义是否相同?

ak2*_*ak2 13

根据ECMA-48终端标准,SGR(选择图形再现)代码9应该能够实现划掉的文本.但是,ANSI转义码维基百科页面说它没有得到广泛支持,我也不知道有什么用.我怀疑那是因为DEC的VTxxx系列不支持它.

  • 实际上一套好的主要shell终端似乎支持它(这包括``guake``,``terminator``,``gnome-terminal``,...).http://misc.flogisoft.com/bash/tip_colors_and_formatting#terminals_compatibility.快速测试:``echo -e"\ e [9mtest\e [0m"``. (4认同)
  • 我的`libvterm`/`pangoterm` 可以做的很好。请参阅[链接]中的第二个屏幕截图(http://leonerds-code.blogspot.com/2011/09/libvtermpangoterm-and-tickit.html) (2认同)

Mar*_*ann 5

使用C11或C++ 11编写的应用程序的另一种解决方案是使用Unicode 组合长笔画叠加字符.

在C++ 11中,您可以编写如下代码:

#include <iostream>
#include <string>

std::string strikethrough(const std::string& text) {
  std::string result;
  for (auto ch : text) {
    result.append(u8"\u0336");
    result.push_back(ch);
  }
  return result;
}

int main() {
  std::cout << strikethrough("strikethrough") << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

代码为输入中的每个字符text添加笔划覆盖前缀\u0336.请注意,该函数假定text使用单字节编码(如ASCII或Latin)进行编码.如果输入是UTF-8,则必须先将其转换为UTF-32以获得字符边界.

然后输出s?t?r?i?k?e?t?h?r?o?u?g?h在具有UTF-8功能的终端中.我不知道为什么第一个角色没有透视,必须是终端问题.我可以通过在删除线功能调用之前打印至少一个字符来解决这个问题.

terminator与上面提到的ANSI转义序列相比,Unicode解决方案在我的终端()中生成的锁定略有不同.前者将行精确地呈现在文本的中间,而后者使其略微下降.