日本語
ドキュメント
テーマ

Themes

組み込みテーマを選択するか、独自のテーマを定義します。

OpenCode では、いくつかの組み込みテーマから 1 つを選んだり、ターミナルのテーマに適応するテーマを使ったり、独自のカスタムテーマを定義したりできます。

デフォルトでは、OpenCode は当社独自の opencode テーマを使用します。


Terminal requirements

テーマが完全なカラーパレットで正しく表示されるには、ターミナルが truecolor(24 ビットカラー)をサポートしている必要があります。最近のほとんどのターミナルはデフォルトでこれをサポートしていますが、有効にする必要がある場合があります:

  • サポートを確認する : echo $COLORTERM を実行します - truecolor または 24bit が出力されるはずです
  • truecolor を有効にする : シェルプロファイルで環境変数 COLORTERM=truecolor を設定します
  • ターミナルの互換性 : お使いのターミナルエミュレータが 24 ビットカラーをサポートしていることを確認します(iTerm2、Alacritty、Kitty、Windows Terminal、最近のバージョンの GNOME Terminal など、最近のほとんどのターミナルはサポートしています)

truecolor のサポートがない場合、テーマは色の精度が低下して表示されたり、最も近い 256 色の近似値にフォールバックしたりすることがあります。


Built-in themes

OpenCode には、いくつかの組み込みテーマが付属しています。

NameDescription
systemターミナルの背景色に適応します
tokyonightTokyonight (opens in a new tab) テーマがベース
everforestEverforest (opens in a new tab) テーマがベース
ayuAyu (opens in a new tab) ダークテーマがベース
catppuccinCatppuccin (opens in a new tab) テーマがベース
catppuccin-macchiatoCatppuccin (opens in a new tab) テーマがベース
gruvboxGruvbox (opens in a new tab) テーマがベース
kanagawaKanagawa (opens in a new tab) テーマがベース
nordNord (opens in a new tab) テーマがベース
matrix黒地に緑のハッカー風テーマ
one-darkAtom One (opens in a new tab) Dark テーマがベース

その他にも、当社は継続的に新しいテーマを追加しています。


System theme

system テーマは、ターミナルのカラースキームに自動的に適応するように設計されています。固定の色を使う従来のテーマとは異なり、system テーマは次のことを行います:

  • グレースケールを生成する : ターミナルの背景色に基づいてカスタムのグレースケールを作成し、最適なコントラストを確保します。
  • ANSI カラーを使用する : シンタックスハイライトと UI 要素に標準の ANSI カラー(0〜15)を活用し、ターミナルのカラーパレットを尊重します。
  • ターミナルのデフォルトを保持する : テキストと背景の色に none を使い、ターミナルのネイティブな外観を維持します。

system テーマは、次のようなユーザー向けです:

  • OpenCode をターミナルの外観に合わせたい
  • カスタムのターミナルカラースキームを使っている
  • すべてのターミナルアプリケーションで一貫した見た目を好む

Using a theme

/theme コマンドでテーマ選択を呼び出して、テーマを選択できます。または、tui.json で指定することもできます。

tui.json
{
  "$schema": "https://opencode.ai/tui.json",
  "theme": "tokyonight"
}

Custom themes

OpenCode は、ユーザーがテーマを簡単に作成・カスタマイズできる、柔軟な JSON ベースのテーマシステムをサポートしています。


Hierarchy

