
2026/01/29 23:49
CLI アプリケーションで色を選ぶ方法(2023)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
概要
本稿では、macOS Terminal.app の「Basic」、Ubuntu Tango Light/Dark、および GitHub が好む Solarized Light/Dark という三つの人気テーマにおいて、ターミナルカラーがどれほど読みやすく残るかを検証しています。構文ハイライト付きコードは全てのテーマで約 0.02 秒で終了するため、パフォーマンスは問題ではありません。
カラーテストの結果、多くのパレットはコントラストが低いことが判明しました。Basic では bryellow がライトモードで読めず、blue/brblue がダークモードで失敗します。Tango は Light モードで bryellow の問題と Dark モードで brblack の問題を抱えていますが、そのグレースケールは一貫しています。Sorcerer テーマの黒は背景よりも暗いため、ステータスバーに有用であり、brwhite はテキストを微妙に強調します。
Solarized は Lab* カラースペースを使用して明度を対称化し、モード間でアクセントカラーを共有可能にしています。ただし、その 16 色パレットは 2011 年に丸め誤差を回避するために設計されたものであるため、鮮やかな色がインターフェース要素に再利用されることが多く、いくつかの CLI では灰色または見えない場合があります。
最終表を作成した結果、著者はこれら一般的な構成で読みやすさを保てる 32 通りのカラー設定(通常 + ボールド)のうち 11 種類 を発見しました。ボールドテキストはデフォルトで明るく表示されるため、ユーザー設定により可読性に影響します。「colortest」と「highlight」というテストユーティリティは架空ですが、ターミナルウィンドウのスタイリングは macOS Terminal.app を模して視覚的一貫性を保っています。
推奨 – 開発者は CLI で使用するカラーを上記で特定された「ほぼ問題ない」色に限定し、広範なユーザーに対して可読性を維持し、アクセシビリティの課題とサポート負荷を削減するとともに、CLI の普及を促進すべきです。
この改訂された概要は主要ポイントを完全に反映し、推論の不備を排除し、明瞭さを保ち、曖昧な表現を取り除いています。
本文
CLIツールで構文強調付きのソースコードを表示することを想定してみましょう。
まずは、選んだ端末テーマに合うような色を決めます。
~ — zsh — Sorcerer — 51×11% highlight foo # just some docs func HelloWorld() [12]u8 { return "hello world\n" } Finished highlighting in 0.02 seconds. % █Nice!
しかし、別のテーマを使っている人にとっても見やすいかどうかは分かりません。
少なくともデフォルト設定で試してみる価値はあるでしょう。
macOS Terminal.app のデフォルトテーマ
~ — zsh — Basic — 51×11% highlight foo # just some docs func HelloWorld() [12]u8 { return "hello world\n" } Finished highlighting in 0.02 seconds. % █~ — zsh — Basic — 51×11% highlight foo # just some docs func HelloWorld() [12]u8 { return "hello world\n" } Finished highlighting in 0.02 seconds. % █Youch!
次に、Ubuntu 等でデフォルトになる Tango テーマを試してみましょう。
Tango Light
~ — zsh — Tango Light — 51×11% highlight foo # just some docs func HelloWorld() [12]u8 { return "hello world\n" } Finished highlighting in 0.02 seconds. % █~ — zsh — Tango Dark — 51×11% highlight foo # just some docs func HelloWorld() [12]u8 { return "hello world\n" } Finished highlighting in 0.02 seconds. % █Hmm, better, but not by much.
最後に、最も人気のあるカスタム端末テーマである Solarized を試してみます。
Solarized Light
~ — zsh — Solarized Light — 51×11% highlight foo # just some docs func HelloWorld() [12]u8 { return "hello world\n" } Finished highlighting in 0.02 seconds. % █~ — zsh — Solarized Dark — 51×11% highlight foo # just some docs func HelloWorld() [12]u8 { return "hello world\n" } Finished highlighting in 0.02 seconds. % █Well then …
それでは各パレットを見てみましょう。
Sorcerer
~ — zsh — Sorcerer — 51×11% colortest ██ black ██ brblack ██ red ██ brred ██ green ██ brgreen ██ yellow ██ bryellow ██ blue ██ brblue ██ magenta ██ brmagenta ██ cyan ██ brcyan ██ white ██ brwhite
Sorcerer では、デフォルト背景に対してすべての色が可読性を保っています。ただし黒は実際には背景より暗くなっているため、ステータスバー等で背景色として使うと便利です。
白はデフォルト前景色と同じ色で、
brblack はやや薄い色です。さらに brwhite は前景色よりも明るく、エラーメッセージやタイトルなど重要なテキストを控えめに強調するのに適しています。
Basic
~ — zsh — Basic — 51×11% colortest ██ black ██ brblack ...
Basic テーマは、残念ながら非常に劣っており、90 年代の xterm を思わせる外観です。
bryellow はライトモードで読めません(前述のコードサンプルの関数名を確認してください)。ダークモードでは青と brblue が完全に読めない状態です。
その結果、安心して使用できる 13 色だけが残ります。
~ — zsh — Sorcerer — 51×11% colortest --only-usable ██ black ██ brblack ...
Tango
~ — zsh — Tango Light — 51×11% colortest ... ~ — zsh — Tango Dark — 51×11% colortest ...
私の見解では、Basic テーマよりはずっと良いですが、完全に完璧というわけではありません。
bryellow はライトテーマで再び読めませんし、brgreen はやや見づらいかもしれませんが、アプリケーションで brgreen を使用しても問題は生じないでしょう。
ここまで来ると、グレースケール ― 黒・
brblack・白・brwhite ― がライトとダークの両方テーマで一貫していることに気づくはずです。つまり、Tango Light では
{,br}white が読めず、Tango Dark では黒が読めません。要するに、以前考えていた「brwhite を使って内容を強調する」アイデアは破棄します。
Solarized
~ — zsh — Solarized Light — 51×11% colortest ...
Solarized は興味深いテーマです。
すべての色は Lab*(1970 年代に開発された視覚的均一性を持つ色空間)で選ばれています。
その明度は完全に対称で、Solarized Light と Dark が同じアクセントカラーセットを共有しながら等しいコントラストを保てます。さらに、ライトテーマの暖色系とダークテーマの寒色系は互いに補完関係にあります。
Solarized は非常に人気が高く、執筆時点で GitHub 上で最もスター数の多いテーマリポジトリです(15.4k スター)。次に近い Gruvbox は 11.8k スターしかありません。
Solarized の16色パレットの奇妙な構成を理解するには、2011 年に Solarized が初めて公開された時代へ戻る必要があります。
当時は24bit カラーをサポートする端末が存在せず、Vim テーマでは多くの場合「256 色パレットの最も近い値」に丸める手法が取られていました。この方法だとテーマの数学的対称性が破綻します。
そこで当時選ばれた解決策(実際はハック)は、Vim インターフェースで使用されるすべての色を 16 色に絞り込むことでした。Solarized のアクセントカラーは16色パレットの「ノンブライト」列に適合し、モノトーンカラーは「ブライト」列に収まります。ユーザーが端末で Solarized パレットを使用すると、Vim は 16 色だけでインターフェース全体を正しくカラリングできます。
しかし、Solarized が自ら採用したブライト色を利用するアプリケーションは見た目がおかしくなることがあります。多くの Solarized ユーザーが、CLI 出力が不自然にグレーまたは不可視になると報告しています。
brblack は Solarized Dark では読めないため、影響を受けるブライト色とともにテーブルから除外します。
太字(bold)についての注意
かつて端末が明るい色を表示できなかった時代、ハードウェアメーカーは「太字」を明るく表示することで対処しました。これは多くの現代端末エミュレータにデフォルトで残っており、ユーザー設定によっては通常のカラフルテキストが太字になると同時に明るくなることがあります。
結論
以上を踏まえて、許容できる色の最終表を提示します。
~ — zsh — Sorcerer — 51×21% colortest --only-usable --bold Regular: ██ black ██ brblack ... Bold: ██ boldblack ██ boldbrblack ...
合計で 32 のうち 11 色しか「ほぼ問題ない」「多くの人が使っている一般的設定では読める」と判断できる色です。
CLI ツールを開発し、自己以外の誰かに使用される予定なら、ここで示した「大体 OK」な色だけに限定してカラ―を使用することを強く推奨します。
付録
この投稿では、macOS Terminal.app のウィンドウをできる限り似せて色を選び、ピクセル単位で寸法を合わせています。タイトルバーの寸法は実際の画面上の寸法に極力近づけました。colortest と highlight ユーティリティは完全に架空です。
Terminal.app は「Basic」のライトとダークバリエーションを個別には提供しておらず、OS のテーマが変わると自動で切り替わります。この反応機能は他のテーマ(プリインストールまたはユーザー作成)には公開されていないようです。
この挙動を再現するために、本投稿の端末ウィンドウはサイト全体がライトモードかダークモードかで反応させています。ただし Basic ウィンドウは固定で、実際に「ライト Basic」と「ダーク Basic」の両方を同時に見ることはありません。
— Luna Razzaghipour (2023年1月29日)