Slide 1

Slide 1 text

ターミナル出力の色付け Yoichi Nakayama

Slide 2

Slide 2 text

ターミナル出力 プログラムが標準出力(stdout)や標準エラー出力(stderr)に書き込んだ内容はプログ ラムを実行したターミナル(terminal, 端末)上に出力される

Slide 3

Slide 3 text

ターミナル出力の例: ls ディレクトリ、実行権限が付いたファイルに色が付く

Slide 4

Slide 4 text

ターミナル出力の例: git diff ヘッダ、追加行、削除行に色が付く

Slide 5

Slide 5 text

ターミナル出力の例: git diff with delta シンタックスハイライト+行内の変更箇所にも色が付く https://github.com/dandavison/delta

Slide 6

Slide 6 text

ターミナル出力の例: emacs -nw モードに応じたシンタックスハイライト

Slide 7

Slide 7 text

色の付いた出力 普通に文字列を出力したときは単色だった プログラムによってはカラフルな出力がされていた →どうやったら色付けできるんだろう?

Slide 8

Slide 8 text

ls の出力を見てみる 出力をodにパイプしてバイナリダンプ 文字列と改行(0a)のみで特に変わったものは入ってない 改行?元々は一行の出力だったのに

Slide 9

Slide 9 text

感づかれてしまった パイプに気づいてlsは出力内容を変える→このままでは調べられない

Slide 10

Slide 10 text

回避 --color オプションを付けるとパイプしても色が付く→よさそう

Slide 11

Slide 11 text

色付き出力 色付き文字の手前に esc [ (CSI = Control Sequence Indicator)で始まる何か https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_sequences

Slide 12

Slide 12 text

試してみる ● echo -e で \xNN をバイトの16進表現と解釈してくれる ● \x1b = esc ● esc [ 30~37 m 文字色設定 ● esc [ 0 m リセット

Slide 13

Slide 13 text

まとめ ● CSI シーケンスを出力してターミナル出力を制御できる ● esc [ 30~37 m で文字色を8色から選んで設定できた ● パイプを検出すると色付けをやめる理由:余計なものが付くから ○ ls | grep ^dir1$ ターミナルの色付け完全に理解した!

Slide 14

Slide 14 text

色付けの例: emacs -nw M-x list-colors-display → 8色で終わりじゃない

Slide 15

Slide 15 text

256 colors ● 0~7: standard colors (ESC [ 30~37 m と同じ) ● 8~15: high intensity colors (ESC [ 90~97 m と同じ) ● 16~231: 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) ● 232~255: grayscale

Slide 16

Slide 16 text

True Color (24bit) R(0~255), G(0~255), B(0~255) supported terminals: https://gist.github.com/XVilka/8346728#terminals--true-color

Slide 17

Slide 17 text

応用: longcat -pixterm ▄ (U+2584, LOWER HALF BLOCK) の文字色と背景色を指定している https://yoichi22.hatenablog.com/entry/2020/07/12/110838

Slide 18

Slide 18 text

おしまい ターミナル出力のさらなるトピック ● DA1, DA2, DA3 ● Sixel Graphics ● ...