tmuxで選択範囲をbatでシンタックスハイライト表示させる備忘録

最近OpenAIのCodex CLIを使い始めました。表示してくれるコードに色が付いていないため、個人的には見づらいです。

codexがシンタックスハイライト

issueなどは立っていますし、シンタックスハイライトはいずれ対応されそうな機能だと思います。が、ここではtmuxを使って力技でなんとかしました。肝心の差分表示の部分ではまだ対応できてませんが、まぁtmuxのコマンドを組み合わせて使ういい例になったので備忘録として残しておきます。

※この記事はバージョン3.5aのtmuxに基づいて書いています。

対応

「コピーモードの選択範囲」をハイライト付きでpopup表示するキーバインドです。

.tmux.conf
bind-key -N "cmode: 選択範囲を言語指定してbatで表示" -T copy-mode-vi b {
command-prompt -p 'language:' \
-I "md" \
"send-keys -X copy-pipe-no-clear '\
tmux load-buffer -; \
tmux display-popup -w 95% -h 90% -E \
\"tmux show-buffer | bat --paging=always -l=%%\"
'
"
}

解説

tmuxの設定ファイルの書き方やコピーモードは別の記事に書いていますので「知らないぞ」って人は先にどうぞ。

command-prompt

command-promptを使い、batに渡す言語を指定します。

command-prompt -p "プロンプト" -I "初期値" "<command>"

ここで入力した内容は<command>%%に埋め込まれます。

command-prompt -p 'language:' \
-I "md" \
"send-keys -X copy-pipe-no-clear '\
tmux load-buffer -; \
tmux display-popup -w 95% -h 90% -E \
\"tmux show-buffer | bat --paging=always -l=%%\"
'
"

send-keys

send-keys -X <command>でコピーモード中にコマンドを実行できます。

send-keys -X copy-pipe-no-clear '\
tmux load-buffer -; \
tmux display-popup -w 95% -h 90% -E \
\"tmux show-buffer | bat --paging=always -l=%%\"
'

copy-pipe-no-clear

copy-pipeで選択範囲を次のコマンドに標準入力として渡せます。今回は選択範囲をクリアしないバージョンのcopy-pipe-no-clearを使っています。
言語指定でtypoしたときにもう一度すぐ実行できるようにするためです。

buffer系

load-buffer -で標準入力をバッファに入れています。
show-bufferでバッファを吐き出してます。

display-popup

ポップアップです。batを使ってシンタックスハイライトしています。

tmux display-popup -w 95% -h 90% -E \
\"tmux show-buffer | bat --paging=always -l=%%\"
ポップアップの実例

一時的にCodexのために作ったキーバインドですが、もしAIエージェントCLI以外で役に立つ場面があれば追記します。