Televisionの紹介: 検索対象などを事前に設定できるFuzzy Finder

Televisionの紹介: データソースなどを事前に設定できるFuzzy Finder

Television (以後tv) は検索対象や表示内容を事前に設定できるFuzzy Finderです。

記事執筆時の最新バージョン: v0.14.5

チャンネル

チャンネルとは

チャンネルはtvの中核となる構成要素です。 次のような、tvの検索対象や表示内容を定義している設定です。

  • 検索対象となるデータソース
  • 選択一覧やプレビューの表示方法
  • キーバインドの設定

他のfuzzy finder(fzf、skim、peco)で、パイプやオプションで指定する内容を、事前に設定として定義できます。

チャンネルの利点

チャンネルがあるおかげで、毎回コマンドラインでオプションを指定する必要がなくなります。

# チャンネルを使用する場合
$ tv channel-name
# チャンネルを使用しない場合
$ tv --source-command="fd --type file" --preview-command="bat --color=always '{}'"

# fzfで同じことをやる場合
$ fd --type file | fzf --preview="bat --color=always '{}'"

チャンネルの定義方法

チャンネルはTOMLで定義します。

tv channel-name で起動するチャンネル設定

# `tv --source-command="fd --type file" --preview-command="bat --color=always '{}'"`
# を `$ tv channel-name` で起動できるようにするチャンネル設定
[metadata]
name = "channel-name" # チャンネル名

[source]
command = ["fd -t f"] # 検索対象のデータを生成するコマンド

[preview]
command = "bat --color=always '{}'" # プレビュー表示のコマンド

カスタムチャンネルの配置ディレクトリ

  • Linux/macOS: ~/.config/television/cable/
  • Windows: %LocalAppData%\television\cable\

チャンネルの設定項目

主要セクション

  • metadata: チャンネル名や説明
  • source: 検索対象となるデータを生成するコマンド
  • preview: 選択した項目のプレビュー表示方法
  • ui: ユーザーインターフェースのカスタマイズ
  • keybindings: キーボード操作の割り当て
  • actions: カスタムコマンド実行の定義
[metadata]
# この値でチャンネル名が決まる。ファイル名では決まらない。
# この場合 `tv files` でこの.チャンネルが実行される
name = "files"
# channel切り替え、remote control(`Ctrl-t`)で使用される。
# remote controlで表示される説明文
description = "A channel to select files and directories"
# remote controlで表示されるコマンド
# 必要なコマンドがなくても、そのチャンネルは使用できる。
requirements = ["fd", "bat"]

[source]
# 検索対象のデータを生成するコマンド
# 配列の場合、`Ctrl-s`で切り替えができる
command = ["fd -t f", "fd -t f -H"]

[preview]
# プレビュー表示のコマンド
# `{}` は選択しているエントリに置換される。
# つまり `/path/to/file` を選択しているなら、
# `bat -n --color=always '/path/to/file'` が実行される
command = "bat -n --color=always '{}'"
# プレビューコマンドに渡す環境変数
env = { BAT_THEME = "ansi" }

[keybindings]
# F1キーでfilesチャンネルに切り変わる
shortcut = "f1"
# 選択しているエントリーに対して、この設定で定義している動作を実行する
f12 = "actions:edit"
ctrl-up = "actions:goto_parent_dir"

[actions.edit]
description = "Opens the selected entries with the default editor (falls back to vim)"
command = "${EDITOR:-vim} '{}'"
# `execute` なので新しいプロセスで実行する
# `fork` (デフォルト)なら、アクション終了後にtvに戻る
mode = "execute"

[actions.goto_parent_dir]
description = "Re-opens tv in the parent directory"
command = "tv files .."
mode = "execute"

詳細な設定オプションや高度な機能については、公式ドキュメントを参照してください。

コミュニティチャンネル

コミュニティによって作成されたチャンネルがあります。

コミュニティチャンネルの例

  • gh-issues: 現在のリポジトリのGitHub Issue一覧
  • gh-prs: 現在のリポジトリのGitHub PR一覧
  • sesh: tmuxセッション一覧

他のコミュニティチャンネルは公式ドキュメントを参照してください。

tv update-channels を実行すれば、コミュニティチャンネルを使用できるようになります。

使い方

$ tv # デフォルトチャンネルを起動する。デフォルトチャンネルは設定ファイルで変更できる
$ tv <チャンネル名> # <チャンネル名>のチャンネルを起動する
$ tv list-channels # 使用できるチャンネルの一覧を表示する

