答案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 是否正确显示)