TUI
ドキュメント作成中
一部の内容はまだ不完全な場合があります。
同じワークスペースを、GUI なしで:
thinkterm tui [DOMAIN ...]これは別プログラムではなく thinkterm バイナリのサブコマンドなので、動かしていない間のコストはゼロです。
ミラーではなくピアです
TUI は GUI の読み取り専用ビューではありません。同じ権威サーバーのもう一つのクライアントであり、同じ規律に従います。
- Space・Project・Thread のデータはサーバーのスナップショットからのみ受け取る
- あらゆる変更はサーバーの確認を待ってから表示に反映される
そのため GUI と TUI を同時に開いても、両者の認識が食い違うことはありません。オフラインのサーバーは TUI からは一切変更できません。あとで送るために変更を溜めておくこともしません。
できること
ターミナルの中でする作業は一通りこなせます。新しいタブ、分割、サイズ変更、拡大、ペインやタブを閉じる、スクロールバック検索付きのコピーモード、そして完全なマウス対応です。
サイドバーでは Space・Project・Thread の作成と改名、Thread のピン留めと解除、そしてどの階層でも削除ができます — 中のセッションを終わらせうるため、毎回確認が入ります。ドラッグすると、Thread は同じ Project の中で、Project は同じ Space の中で並べ替えられます。Space 自体の順序は変わりません。下で説明する接続パネルからサーバーのアタッチと再試行もでき、注意を求めている次の Thread へ飛ぶこともできます。
ないもの
TUI はデスクトップアプリより範囲が狭く、アーカイブ、Thread の参照、ファイル・ノート・スニペット・Agents の各パネル、プラグイン、Live Overview、タブアイコンはありません。TUI で作る Project は、選んだフォルダーに結び付きません。名前は自分で付け、場所はホームディレクトリから始まります。TUI を使ってもこれらが失われることはなく、デスクトップが残したとおりに保たれますが、触れるにはデスクトップアプリが必要です。
端末を駆動するのは誰か
データは共有されますが、1 つの端末を駆動するのは同時に 1 クライアントだけです。既定はハンドオフ — 操作した時点でそのクライアントが端末を引き取ります — で、TUI はサーバーを tmux のような共有モードに切り替え、接続中のすべてのクライアントが同じグリッドを見るようにもできます。このモードはサーバーに属し、サーバーを再起動しても保たれるので、目の前のクライアントではなくそのサーバーについての決定です。共有モードでは、タブに最後に触れたクライアントがそのタブの大きさを決めます。ハンドオフ側については リモート を参照してください。
切り替えはタブバーの ⋮ メニューにあり、A · Shared (tmux-like) と B · Handoff (exclusive) のうち現在のものにチェックが付きます。下部のステータスバーを表示していれば、状態が表示されます。A SHARED、この TUI が端末を持っているときは B ACTIVE、別のデバイスが持っているときは B VIEW · example-host です。共有モードで、別のクライアントがサイズを決めているタブでは、代わりに A SHARED · VIEW 120×30 と、そのタブが保たれているサイズが表示されます。
別のデバイスが持っている端末には、どこで使われているかと Click or scroll to continue を示す案内が重なります。TUI で引き取れるのはクリックかスクロールだけで、キーボードでは決して引き取りません。操作を奪うためのキーと下の端末に宛てたキーを見分ける方法がないため、案内が出ている間に打ったキーはどこにも届きません。
終了しても何も終わりません
TUI を終了するのはサーバーからの離脱にすぎません。中のセッションはすべて動き続けます。GUI クライアントが切断したときとまったく同じです。
だからこそ、分かりやすい使い方が成立します。マシンへ SSH して thinkterm tui を実行し、作業して、切断する。あるいは GUI が要らないマシンでは最初から GUI を使わない。
離脱するには Ctrl-b d か Ctrl-b q、⋮ メニューの Detach、またはステータスバーの Detach ボタンを使います。
自分のサーバーの中では開きません
接続先のサーバー自身のペインで TUI を動かすと、そのサーバーのターミナルを、そのうちの一つの中に描くことになります。ThinkTerm はこれを拒みます。アタッチしていたすべてのサーバーから離れ、エラーとともに終了し、ターミナルは元のまま残ります。エラーは、別のターミナルアプリケーションから thinkterm tui を実行するか、別のドメインを選ぶよう案内します。
同じかどうかは、ドメインの名前ではなくサーバーの識別子で判断されます。ThinkTerm のペインはどれも自分を載せているサーバーを記録しており、同じ識別子を返す接続先は拒まれます。この記録を持たないほど古いペインも拒まれます。そこからは接続先が別のサーバーだと証明できないためです。
画面
サイドバーはツリーです。アタッチしている各サーバー、その Space、Space の中の Project、そしてその中の Thread が並びます。▾ と ▸ で階層を折りたためます。どの行にもメニューを開く ⋯ ボタンがあり、Space と Project の行には Project や Thread を追加する + もあります。ツリーの上には、今いる Project に Thread を追加する ⊕ New Thread と、+ で今いる Space に Project を追加する WORKSPACES の見出しがあります。⚙ Settings は一番下です。上端の ≡ でサイドバーを表示・非表示にします。
Thread の行は印で始まります。
| 印 | 意味 |
|---|---|
* | 何かが動いている |
! | 注意が必要、または未読にされている |
+ | 見ていない間に作業が終わった |
★ | ピン留めされている |
Thread を開くと、サーバー上の未読の印が消え、すべてのクライアントに反映されます。Ctrl-b o はツリーの順に、! か + の付いた次の Thread へ移り、最後まで行くと先頭に戻ります。覚えている Thread がないまま TUI が起動したときは、いちばん注意を求めている Thread を開きます。
タブバーには選んだ Thread のタブが並び、それぞれに閉じるための ✕、新しいタブの +、メインメニューの ⋮ があります。タブが収まらないときは、両端の < と > が隠れている数を示します。タブバーの上でホイールを回すとタブを移動します。
ペインナビバーは各ペインの上端の帯です。左側には、そのペインの位置に重ねられたペイン — 1 つの矩形を共有する複数の端末で、それぞれタブとして切り替えます — が並び、それぞれに ✕ があります。右側には 4 つのボタンがあります。⤢ 拡大(拡大中は ⤡)、◫ 右に分割、⊟ 下に分割、そして同じ位置に新しい端末を重ねる + です。4 つが収まらないほど狭いペインでは、分割ボタンから先に消え、拡大は残ります。
ステータスバーは下端にあり、既定ではオフです。現在のモードのキー、メッセージ、アクセス状態、注意を求めている Thread の数 ! N — クリックすると次へ移ります — と Detach を表示します。オフのときは、メッセージやモードの案内は重ねて表示され、端末から行を奪うことはありません。
キー
プレフィックス Ctrl-b に続くキー以外は、すべて端末へ送られます。Ctrl-b を押して離し、それからコマンドのキーを押します。Ctrl-b Ctrl-b はペインのプログラムに文字どおりの Ctrl-b を送ります。Ctrl-b ? でキーの一覧を表示し、Esc か ? で閉じます。
プレフィックスの後
| キー | 動作 |
|---|---|
? | ヘルプ |
d または q | 離脱 |
b または s | サイドバーの表示・非表示 |
g または w | ナビゲートモード |
C | 接続パネル |
, | 設定 |
c | 選んだ Thread に新しいタブ |
n / p | 次 / 前のタブ |
1 … 9 | 1 〜 9 番目のタブ |
↑ / ↓ | 前 / 次の Thread |
o | 注意を求めている次の Thread |
Tab | 次のペイン |
h j k l、← → | 左・下・上・右のペインにフォーカス |
v | 右に分割 |
- | 下に分割 |
x | 確認のうえペインを閉じる |
X | 確認のうえタブを閉じる |
z | ペインを拡大、または拡大を解除 |
r | リサイズモード |
[ | コピーモード |
プレフィックスの後にほかのキーを押しても、そう伝えるだけで何もしません。
ナビゲートモード
サイドバーを開き、キーボードをそこに留めるので、プレフィックスなしでツリーを移動できます。
| キー | 動作 |
|---|---|
j / k、↓ / ↑ | 次 / 前の Thread |
h / l、← / → | 左 / 右のペインにフォーカス |
n / p | 次 / 前のタブ |
? | ヘルプ |
Enter または Esc | ナビゲートモードを終える |
リサイズモード
| キー | 動作 |
|---|---|
h j k l または矢印 | フォーカス中のペインの端をその方向へ 1 セル動かす |
Enter または Esc | 終了 |
コピーモード
コピーモードでは、フォーカス中のペインにカーソルが置かれ、そこで動いているプログラムとは関係なくスクロールバックの中を移動します。
| キー | 動作 |
|---|---|
h j k l または矢印 | カーソルを動かす |
PgUp / PgDn | 10 行スクロール |
End | いちばん下へ戻る |
Space | 選択を始める。もう一度押すと終える |
y、Y または Enter | 選択をコピー |
/ | 前方へ検索 |
? | 後方へ検索 |
n / N | 次 / 前の一致 |
Esc | コピーモードを終える |
検索はスクロールバック全体が対象で、大文字と小文字を区別しません。前方検索は最初の一致へ、後方検索は最後の一致へ飛び、そこへカーソルを移します。一致がなければ No matches と表示されます。
メニュー、入力欄、確認
| 場面 | キー |
|---|---|
| メニュー | j / k または矢印で移動、Enter で選択、Esc で閉じる |
| 名前の入力欄 | そのまま入力、Backspace で消去、Enter で確定、Esc で取り消し |
| 確認 | Enter または y で確定、Esc または n で取り消し |
入力欄が空のままなら何もしません。
マウス
Application mouse がオンなら(既定でオン)、マウスでキーとほぼ同じことができます。
- Thread をクリックすると開き、タブなら表示し、ペインならフォーカスします。端末の上でクリックやホイール操作をすると、別のデバイスからその端末を引き取ることにもなります。
- ペインの中をドラッグするとテキストを選択します。上端や下端の近くでは、選択に合わせてペインがスクロールします。1 行の中のドラッグは 3 セル以上動かして初めて選択になるので、指が 1、2 セルずれたタップはクリックのままです。
- 何でも右クリックするとメニューが出ます。サイドバーの行の
⋯も同じメニューを開きます。 - 境界線をドラッグすると両側のペインの大きさが、サイドバーの右端ならサイドバーの幅が変わり、ペインのスクロールバーならスクロールバックの中を移動します。サイドバーの幅は保存されます。
- Thread を同じ Project の別の Thread の上へ、Project を同じ Space の別の Project の上へドラッグすると、その前に移ります。
ペインのプログラムがマウスを求めているとき — vim、htop、マウス対応の less など — クリックとドラッグはそのプログラムに渡ります。自分でテキストを選択するには Shift を押したまま操作します。Shift と右ボタン、および中ボタンは常にプログラムに渡ります。
ペインの上でのホイールは 3 通りに振る舞います。プログラムがマウスを求めていれば、ホイールはそのプログラムに渡ります。ペインが代替スクリーン — マウスを求めていない全画面プログラム — にあれば、1 ノッチごとに矢印キーになります。だから less や git log がタッチスクリーンでもスクロールできます。それ以外はスクロールバックをスクロールします。Shift を押しているとき、またはすでにさかのぼってスクロールしているときは、常にスクロールバックをスクロールします。1 ノッチは scroll_lines 行です。
右クリックメニュー
| 対象 | 項目 |
|---|---|
| サーバー | New Space、Retry connection、Disconnect |
| Space | New Project、Rename Space、Delete from server、End sessions and delete |
| Project | New Thread、Rename Project、End sessions and remove |
| Thread | Open、New Thread、Rename Thread、Pin または Unpin、End session and delete |
| タブ | Open、New Tab、Rename Tab、Close Tab |
| ペイン | Copy、Paste、Split Right、Split Down、Zoom、Close Pane |
タブバーの ⋮ | New Tab、Split Right、Split Down、Copy Mode、Paste、Connections、A · Shared (tmux-like)、B · Handoff (exclusive)、TUI Settings、Toggle Sidebar、Help、Detach |
Copy は、そのペインに完了した選択があるときだけ使えます。
作成と削除で起きること
New Space は名前を尋ね、ホームディレクトリにある Home という Project と main という Thread を持つ Space を作ります。New Project は名前を尋ね、ホームディレクトリに main Thread 付きの Project を作ります。New Thread は名前を尋ねます。どれも作ったものを開きます。
削除の前には必ず確認があり、ペインを終わらせる場合はその数がダイアログに示されます。
Delete from serverは Space をすべてのクライアントについてサーバーから取り除き、中のセッションは動かしたままにします。End sessions and deleteは Space を取り除き、その中のペインをすべて終わらせます。End sessions and removeは Project を取り除き、そのペインを終わらせます。End session and deleteは Thread を取り除き、そのペインを終わらせます。Close PaneとClose Tabは、サーバー上のそれらのペインをすべてのクライアントについて終わらせます。
サーバーの Disconnect は削除ではありません。TUI がそのサーバーを手放すだけで、セッションは動き続けます。
コピーとペースト
Copy on select がオンなら(既定でオン)、ドラッグを終えた時点でコピーされ、コピーモードでは y でコピーします。オフにすると、完了した選択は画面に残り、Ctrl-C はプログラムを中断する代わりにそれをコピーします。コピーした選択は消えるので、次の Ctrl-C は再びプログラムに届きます。
TUI はシステム自身のツールでクリップボードに書き込みます。
| システム | 使うもの |
|---|---|
| macOS | pbcopy と pbpaste |
| Linux | Wayland では wl-copy と wl-paste、次に xclip、次に xsel |
| Windows | Windows のクリップボード |
どれでも書き込めないとき — 典型的には、ディスプレイのない Linux マシンへ SSH しているとき — TUI はテキストを OSC 52 シーケンスとして、自分が動いているターミナルへ送ります。OSC 52 に対応したターミナルなら、目の前のマシンのクリップボードに入ります。うまくいくかどうかは ThinkTerm ではなく、そのターミナル次第です。
メニューの Paste も同じツールでクリップボードを読むので、SSH 越しではリモートマシンのクリップボードを読むか、失敗します。お使いのターミナル自身のペーストのショートカットは常に使えます。TUI は受け取ったものをフォーカス中のペインに渡します。
コピーとペーストは 1 回につき 8 MiB までです。
狭い画面とスマートフォン
TUI は、動いているターミナルの幅に合わせて形を変えます。
- 広い — サイドバーは指定した幅で端末の横に並びます。
- コンパクト —
narrow_widthより 24 列未満しか広くないときは、サイドバーは 18 列に固定されます。 - 狭い —
narrow_width列(既定 64)以下になると、ツリーは端末と画面を分け合わなくなります。開いている間は端末を覆い、Thread を選ぶと退きます。≡で呼び戻せます。狭い TUI は常に端末から始まり、そこでツリーを開閉しても保存されないので、1 つのtui.tomlを共有するスマートフォンとデスクトップが互いの選択を上書きすることはありません。
スマートフォンが報告する列数はまちまちなので、手で調整する価値があるのは narrow_width だけです。
Touch targets はボタンを指先向けの大きさにします。ボタンが広くなり、上端のバーが 2 行になります。Auto のままだと狭いレイアウトに従います。たいていはそれで正しいのですが、横向きにしたスマートフォンがデスクトップ並みの列数を報告すると外れます — そのための設定です。
スマートフォンでは、ペインナビバーが拡大・分割・新しい端末に指で届く唯一の場所です。ソフトキーボードにはまともな Ctrl-b がないからです。背の低いペインでもナビバーは残ります。
設定
Ctrl-b ,、サイドバー下端の ⚙ Settings、または ⋮ メニューの TUI Settings で設定画面が開きます。↑ ↓ か j k で行を移り、← →、h l、Enter か Space で値を変え、Esc で閉じます。行をクリックしても値が変わります。変更はすぐに反映され、保存されます。
画面には 10 行あります。ほかに 2 つ、ファイルにしかない設定があります。サイドバーの端をドラッグしても設定される sidebar_width と、narrow_width です。
tui.toml のキー | 画面上 | 既定 | 値 |
|---|---|---|---|
theme | Theme | monochrome-dark | 下の 10 個のテーマのいずれか |
sidebar_visible | Sidebar | true | true、false |
pane_nav_bar | Pane nav bar | true | true、false |
pane_borders | Pane borders | true | true、false |
pane_scrollbars | Pane scrollbars | false | true、false |
show_status_bar | Bottom status bar | false | true、false |
mouse | Application mouse | true | true、false |
copy_on_select | Copy on select | true | true、false |
touch_targets | Touch targets | 未設定(Auto) | 未設定、true、false |
scroll_lines | Scroll lines | 3 | 1 〜 20 |
sidebar_width | — | 26 | 18 〜 36 列 |
narrow_width | — | 64 | 20 〜 200 列 |
範囲外の値は範囲内に引き戻されます。枠には余裕が必要で、スクロールバーは 1 列を使うので、どちらも十分な大きさのペインにだけ描かれます。スクロールバーが既定でオフなのは、それが使う列をサーバーが知らないためです。
Application mouse をオフにすると、通常のクリック・ドラッグ・ホイールはマウスイベントとしてプログラムに届かなくなります。クリックとドラッグは常に選択になり、ホイールはスクロールするか、代替スクリーンでは矢印キーを送ります。
最小限の tui.toml:
theme = "tokyo-night"
narrow_width = 80
touch_targets = trueテーマ
theme | 画面上 |
|---|---|
monochrome-dark | Monochrome Dark |
monochrome-light | Monochrome Light |
terminal | Terminal Default |
catppuccin | Catppuccin |
tokyo-night | Tokyo Night |
dracula | Dracula |
nord | Nord |
gruvbox | Gruvbox |
solarized-dark | Solarized Dark |
solarized-light | Solarized Light |
テーマが色を付けるのは TUI 自身の枠組みで、端末ではありません。端末はサーバーから受け取った色のままです。ダーク系のテーマはお使いのターミナルがもともと持つ背景の上に描くので、サイドバーとペインの背景が食い違うことはありません。ライト系の 2 つは自分で背景を塗ります。暗いターミナルの上の暗い文字は読めないからです。Terminal Default は文字にもターミナル自身の色を使います。
NO_COLOR があっても、名前の付いたテーマが灰色になることはありません。色をなくしたいときは、2 つの Monochrome テーマのどちらかを選んでください。
接続パネル
Ctrl-b C、または ⋮ メニューの Connections で、TUI がアタッチできるすべてのサーバーが一覧になります。
- このマシン。
Localとして表示されます — 動いている ThinkTerm デスクトップアプリがあればそれ、なければローカルのセッションサーバーです - 設定ファイルにあるマルチプレクサドメイン
リモートホストのうち ThinkTerm Connect を使うホスト。そのラベルで表示されます
アタッチできないホストも一覧に載りますが、灰色で理由が添えられます。普通の SSH ホストには Enable ThinkTerm Connect in Remote Hosts、Mosh ホストにはそのセッションが mux サーバーではない旨が表示されます。
| 印 | 状態 |
|---|---|
● | アタッチ済み |
… | 接続中 |
! | 失敗 |
○ | 未アタッチ |
- | アタッチできない |
| キー | 動作 |
|---|---|
j / k、↓ / ↑ | 移動 |
Enter または r | アタッチ、または再試行 |
d | 切断 — サーバーはセッションを保持します |
q | 離脱して TUI を終了 |
Esc | パネルを閉じる |
行をクリックしてもアタッチします。Local を再試行するとデスクトップアプリを探し直すので、アプリが終了した後ならセッションサーバーにつながります。
オプション
| オプション | 効果 |
|---|---|
[DOMAIN ...] | アタッチするサーバーをドメイン名で指定します。指定しなければこのマシンだけにアタッチし、ほかは後から接続パネルでアタッチできます |
--prefer-mux | 動作中の ThinkTerm GUI ではなくバックグラウンドの mux サーバーへ接続します。既定は GUI を優先 |
--class <NAME> | 動作中の ThinkTerm GUI のソケットを見つけるためのウィンドウクラス |
--tui-config <PATH> | 別の TUI 設定ファイルを使います。TUI の設定は GUI とは独立しています |
設定ファイルの場所
既定のファイルは ~/.config/thinkterm/tui.toml(TOML、$XDG_CONFIG_HOME に従います)で、フラグを使わずに別のファイルを指すなら $THINKTERM_TUI_CONFIG があります。TUI の中から編集でき、既定値と異なる項目だけが書き戻されるので、既定は今日の値に固定されることなく既定のままです。
これとは別に、~/.local/state/thinkterm/tui.json($XDG_STATE_HOME に従います)が最後にいたドメイン・Thread・タブを覚えています。
関連
- リモート — TUI が接続する先のサーバー
- Space、Project、Thread — デスクトップアプリがそれらに加えるものも含めて
- キーボードとコマンド — デスクトップアプリのショートカット
- コマンドライン —
thinktermバイナリのその他の部分
