如何在终端中绘制连续线?

如何在终端中绘制连续线?

我已经寻找这个问题有一段时间了,但没有得到满意的答案。

我从 Gnu/Linux 命令的输出中截取了这个屏幕截图tree

在此输入图像描述

我想知道如何绘制或打印这样的线条,我尝试阅读树程序的源代码,但什么也不明白。

答案1

man 5 terminfo您可以使用 terminfo(5) ( ) 中以“Line Graphics”开头的字符表来执行此操作

    Glyph                       ACS            Ascii     acsc     acsc
    Name                        Name           Default   Char     Value
    ────────────────────────────────────────────────────────────────────
    arrow pointing right        ACS_RARROW     >         +        0x2b
    arrow pointing left         ACS_LARROW     <         ,        0x2c
    arrow pointing up           ACS_UARROW     ^         -        0x2d
    arrow pointing down         ACS_DARROW     v         .        0x2e
    solid square block          ACS_BLOCK      #         0        0x30
    diamond                     ACS_DIAMOND    +         `        0x60
    checker board (stipple)     ACS_CKBOARD    :         a        0x61
    degree symbol               ACS_DEGREE     \         f        0x66
    plus/minus                  ACS_PLMINUS    #         g        0x67
    board of squares            ACS_BOARD      #         h        0x68
    lantern symbol              ACS_LANTERN    #         i        0x69
    lower right corner          ACS_LRCORNER   +         j        0x6a
    upper right corner          ACS_URCORNER   +         k        0x6b
    upper left corner           ACS_ULCORNER   +         l        0x6c
    lower left corner           ACS_LLCORNER   +         m        0x6d
    large plus or crossover     ACS_PLUS       +         n        0x6e
    scan line 1                 ACS_S1         ~         o        0x6f
    scan line 3                 ACS_S3         -         p        0x70
    horizontal line             ACS_HLINE      -         q        0x71
    scan line 7                 ACS_S7         -         r        0x72
    scan line 9                 ACS_S9         _         s        0x73
    tee pointing right          ACS_LTEE       +         t        0x74
    tee pointing left           ACS_RTEE       +         u        0x75
    tee pointing up             ACS_BTEE       +         v        0x76
    tee pointing down           ACS_TTEE       +         w        0x77
    vertical line               ACS_VLINE      |         x        0x78
    less-than-or-equal-to       ACS_LEQUAL     <         y        0x79
    greater-than-or-equal-to    ACS_GEQUAL     >         z        0x7a
    greek pi                    ACS_PI         *         {        0x7b
    not-equal                   ACS_NEQUAL     !         |        0x7c
    UK pound sign               ACS_STERLING   f         }        0x7d
    bullet                      ACS_BULLET     o         ~        0x7e

举个例子

tput smacs
printf "%s\n%s\n" 'lqqqqqk' 'mqqqqqj'
tput rmacs

输出

┌────┐
└────┘

观察结果

我注意到,在我的系统上,并非列出的所有字符实际上都按照描述进行映射。例如

echo '+ , - . 0 ` a f g h i j k l m n o p q r s t u v w y x z { | } ~'
tput smacs
echo '+ , - . 0 ` a f g h i j k l m n o p q r s t u v w y x z { | } ~'
tput rmacs

+ , - . 0 ` a f g h i j k l m n o p q r s t u v w y x z { | } ~
+ , - . 0 ♦ # ° ± n ↓ ┘ ┐ ┌ └ ┼ ⎺ ⎻ ─ ⎼ ⎽ ├ ┤ ┴ ┬ ≤ │ ≥ # ≠ £ ·

答案2

正如另一位用户所评论的,它需要特殊的方框图字符。在终端中,可以通过命令调用它们printf。例如,要重新创建tree问题中示例的前两行,它看起来像:

printf "\x1b(0\x74\x1b(B\x1b(0\x71\x1b(B\x1b(0\x71\x1b(B info\n"
printf "\x1b(0\x78\x1b(B   \x1b(0\x6d\x1b(B\x1b(0\x71\x1b(B\x1b(0\x71\x1b(B exclude\n"

对于画框字符的列表,请参阅维基百科页面

答案3

它只使用 uni-code 字符:Unicode 大约有 2^24 个字符。它包含 ASCII 作为其前 128 个字符,然后继续包含所有语言(包括数学)的字符,包括一些虚构的字符、绘图字符、表情符号等。

您可以在uni-code绘图字符中查找字符(例如https://en.wikipedia.org/wiki/Box-drawing_character#Unicode),或者直接复制示例中的内容。

这是相同的角色。它们在该网站上的渲染效果不佳(可能是字体)。然而,它是相同的文本。如果你粘贴回终端,它看起来会是一样的。

├── media
│   ├── cdrom
│   ├── other

其他答案给出了另一种方法。我不知道每个的优点和缺点。很高兴听到他们的声音。

答案4

尽管其他答案已经向您指出了方框图字符,但您应该小心地在您的应用程序中自行使用硬编码的终端序列,如这些答案中给出的那样。请注意,可能有些终端根本不理解这些序列,而是会输出一些垃圾。

如果您对此一无所知,请限制使用这些序列或使用库,它能够以统一的方式处理终端尴尬,例如ncurses.这些库还有一个用于绘制水平线的原语(具有适当的回退)。

如果您仍然热衷于自己完成此操作并且没有像 之类的终端数据库的帮助libterminfo,那么您有以下可能性:

  • 查找您要寻址的终端是否支持所有要发送的序列+字符(如果不支持,请找到一些替代品),对您要支持的每个终端重复此操作
  • 如果您的目标终端支持 Unicode (UTF-8),您可能可以直接插入相应的 Unicode 字符(测试发送 U+2500 是否正确显示)

相关内容