Writing

OpenCodeの背景も透過させたいから透過させた

Zedの透明ターミナルで、OpenCodeのTUIを“端末の背景”に馴染ませる。

OpenCodeZedThemeTerminal

Zedのターミナルを透明にして、壁紙がうっすら見えるのが気に入ってます。

で、codex は素直に透けるのに、opencode は真っ黒い背景で主張してくる。あれ、なんで?というところから始まりました。

端末の透過が「効く条件」

結論から言うと、透明に“見える”ための条件はシンプルです。

  • 端末側(Zed)が透明になっている
  • アプリ側(opencode)が背景を塗らない(= 端末のデフォルト背景を使う)

Zedがいくら透明でも、アプリが黒で塗ったら透けません。

OpenCodeはテーマで背景を塗る

OpenCodeはテーマを持っていて、デフォルトは opencode テーマです。

そしてテーマによっては背景を塗ります。だから透けない。

逆に、テーマの色指定で none(terminal default)を使うと、端末の背景がそのまま見えるようになります。

まずは system テーマを試す

手っ取り早いのは /themesystem を選ぶこと。

system は terminal defaults を尊重する設計なので、これだけで期待どおりになることがあります。

どうしても透けたいなら、カスタムテーマ

「背景は絶対に塗らない」ことを担保するために、カスタムテーマを作りました。

ポイントはこれだけ。

  • background / backgroundPanel / backgroundElement"none" にする
  • 文字色はZedの experimental.theme_overrides を参考に寄せる

Zed側で半透明(#RRGGBBAA)を使っていても、OpenCodeのテーマは基本的にアルファ付きHEXを扱わないので、透過は "none" に任せる方が安定です。

テーマファイル(グローバル)

ユーザーグローバルで使うなら、ここに置きます。

  • ~/.config/opencode/themes/zed-transparent.json
{
  "$schema": "https://opencode.ai/theme.json",
  "defs": {
    "fg": "#e4e4ef",
    "niagara": "#96a6c8",
    "yellow": "#ffdd33",
    "green": "#73c936",
    "red": "#f43841",
    "quartz": "#95a99f",
    "brightBlack": "#453d41"
  },
  "theme": {
    "primary": "niagara",
    "secondary": "quartz",
    "accent": "niagara",
    "error": "red",
    "warning": "yellow",
    "success": "green",
    "info": "niagara",
    "text": "fg",
    "textMuted": "quartz",
    "background": "none",
    "backgroundPanel": "none",
    "backgroundElement": "none",
    "border": "brightBlack",
    "borderActive": "yellow",
    "borderSubtle": "brightBlack"
  }
}

OpenCodeのグローバル設定

~/.config/opencode/opencode.json にテーマ名を指定します。

{
  "$schema": "https://opencode.ai/config.json",
  "theme": "zed-transparent"
}

これで、Zedの透明ターミナルの上にOpenCodeが“乗る”ようになります。

repo固有設定は作らない

プロジェクト直下に opencode.json を置くと、それがグローバルより優先されます。

「このrepoだけ」になってほしくない場合は、設定とテーマは ~/.config/opencode/ にまとめるのが吉です。

参考