タイトルと通知
sshcのTerminalは、ターミナル内で動くプログラムが送る標準のエスケープシーケンスを解釈します。専用のプラグインやフックは必要ありません。macOSのTerminal.appやiTerm2でタブ名が変わる仕組みや、Claude Code、Codexが通知を出す仕組みを、そのままブラウザのsshcで使えます。
| 目的 | シーケンス | 送る側の例 |
|---|---|---|
| ペイン名を変える | OSC 0、OSC 1、OSC 2 | zsh/bashのプロンプト設定、vim、tmux、Claude Code、Codex |
| 通知を出す | OSC 9(iTerm2形式)、OSC 99(kitty形式)、OSC 777(rxvt/tmux形式) | Claude Code、Codex、cmux notifyのような通知コマンド |
| 進み具合を出す | OSC 9;4(ConEmu形式) | cargo、wingetなど、Windows TerminalやGhosttyの進捗表示に対応したコマンド |
| 何をしているかを知らせる | OSC 7501(Program Status Protocol) | Claude Code、対応したプログラムやシェルの関数 |
ペイン名
プログラムがESC ] 0 ; 名前 BELのようなシーケンスでタイトルを設定すると、そのペインの見出し、セッション一覧、コマンド検索の候補の表示名が同じ名前になります。SSH先のシェルが送ったタイトルも、sshcエンジンが受け取って同じように反映します。
- 利用者がペイン名を固定している間は、プログラムからのタイトルで上書きしません。[自動の名前に戻す]を選ぶと、再びプログラムのタイトルまたは接続エイリアスを表示します。
- プログラムがタイトルを空にすると、接続エイリアスまたはシェル名に戻ります。
- 再接続や再起動で新しいシェルが始まると、前のタイトルは消え、新しいシェルが送るタイトルを待ちます。
- 制御文字は取り除き、64文字までを表示します。
試すには、ペイン内で次を実行します。
printf '\e]0;hello\a'実行中のコマンドの名前
ローカルシェルでコマンドが1秒以上動いていると、sshcはそのコマンドの名前をペイン名の前に付けて表示します。sleep 31を実行しているあいだはペイン名がsleep · aida@r100: ~になり、コマンドが終わると元に戻ります。シェルの設定は要りません。シェルが今動かしているプロセスの名前を、sshcエンジンがOSから読みます。
| 場合 | ペイン名 |
|---|---|
| シェルがタイトルを送っている(Debian・Ubuntuのbashの既定の設定など) | sleep · aida@r100: ~ |
| シェルがタイトルを送っていない | sleep |
| 動いているプログラムが自分でタイトルを送った(Claude Code、vimなど) | そのプログラムのタイトル |
| 利用者がペイン名を固定している | 固定した名前 |
- 1秒より早く終わるコマンド(
lsなど)の名前は出しません。ペイン名がちらつかないようにするためです。 - 名前を読めるのは、LinuxとmacOSで動くsshcエンジンのローカルシェルだけです。Windowsなどで動くsshcエンジンでは、ペイン名にコマンドの名前は出ません。
- 名前は15文字までで、それより長い名前は途中で切れます。
- [Settings]→[Terminal]→[操作]の[ペイン名に実行中のコマンドを出す]をオフにすると、名前を出しません。
SSHセッションでは、sshcはコマンドの名前を出せません。接続先で何が動いているかは、SSHでは届かないためです。接続先のシェルがコマンドを動かす前にタイトルを送るように設定すると、同じ形のペイン名になります。
zshでは、接続先の~/.zshrcに次を足します。
preexec() { local words=(${(z)1}); print -rn -- $'\e]2;'"${words[1]} · ${(%):-%n@%m: %~}"$'\a' }
precmd() { print -rn -- $'\e]2;'"${(%):-%n@%m: %~}"$'\a' }bash 4.4以降では、接続先の~/.bashrcに次を足します。プロンプトに戻ったときのタイトルは、Debian・Ubuntuの既定の~/.bashrcが送るものになります。
PS0='\e]2;$(fc -ln -0 | sed -E "s/^[[:space:]]+//; s/ .*//") · \u@\h: \w\a'bashで、先頭に空白を付けたコマンドを履歴に残さない設定(HISTCONTROL=ignorespaceかignoreboth。Debian・Ubuntuの既定はignoreboth)のときは、そのコマンドを動かしているあいだ、1つ前のコマンドの名前が出ます。
通知
プログラムがOSC 9、OSC 99、OSC 777で通知を求めると、sshcはそのペインを未読として扱います。
- sshcのタブがバックグラウンドにあるか、sshcのウィンドウにフォーカスが無い(横に並べた別のアプリで作業している)か、別のセッションを見ている間に届いた通知は、セッション一覧に未読の印を付けます。そのセッションを表示すると消えます。
- タブがバックグラウンドにあるときと、ウィンドウにフォーカスが無いときは、[Settings]→[Notifications]で許可していればブラウザ通知を出し、選んだ通知音を鳴らします。ブラウザ通知の見出しはペイン名で、SSHでは接続エイリアスを先頭に置き、ペイン名を括弧に入れます(
orchid(API認証の修正))。ペイン名は接続先のプログラムが変えられますが、接続エイリアスは変えられないため、sshc自身の通知と見分けられます。本文にはプログラムが送ったタイトルと本文を表示します。 - Androidアプリでは、ブラウザ通知の代わりにAndroidの通知を出します。sshcを閉じている(ほかのアプリやホーム画面を表示している)ときに届き、押すとそのペインを開きます。音はAndroidの通知では鳴らさず、選んだ通知音だけを鳴らします。本文はロック画面には表示しません。Androidの通知では、アプリ名の横に、ターミナルのプログラムからの通知であることを表示します。
- 通知を出したセッションを表示したときと、そのセッションを閉じたときは、OSの通知センターやAndroidの通知欄に残った通知も取り下げます。閉じたセッションの通知を押したときは、ほかのセッションへは移らず「このセッションは閉じています。」と知らせます。
- 表示中のペインに届いた通知は、未読にも通知音にもなりません。
- BEL(
\a)だけの出力は通知として扱いません。補完の失敗などで頻繁に鳴るためです。
試すには、ペイン内で次のどれかを実行してから別のタブへ移ってください。
printf '\e]9;Task complete\a'
printf '\e]777;notify;Build finished;main.go compiled\a'長いコマンドの終わり
シェルがOSC 133(シェル統合)でコマンドの始まりと終わりを知らせると、sshcエンジンがその時間を計ります。30秒以上かかったコマンドが終わると、プログラムからの通知と同じ決まりで、未読の印、ブラウザ通知、通知音で知らせます。本文は「コマンドが95秒で完了しました。」のようになり、シェルが0以外の終了コードを知らせたときは「コマンドが95秒で失敗しました(終了コード2)。」になります。時間を計るのはsshcエンジンなので、別のワークスペースのセッションや、分割表示に出していないセッションのコマンドも知らせます。
試すには、シェル統合を入れたシェルで次を実行してから別のセッションへ移ってください。
sleep 31; false進み具合
プログラムがESC ] 9 ; 4 ; 状態 ; 百分率 BELで進み具合を送ると、sshcは次の2か所に表示します。別のセッションを表示しているあいだも、一覧で進み具合を確認できます。
| 場所 | 表示 |
|---|---|
| ペインの見出し | 下端の線。薄い地の線が全体の長さを表す |
| セッション一覧の行 | 先頭の点の代わりに、百分率まで塗った輪 |
- 状態は1が通常、2がエラー(赤)、3が終わりの分からない処理、4が一時停止(黄)、0が消去です。エラーと一時停止で百分率を省くと、直前の値を使います。
- 終わりの分からない処理は、見出しでは左右に動く線、一覧では回る輪で表示します。
- 一覧では、プログラムの状態(OSC 7501)が入力待ち・完了・失敗のときは、輪の代わりにその印を出します。接続中・再接続中・終了したセッションは、接続の状態を出します。
- シェルがOSC 133でコマンドの終了を知らせたときと、セッションが新しいシェルに替わったときにも消します。
試すには、ペイン内で次を実行します。
printf '\e]9;4;1;40\a'; sleep 3; printf '\e]9;4;0\a'プログラムの状態
プログラムがOSC 7501で自分の状態(作業中、入力待ち、完了、失敗)を知らせると、セッション一覧の行の点を状態の印に替え、2行目に「許可待ち」などの状態と、プログラムが送った文を続けて出します。
- 作業中と入力待ち(許可待ち・回答待ち・認証待ち)は、プログラムが終わってシェルのプロンプト(OSC 133のA)に戻るか、シェルが替わると消えます。
- 完了と失敗は、そのセッションを表示すると消えます。未読の通知と同じく、このブラウザで見たかで決めます。
- 待機中(idle)は印を出しません。接続中・再接続中・終了したセッションは、接続の状態を出します。
- ブラウザでは、プログラムが入力を待ち始めると、タブがバックグラウンドにあるときとウィンドウにフォーカスが無いときに、ブラウザ通知を出して選んだ通知音を鳴らします。押すとそのセッションを開き、プログラムが待つのをやめると取り下げます。別のセッションを見ているあいだに待ち始めたものは、sshcから離れたときに1回だけ知らせます。通知の許可は、最初にプログラムの状態を受け取ったときに[お知らせ]で1回だけ聞きます。あとから[Settings]→[Notifications]でも許可できます。
- Androidアプリでは、プログラムが入力を待ち始めると、sshcを閉じているあいだAndroidの通知を出します。押すとそのセッションを開き、プログラムが待つのをやめると取り下げます。音と画面の上への表示は、Androidの設定の通知チャンネル「許可待ち・入力待ち」で変えられます。通知の許可は、最初にプログラムの状態を受け取ったときに[お知らせ]で1回だけ聞きます。リモートセッションでは、選んでいるsshcエンジンの分だけ、アプリの画面が裏で動いているあいだに届きます。
試すには、ペイン内で次を実行し、別のセッションを開いて待ちます。
printf '\e]7501;state=working\e\\'; sleep 5; printf '\e]7501;state=done:msg=%s\e\\' "$(printf 'Docs built' | base64)"Claude Codeの状態
Claude Codeは自分の状態をOSC 7501で送ります。起動するだけで、セッション一覧に作業中、許可待ち、回答待ち、完了を表示します。設定やフックは必要ありません。
- 許可待ちには
許可待ち · approve Bash: npm testのように、何を待っているかを続けて表示します。 - 完了にはClaude Codeが送った要約を続けて表示し、そのセッションを表示すると消えます。
tmuxの中では、許可待ちと回答待ちだけを表示します。詳しくはtmuxの中で使うを見てください。
Claude Codeで通知を受け取る
許可待ちと回答待ちの通知は設定しなくても届きます(プログラムの状態)。Claude Codeが自分で送るデスクトップ通知も受け取るには、次の設定をします。
Claude Codeは、既定ではGhostty、Kitty、iTerm2を検出したときだけデスクトップ通知を送ります。sshcのTerminalはこの検出に含まれないため、~/.claude/settings.jsonで通知の送り方を明示します。iterm2はOSC 9、kittyはOSC 99を送り、どちらもsshcが受け取ります。
{
"preferredNotifChannel": "iterm2"
}タスクの完了と権限確認の待ちが通知になります。Claude Codeがタスクの要約をタイトルに送る場合は、ペイン名にも反映されます。
Codexで通知を受け取る
Codexの~/.codex/config.tomlで、TUI通知を有効にし、送り方をosc9に固定します。autoのままだと、sshcをOSC 9対応と判定できずBELへ切り替わることがあります。
[tui]
notifications = true
notification_method = "osc9"notificationsには["agent-turn-complete", "approval-requested"]のように種類を並べて絞り込むこともできます。
tmuxの中で使う
tmuxの中で動くプログラムからの通知やタイトルを外側のTerminalへ通すには、~/.tmux.confに次を加えます。
set -g allow-passthrough on
set -g set-titles onClaude Codeの許可待ちと回答待ち
tmuxはOSC 7501を通さないので、tmuxの中のClaude Codeは自分の状態を知らせません。そこでsshcエンジンが画面を読み、Claude Codeの問いが見えているあいだは、プログラムの状態と同じように「許可待ち」「回答待ち」を出します。セッション一覧の表示、ブラウザ通知、Androidの通知は、tmuxの外と同じです。[tmuxで開く]でも、自分で打ったtmuxでも働きます。
- 読めるのは画面に見えている問いだけです。tmuxの別のウィンドウにある問いは読めません。そのウィンドウを離れると表示は消え、戻るとまた出ます。tmuxからデタッチしているあいだも読めません。
- 読み取るのはClaude Code 2.1.318の問いの文と形です。Claude Codeの更新で文が変わると、読めなくなることがあります。
- 表示するのは待っていることと種類だけです。tmuxの外のように、実行するコマンドや質問の文は出しません。
- 問いと同じ文字を表示して、その下に何も続かないときは、問いとして読むことがあります(
watch catで問いの写しを表示したときや、tmuxの外のlessで問いの写しの終わりまで表示したときなど)。tmuxの中でcatやlessを使って表示したときは読みません。
反映されない場合
sshc --versionがv0.35.0以降か確認します。- ペイン内で上の
printfを実行し、ペイン名や未読の印が変わるか確認します。変わる場合、sshc側は動作しています。 - Claude Code/Codexの設定を保存した後、新しいセッションを開始します。
- SSH先でエージェントを動かしている場合、設定はその環境のホームフォルダに置きます。
- tmuxやscreenを挟んでいる場合は、パススルーの設定を確認します。