터미널에 연속선을 그리는 방법은 무엇입니까?

터미널에 연속선을 그리는 방법은 무엇입니까?

나는 한동안 이 질문을 찾고 있었지만 만족스러운 답변을 얻지 못했습니다.

나는 Gnu/Linux 명령의 출력에서 ​​이 스크린샷을 찍었습니다 tree.

여기에 이미지 설명을 입력하세요.

이런 선을 그리거나 인쇄하는 방법을 알고 싶어서 트리 프로그램의 소스 코드를 읽어 보았지만 아무것도 이해할 수 없었습니다.

답변1

man 5 terminfoterminfo(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을 보내 올바르게 표시되는지 테스트).

관련 정보