Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 ● ...