답변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
유니코드 문자만 사용합니다. 유니코드에는 약 2^24자가 있습니다. 여기에는 처음 128개의 문자로 ASCII가 포함되어 있으며 이후 일부 가상 문자, 그림 문자, 이모티콘 등을 포함하여 모든 언어(수학 포함)에 대한 문자가 포함됩니다.
유니코드 그리기 문자에서 문자를 찾을 수 있습니다(예:https://en.wikipedia.org/wiki/Box-print_character#유니코드) 또는 예제에서 직접 내용을 복사하세요.
같은 캐릭터입니다. 사이트에서 제대로 렌더링되지 않습니다(아마도 글꼴). 그러나 그것은 동일한 텍스트입니다. 터미널에 다시 붙여넣으면 동일하게 보입니다.
├── media
│ ├── cdrom
│ ├── other
다른 답변은 또 다른 접근 방식을 제공합니다. 각각의 장점과 단점을 모르겠습니다. 그들의 목소리를 듣는 것이 좋습니다.
답변4
다른 답변에서는 블록 다이어그램 문자를 지적했지만 해당 답변에 나와 있는 것처럼 애플리케이션에서 직접 하드코딩된 터미널 시퀀스를 사용할 때는 주의해야 합니다. 이러한 시퀀스를 전혀 이해하지 못하고 대신 일부 쓰레기를 출력하는 터미널이 있을 수 있습니다.
이에 대해 아무것도 모르는 경우 이러한 시퀀스로 사용을 제한하거나 균일한 방식으로 터미널 어색함을 처리하는 라이브러리를 사용하십시오. 예를 들어 ncurses
이러한 라이브러리에는 수평선을 그리기 위한 기본 요소도 있습니다(적절한 폴백 포함).
여전히 이와 같은 터미널 데이터베이스의 도움 없이 직접 이 작업을 수행하고 싶다면 libterminfo
다음과 같은 가능성이 있습니다.
- 주소를 지정하는 터미널이 전송하려는 모든 시퀀스 + 문자를 지원하는지 확인하고(그렇지 않은 경우 대안을 찾으십시오) 지원하려는 각 터미널에 대해 이를 반복하십시오.
- 대상 터미널이 유니코드(UTF-8)를 지원하는 경우 해당 유니코드 문자를 직접 삽입할 수 있습니다(U+2500을 보내 올바르게 표시되는지 테스트).