🐱

Kittyターミナルで透明度をトグルするカスタムkittenの実装

に公開

TL;DR

Kittyターミナルで背景の透明度を1キーでトグルする機能を、カスタムkittenとして実装しました。kitty.fast_data_typesを使用して現在の透明度を取得し、半透明と不透明の間で切り替えます。

はじめに

ターミナルアプリを使っていて、背景の透明度を簡単に切り替えたいと思ったことはありませんか?

コーディング中は背景を透明にして後ろの資料を見ながら作業したりしていますが、スクリーンショットの取得や、他人への画面共有などでは不透明にして見やすくする、といった使い方です。

Kittyにはset_background_opacityというビルトインアクションがありますが、これは絶対値を指定する必要があり、トグル動作はできません。そこで、カスタムkittenを使って透明度をトグルする機能を実装してみました。

Kittyのカスタムkittenとは

Kittyのkittenは、ターミナルの機能を拡張するためのPythonスクリプトです。Kittyの内部APIにアクセスでき、ウィンドウやタブの操作、設定の変更などが可能です。

カスタムkittenは、~/.config/kitty/kittens/ディレクトリに配置し、以下の2つの関数を定義します。

from kitty.boss import Boss

def main(args: list[str]) -> str:
    # ユーザー入力などの処理
    return result

def handle_result(args: list[str], answer: str,
                  target_window_id: int, boss: Boss) -> None:
    # kittyへの操作を実行
    pass

kitty.fast_data_typesを使用した実装

GitHubのissue #6691で、Kittyの開発者が推奨している方法を見つけました。kitty.fast_data_typesモジュールを使用する方法です。

これを参考に実装してみました。

ディレクトリ構成

~/.config/kitty/
├── kitty.conf
└── kittens/
    └── toggle_opacity.py

toggle_opacity.py

#!/usr/bin/env python3
"""透明度を切り替えるkitten"""

from typing import List
from kitty.boss import Boss


def main(args: List[str]) -> str:
    return ""


def handle_result(args: List[str], answer: str, target_window_id: int, boss: Boss) -> None:
    """透明度を切り替える"""
    import kitty.fast_data_types as f

    # 透明度の値を設定
    transparent = 0.6
    opaque = 1.0

    # 現在フォーカスされているOSウィンドウIDを取得
    os_window_id = f.current_focused_os_window_id()

    # 現在の透明度を取得
    current_opacity = f.background_opacity_of(os_window_id)

    # 透明度を切り替え
    if current_opacity < 0.8:
        new_opacity = opaque
    else:
        new_opacity = transparent

    # 透明度を設定
    boss.set_background_opacity(str(new_opacity))


handle_result.no_ui = True

kitty.confの設定

# 動的な透明度変更を有効化
dynamic_background_opacity yes

# リモートコントロールを有効化
allow_remote_control yes

# 透明度切り替え: Ctrl+a → g
map ctrl+a>g kitten kittens/toggle_opacity.py

実装のポイント

1. kitty.fast_data_typesモジュールの使用

kitty.fast_data_typesは、KittyのC拡張モジュールで、高速な操作が可能です。

import kitty.fast_data_types as f

# 現在フォーカスされているウィンドウIDを取得
os_window_id = f.current_focused_os_window_id()

# 現在の透明度を取得
current_opacity = f.background_opacity_of(os_window_id)

このモジュールを使うことで、現在の透明度を取得できます。

2. dynamic_background_opacityの設定

dynamic_background_opacity yesを設定しないと、実行時に以下のエラーが発生します。

Cannot change background opacity
You must set the dynamic_background_opacity option in kitty.conf

動作確認

実装後、以下のように動作します。

  1. Kittyを起動
  2. Ctrl+aを押してからgを押す
  3. 透明度が0.6(透明)と1.0(不透明)の間で切り替わる

現在の透明度を取得してから判断するため、Kittyを再起動しても正しく動作します。

まとめ

Kittyのカスタムkittenを使って、透明度をトグルする機能を実装しました。

以下が要点でした。

  • kitty.fast_data_typesモジュールで現在の透明度を取得
  • boss.set_background_opacity()で透明度を設定
  • dynamic_background_opacity yesの設定が必須
  • subprocessの使用は避ける(アプリがフリーズする)

参考資料

GitHubで編集を提案

Discussion