答え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
質問例の最初の 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を送信して正しく表示されるかどうかをテスト)。