端末に連続線を描くには?

端末に連続線を描くには?

私はしばらくこの質問を探していましたが、満足のいく答えを得ませんでした。

私は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質問例の最初の 2 行を再作成するには、次のようにします。

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

Unicode文字のみを使用してください。 Unicodeには約2^24文字があります。これには、最初の128文字のASCIIが含まれており、その後、いくつかの仮想文字、絵文字、絵文字など、すべての言語(数学を含む)の文字が含まれます。

Unicode 描画文字で文字を検索できます。https://en.wikipedia.org/wiki/Box-print_character# Unicode)または例から直接コンテンツをコピーしてください。

同じキャラクターです。サイトで正しくレンダリングされません(おそらくフォント)。しかし、それは同じテキストです。端末に再貼り付けると同じように見えます。

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

他の答えは別のアプローチを提供します。それぞれの長所と短所がわかりません。彼らの声を聞くことをお勧めします。

答え4

他の回答ではブロック図文字を指摘していますが、その回答に示すように、アプリケーションで直接ハードコードされた端末シーケンスを使用する場合は注意が必要です。これらのシーケンスをまったく理解しておらず、代わりにいくつかのゴミを出力する端末があるかもしれません。

これについて何も知らない場合は、これらのシーケンスで使用を制限したり、一様な方法で端末の厄介さを処理するライブラリを使用してください。たとえば、ncursesこれらのライブラリには水平線を描画するための基本的な要素もあります(適切なフォールバックを含む)。

それでも、このようなターミナルデータベースの助けを借りずに直接これを実行したい場合は、libterminfo次の可能性があります。

  • アドレスを指定する端末が送信したいすべてのシーケンス+文字をサポートしていることを確認し(そうでない場合は選択肢を見つけてください)、サポートしたい各端末に対してこれを繰り返します。
  • ターゲット端末がUnicode(UTF-8)をサポートしている場合は、そのUnicode文字を直接挿入できます(U + 2500を送信して正しく表示されるかどうかをテスト)。

関連情報