キーバインディング

  • Ctrl+k/Ctrl+j: カーソルの移動
  • Tab: 選択/選択解除の切り替え
  • Enter: 選択したものを出力して終了
  • Esc: 何もせずに終了
  • Ctrl+h: キーバインドのヘルプ表示

他のキーバインドは公式ドキュメントを参照してください。

shell統合

bash,zsh,fishなどのシェルと統合できます。

シェル統合で使用できるキーバインド(デフォルト)

  • Ctrl+r: シェルの履歴をtvで検索します。
  • Ctrl+t: 現在入力しているプロンプト内容を参照して、特定のtvのチャンネルを起動します。 (スマートコマンド補完) 例(プロンプト: 実行されるチャンネル)
    • cd: dirs (ディレクトリ検索)
    • cat: files (ファイル検索)
    • git checkout: git-branches (ブランチ検索)

shell統合の有効化方法は公式ドキュメントを参照してください。

shell統合の動作の設定方法

tvの設定ファイル

[shell_integration]
# スマートコマンド補完で、
# どのチャンネルにマッチしなかった場合に使用されるチャンネル
fallback_channel = "files"

# スマートコマンド補完で、
# プロンプトと紐付けるチャンネルの設定
[shell_integration.channel_triggers]
"dirs" = ["cd", "ls", "rmdir"]
"files" = [
  "cat"
]
"git-branch" = [
  "git checkout"
]

# シェル履歴検索やスマートコマンド補完で使用するキーバインド
[shell_integration.keybindings]
"smart_autocomplete" = "ctrl-t"
"command_history" = "ctrl-r"

設定ファイル

tvの設定ファイルはTOML形式です。

設定ファイルの場所

  • Linux/macOS: $HOME/.config/television/config.toml
  • Windows: %LocalAppData%\television\config.toml

設定例

# `tv` (引数なし)を実行したときに使用されるチャンネル
default_channel = "files"

[ui]
# 選択一覧ウィンドウとプレビューウィンドウの配置
# - londscape: 横並び
# - portrait: 縦並び
orientation = "landscape"

[ui.input_bar]
# 入力バーを上下どちらに配置するか
position = "botto"

[ui.preview_panel]
# プレビューウィンドウの幅または高さの割合 (パーセンテージ)
size = 50
# プレビューウィンドウのスクロールバーを表示するか
scrollbar = true

他にも多数の設定オプションがあります。詳細は公式ドキュメントを参照してください。

実用例

デフォルトチャンネルが起動する

$ tv # tv設定の `default_channel` で指定したチャンネルが起動する

Gitのログを検索する

$ git show # Ctrl+T を押す
# => git-log チャンネルが起動

過去のコマンドを検索

$ # Ctrl+R を押す => シェル履歴が起動する

GitHub Issueをブラウザで開く

$ tv gh-issues

ファイルを検索してエディタを開く

$ tv files
# F12を押す => 選択したファイルをエディタで開く

検索パターン

tvは複数の検索マッチャーをサポートしています。 fzfと同じ検索構文を使って、柔軟に検索方法を切り替えられます。

検索構文(fzfと同様)

  • 曖昧検索: foo
  • 部分文字列に完全一致: ’foo (パターンの先頭に を付ける)
  • 指定した文字列で始まる: ^foo (パターンの先頭に ^ を付ける)
  • 指定した文字列で終わる: foo$ (パターンの最後に $ を付ける)
  • 完全一致: ^foo$ (パターンを ^$ で囲む)
  • 否定: !foo, !^foo, !foo$ (パターンの前に ! を付ける)
  • AND検索: foo ’bar (スペース区切りで複数のパターンを組み合わせる)

fzfにあってtvにない検索機能

  • OR検索: foo | bar (| で区切る)
  • 単語マッチ: ’word’ ( で囲む)

インストール方法

  • 公式推奨: curl -fsSL https://alexpasmantier.github.io/television/install.sh | bash
  • brew: brew install television
  • mise: mise install television

nixなどの他のパッケージマネージャーでのインストール方法は公式ドキュメントを参照してください。

まとめ

データソースやプレビューなどの設定を毎回入力するのが面倒と感じているなら、televisionを試してみてはどうでしょうか?

参照

この記事をシェア

弊社では、一緒に会社を面白くしてくれる仲間を募集しています。
お気軽にお問い合わせください!