テーマは、後のディレクトリが先のディレクトリをオーバーライドする形で、次の順序で複数のディレクトリから読み込まれます:

  1. 組み込みテーマ - これらはバイナリに埋め込まれています
  2. ユーザー設定ディレクトリ - ~/.config/opencode/themes/*.json または $XDG_CONFIG_HOME/opencode/themes/*.json で定義
  3. プロジェクトルートディレクトリ - <project-root>/.opencode/themes/*.json で定義
  4. 現在の作業ディレクトリ - ./.opencode/themes/*.json で定義

複数のディレクトリに同じ名前のテーマが含まれている場合、優先度の高いディレクトリのテーマが使用されます。


Creating a theme

カスタムテーマを作成するには、テーマディレクトリのいずれかに JSON ファイルを作成します。

ユーザー全体のテーマの場合:

mkdir -p ~/.config/opencode/themes
vim ~/.config/opencode/themes/my-theme.json

そして、プロジェクト固有のテーマの場合:

mkdir -p .opencode/themes
vim .opencode/themes/my-theme.json

JSON format

テーマは、次のものをサポートする柔軟な JSON フォーマットを使用します:

  • Hex カラー : "#ffffff"
  • ANSI カラー : 3 (0〜255)
  • カラー参照 : "primary" またはカスタム定義
  • ダーク/ライトのバリアント : {"dark": "#000", "light": "#fff"}
  • 色なし : "none" - ターミナルのデフォルト色または透明を使用

Color definitions

defs セクションは任意で、テーマ内で参照できる再利用可能な色を定義できます。


Terminal defaults

特別な値 "none" は、ターミナルのデフォルト色を継承するために任意の色に使用できます。これは、ターミナルのカラースキームとシームレスに溶け込むテーマを作成するのに特に便利です:

  • "text": "none" - ターミナルのデフォルトの前景色を使用
  • "background": "none" - ターミナルのデフォルトの背景色を使用

Example

以下はカスタムテーマの例です:

my-theme.json
{
  "$schema": "https://opencode.ai/theme.json",
  "defs": {
    "nord0": "#2E3440",
    "nord1": "#3B4252",
    "nord2": "#434C5E",
    "nord3": "#4C566A",
    "nord4": "#D8DEE9",
    "nord5": "#E5E9F0",
    "nord6": "#ECEFF4",
    "nord7": "#8FBCBB",
    "nord8": "#88C0D0",
    "nord9": "#81A1C1",
    "nord10": "#5E81AC",
    "nord11": "#BF616A",
    "nord12": "#D08770",
    "nord13": "#EBCB8B",
    "nord14": "#A3BE8C",
    "nord15": "#B48EAD"
  },
  "theme": {
    "primary": {
      "dark": "nord8",
      "light": "nord10"
    },
    "secondary": {
      "dark": "nord9",
      "light": "nord9"
    },
    "accent": {
      "dark": "nord7",
      "light": "nord7"
    },
    "error": {
      "dark": "nord11",
      "light": "nord11"
    },
    "warning": {
      "dark": "nord12",
      "light": "nord12"
    },
    "success": {
      "dark": "nord14",
      "light": "nord14"
    },
    "info": {
      "dark": "nord8",
      "light": "nord10"
    },
    "text": {
      "dark": "nord4",
      "light": "nord0"
    },
    "textMuted": {
      "dark": "nord3",
      "light": "nord1"
    },
    "background": {
      "dark": "nord0",
      "light": "nord6"
    },
    "backgroundPanel": {
      "dark": "nord1",
      "light": "nord5"
    },
    "backgroundElement": {
      "dark": "nord1",
      "light": "nord4"
    },
    "border": {
      "dark": "nord2",
      "light": "nord3"
    },
    "borderActive": {
      "dark": "nord3",
      "light": "nord2"
    },
    "borderSubtle": {
      "dark": "nord2",
      "light": "nord3"
    },
    "diffAdded": {
      "dark": "nord14",
      "light": "nord14"
    },
    "diffRemoved": {
      "dark": "nord11",
      "light": "nord11"
    },
    "diffContext": {
      "dark": "nord3",
      "light": "nord3"
    },
    "diffHunkHeader": {
      "dark": "nord3",
      "light": "nord3"
    },
    "diffHighlightAdded": {
      "dark": "nord14",
      "light": "nord14"
    },
    "diffHighlightRemoved": {
      "dark": "nord11",
      "light": "nord11"
    },
    "diffAddedBg": {
      "dark": "#3B4252",
      "light": "#E5E9F0"
    },
    "diffRemovedBg": {
      "dark": "#3B4252",
      "light": "#E5E9F0"
    },
    "diffContextBg": {
      "dark": "nord1",
      "light": "nord5"
    },
    "diffLineNumber": {
      "dark": "nord2",
      "light": "nord4"
    },
    "diffAddedLineNumberBg": {
      "dark": "#3B4252",
      "light": "#E5E9F0"
    },
    "diffRemovedLineNumberBg": {
      "dark": "#3B4252",
      "light": "#E5E9F0"
    },
    "markdownText": {
      "dark": "nord4",
      "light": "nord0"
    },
    "markdownHeading": {
      "dark": "nord8",
      "light": "nord10"
    },
    "markdownLink": {
      "dark": "nord9",
      "light": "nord9"
    },
    "markdownLinkText": {
      "dark": "nord7",
      "light": "nord7"
    },
    "markdownCode": {
      "dark": "nord14",
      "light": "nord14"
    },
    "markdownBlockQuote": {
      "dark": "nord3",
      "light": "nord3"
    },
    "markdownEmph": {
      "dark": "nord12",
      "light": "nord12"
    },
    "markdownStrong": {
      "dark": "nord13",
      "light": "nord13"
    },
    "markdownHorizontalRule": {
      "dark": "nord3",
      "light": "nord3"
    },
    "markdownListItem": {
      "dark": "nord8",
      "light": "nord10"
    },
    "markdownListEnumeration": {
      "dark": "nord7",
      "light": "nord7"
    },
    "markdownImage": {
      "dark": "nord9",
      "light": "nord9"
    },
    "markdownImageText": {
      "dark": "nord7",
      "light": "nord7"
    },
    "markdownCodeBlock": {
      "dark": "nord4",
      "light": "nord0"
    },
    "syntaxComment": {
      "dark": "nord3",
      "light": "nord3"
    },
    "syntaxKeyword": {
      "dark": "nord9",
      "light": "nord9"
    },
    "syntaxFunction": {
      "dark": "nord8",
      "light": "nord8"
    },
    "syntaxVariable": {
      "dark": "nord7",
      "light": "nord7"
    },
    "syntaxString": {
      "dark": "nord14",
      "light": "nord14"
    },
    "syntaxNumber": {
      "dark": "nord15",
      "light": "nord15"
    },
    "syntaxType": {
      "dark": "nord7",
      "light": "nord7"
    },
    "syntaxOperator": {
      "dark": "nord9",
      "light": "nord9"
    },
    "syntaxPunctuation": {
      "dark": "nord4",
      "light": "nord0"
    }
  }
}