
Superlogical の Rex の beta 版を試してみる
はじめに
こんにちは、クラスメソッド製造ビジネステクノロジー部の嶋田です。
HashiCorp の創業者で Ghostty の作者でもある Mitchell Hashimoto が立ち上げた Superlogical から、ターミナルアプリの Rex が公開テストに入りました[1]。
参加するには公式サイトの waitlist に登録し、招待を受ける必要があります。
私のところにも招待が届いたので、macOS 版を入れて触ってみました。
この記事では、Rex の構成を整理したうえで、次のことを試した結果を書きます。
- アプリを閉じてもセッションが残るか
- 別の Mac で動く Rex サーバーにつなげるか
- iOS の alpha 版から Rex のセッションを開けるか
- Claude Code に Rex を操作させられるか、Claude Code の状態を外から読めるか
Rex とは
Rex は「いま使っているターミナルをそのまま置き換えられる」ことを目指したターミナルアプリです[1:1]。
tmux のように別のターミナルの中で動くマルチプレクサではなく、Rex 自体がターミナルアプリで、そこに永続セッション、リモート接続、プログラムの状態表示が加わっています。
ターミナルの描画とエミュレーションには、Ghostty から切り出されたライブラリ libghostty を使っています。
公式の発表では、次の点が書かれています[1:2]。
- Rex は無料で、今後も無料のまま。アカウントは不要
- サーバーはどのプラットフォームでも自分でホストできる
- macOS アプリは自分用の Rex サーバーを内部で立ち上げる。ほかの Mac の Rex サーバーにもつなげる
- 発表時点では、テストは当面 macOS アプリに限る。iOS、Linux、Windows のクライアントは準備中
その後、iOS の alpha 版もテスト参加者向けに配布されています(後述)。

初回起動の画面。自動で作られたセッション(shy-orchard)のシェルが開く
アプリとサーバーの関係
Rex のアプリの中には、サーバー兼 CLI の rex コマンドが同梱されています。
アプリはこのサーバーに接続するクライアントの 1 つで、CLI も同じサーバーにつなぐ別のクライアントです。
CLI はアプリの中にあるので、パスを通しておくと扱いやすくなります。
Rex のターミナルの中では、最初から rex にパスが通っています。
alias rex="/Applications/Rex Beta.app/Contents/Helpers/Rex Server.rex/Contents/MacOS/rex"
rex server status で、アプリが立てたサーバーの状態を確認できます。
$ rex server status
endpoint: unix:///Users/<user>/Library/Application%20Support/rex/server.sock
version: 0.0.1793299046-g2307b7
api: revision 7 (supports 0 to 7)
sessions: 1
tailscale: disabled
Rex の用語は tmux と少し違います。
tmux に寄せて書くと次のとおりです。
| Rex | tmux での近い概念 | CLI のフラグ |
|---|---|---|
| server | server | -S |
| session | session | -s |
| window | window(アプリではタブ) | -w |
| block | pane | -b |
| client | client(接続しているアプリや CLI) | -C |
CLI のコマンドは、どれを操作するかをこのフラグで指定します。
用語の定義と、フラグを省いたときに環境変数から操作対象が決まる仕組みは、公式ドキュメントの Command targets にまとまっています。
アプリを閉じてもセッションは残るか
1 秒ごとにカウンタを出すセッションを CLI から作り、アプリを終了してから中身を読みました。
rex new counter -- bash -c 'i=0; while true; do echo "tick $i $(date +%T)"; i=$((i+1)); sleep 1; done'
osascript -e 'quit app "Rex Beta"'
rex capture -s counter --trim | tail -3
アプリを終了しても rex server run のプロセスは残り、カウンタは止まらずに進んでいました。
サーバーの実体は ~/Library/Application Support/com.superlogical.rex/RexServer/ に置かれて動いています。
アプリを開き直すと、同じサーバーにつながり直します。

アプリを開き直しても、counter セッションのカウンタは止まらずに進んでいる
CLI でできること
CLI は、ターミナルを外から操作するためのコマンドを一通り持っています。
よく使いそうなものを挙げます。
rex run: 新しいブロックでコマンドを実行する。--waitを付けると、終わるまで待って終了コードを返すrex send/rex send-key: ブロックに文字やキーを送るrex capture: ブロックの画面と scrollback を取り出す。text、HTML、エスケープシーケンス付きの 3 形式rex events --json: サーバーのイベントを 1 行 1 JSON で流し続けるrex api: サーバーの API を一覧し、呼び出す
run --wait の終了コードは、子プロセスのものがそのまま返りました。
$ rex run --wait -- sh -c 'exit 3'; echo "exit=$?"
Error: exit status 3
exit=3
設定は ~/.config/rex/init.lua に Lua で書きます。
キーの割り当てを rex.bind で変えたり、rex.action で自分のアクションを定義したりできます。
私は以前 tmux を prefix C-q で使っていて、その割り当てを init.lua に移しました。
tmux の「prefix を押してからキーを押す」操作は、Rex では ctrl+q>v のように > でつないだキーの並び(key sequence)として書きます[2]。
rex.bind("ctrl+q>v", "pane.split", { direction = "right" })
rex.bind("ctrl+q>h", "pane.focus", { direction = "left" })
移すときに気付いた点が 4 つあります。
|や&のように shift を押して入力する記号は、shift を押す前のキーで書きます。US 配列なら|はshift+\、&はshift+7です。&とそのまま書くと、rex config checkがunknown key "&"を報告します。- tmux の
bind -r(prefix を押し直さずに続けて入力できる割り当て)にあたる仕組みは、key sequence にはありません。そこで、ctrl+q>shift+hなどで 1 回リサイズすると同時にリサイズ用の key mode に入り、モードの間はhjklで続けて大きさを変えられるようにしました。EscapeかEnterでモードを抜けます。tmux と違い、一定時間で自動的には抜けません。 - tmux の popup は、浮いたレイヤーを作る
rex.session.new_layerをカスタムアクション(rex.action)から呼んで再現しました。開く場所は、フォーカス中のペインで動いているプロセスの作業ディレクトリ(processメソッドのforeground.cwd)にし、取れなければ$HOMEにしています。シェルが作業ディレクトリを報告していないと、pwdメソッドは空を返すので使っていません。 - tmux のコピーモードにあたる機能(キーボードでスクロールバックを移動して選択する機能)は、見当たりませんでした。代わりに、
ctrl+q>[でフォーカス中のペインのスクロールバックをrex captureで取り出し、そのペインと同じ位置に重ねたレイヤーの nvim で開くアクションを作りました。ペインの位置はrex.session.viewが返すレイアウトから求めています。nvim のv/V/ctrl+vで選択してyを押すと、クリップボードにコピーして閉じます。貼り付けは普段どおりcmd+vです。
書いたら rex config check で確かめ、rex config reload で読み込み直します。
rex keymap で、読み込まれた割り当てと、それを書いた行を一覧できます。
$ rex config check
path: /Users/<user>/.config/rex/init.lua
exists: yes
bindings: 46
modes: 1
actions: 5
init.lua の全体
local terminal = "com.superlogical.terminal"
local shell = "com.superlogical.terminal.shell"
rex.bind("ctrl+q>ctrl+q", "pane.send_key", { key = "ctrl+q" })
rex.bind("ctrl+q>c", "client.tab.new")
rex.bind("ctrl+q>n", "client.tab.next")
rex.bind("ctrl+q>p", "client.tab.previous")
rex.bind("ctrl+q>,", "client.tab.rename")
rex.bind("ctrl+q>shift+7", "client.tab.close")
for i = 1, 9 do
rex.bind("ctrl+q>" .. i, "client.tab.goto", { index = i })
end
rex.bind("ctrl+q>s", "session.switch")
rex.bind("ctrl+q>shift+4", "session.rename")
rex.bind("ctrl+q>shift+9", "session.previous")
rex.bind("ctrl+q>shift+0", "session.next")
rex.bind("ctrl+q>shift+\\", "pane.split", { direction = "right" })
rex.bind("ctrl+q>v", "pane.split", { direction = "right" })
rex.bind("ctrl+q>-", "pane.split", { direction = "down" })
rex.bind("ctrl+q>h", "pane.focus", { direction = "left" })
rex.bind("ctrl+q>j", "pane.focus", { direction = "down" })
rex.bind("ctrl+q>k", "pane.focus", { direction = "up" })
rex.bind("ctrl+q>l", "pane.focus", { direction = "right" })
rex.bind("ctrl+q>z", "pane.zoom")
rex.bind("ctrl+q>x", "pane.close")
rex.mode("resize", { exclusive = true })
rex.action{
name = "resize_repeat",
title = "Resize Pane and Keep Resizing",
args = { direction = "string" },
run = function(ctx, args)
rex.client.queue("pane.resize", { direction = args.direction })
rex.client.queue("client.mode.enter", { name = "resize" })
end,
}
local resize_keys = { h = "left", j = "down", k = "up", l = "right" }
for key, direction in pairs(resize_keys) do
rex.bind("ctrl+q>shift+" .. key, "resize_repeat", { direction = direction })
rex.bind("resize/" .. key, "pane.resize", { direction = direction })
rex.bind("resize/shift+" .. key, "pane.resize", { direction = direction })
end
rex.bind("resize/=", "pane.balance")
rex.bind("resize/enter", "client.mode.exit")
local function current_dir(ctx)
local p = rex.block.call(terminal, "process", { block_id = ctx.block_id })
if p and p.foreground and p.foreground.cwd then
return p.foreground.cwd
end
return os.getenv("HOME")
end
local function open_popup(ctx, command, bounds)
local options = { cwd = current_dir(ctx) }
if command then
options.command = command
end
local _, err = rex.session.new_layer{
bounds = bounds or { 0.15, 0.15, 0.7, 0.7 },
layout = rex.layout.block{ flavor = shell, options = options },
focus = true,
}
if err ~= nil then error(err, 0) end
end
local function find_rect(node, block_id)
if node == nil then return nil end
if node.block_id == block_id then return node.rect end
if node.split then
return find_rect(node.split.before, block_id) or find_rect(node.split.after, block_id)
end
return nil
end
local function pane_bounds(ctx)
local res = rex.session.view{}
local view = res and (res.view or res)
for _, w in ipairs(view and view.windows or {}) do
for _, layer in ipairs(w.layers or {}) do
if layer.kind == "tiled" then
local rect = find_rect(layer.layout, ctx.block_id)
if rect then return rect end
end
end
end
return nil
end
rex.action{
name = "popup_shell",
title = "Open Popup Shell",
run = function(ctx) open_popup(ctx) end,
}
rex.action{
name = "popup_lazygit",
title = "Open lazygit in Popup",
run = function(ctx) open_popup(ctx, { "lazygit" }) end,
}
rex.action{
name = "edit_config",
title = "Open Config in nvim",
run = function(ctx)
local path = os.getenv("REX_CONFIG") or (os.getenv("HOME") .. "/.config/rex/init.lua")
open_popup(ctx, { "nvim", path })
end,
}
rex.action{
name = "copy_mode",
title = "Copy Mode (Scrollback in nvim)",
run = function(ctx)
local script = [[
f=$(mktemp -t rex-scrollback)
rex capture -s "$1" -b "$2" --trim --unwrap > "$f"
nvim -R + -c "luafile $HOME/.config/rex/copy-mode.lua" "$f"
rm -f "$f"
]]
open_popup(ctx, { "sh", "-c", script, "sh", ctx.session_id, ctx.block_id }, pane_bounds(ctx))
end,
}
rex.bind("ctrl+q>space", "popup_shell")
rex.bind("ctrl+q>g", "popup_lazygit")
rex.bind("ctrl+q>e", "edit_config")
rex.bind("ctrl+q>[", "copy_mode")
コピーモードの nvim では、次のファイルだけを追加で読み込んでいます。
nvim の標準のクリップボード連携は pbcopy が書き終わるのを待たないので、ヤンクの直後に閉じると、長い選択ではコピーされないことがありました。
そこで、pbcopy を書き終わるまで待ってから閉じるようにしています。
copy-mode.lua
vim.api.nvim_create_autocmd("TextYankPost", {
callback = function()
local ev = vim.v.event
if ev.operator ~= "y" then
return
end
vim.fn.system({ "pbcopy" }, table.concat(ev.regcontents, "\n"))
vim.schedule(function()
vim.cmd("qa!")
end)
end,
})
私が普段使っている herdr では、ここまで自由にキーの割り当てを変えたり、コピーモードを再現したりはできませんでした。
Rex では tmux の割り当てを近い形で再現でき、コピーモードは nvim の操作で選べる分、tmux より使いやすくなりました。
テーマとサイドバー
テーマ
Rex のテーマは、アプリの UI の色とターミナルの色をまとめて決めます。
組み込みのテーマは 41 個(ダーク 27、ライト 14)で、ダーク用とライト用を別々に選んでおき、Switch Appearance Mode で切り替えられます。
組み込みにないテーマは、コマンドパレットの Import Theme File で Ghostty か iTerm2 の配色ファイルを取り込めます。
私は nvim と同じ Tokyo Night にそろえたかったので、tokyonight.nvim に同梱されている Ghostty 用のファイル(extras/ghostty/tokyonight_night)を取り込みました[3]。
取り込んだテーマはアプリの設定(~/Library/Preferences/com.superlogical.rex.plist)に保存され、init.lua では設定できません。
ほかの Mac でも使うなら、同じファイルをもう一度取り込みます。
サイドバー
タブの並べ方は、設定の Interface > Tabs > Tab Style で、Above(上に並ぶ通常のタブ)、Left、Right の 3 つから選べます。
Left か Right にすると、タブがウィンドウの横に縦に並び、サイドバーになります。
名前の長いタブが多いときや、縦長の画面で使うときは、サイドバーにしたほうが見やすくなります。

Tab Style を Left にした画面。サイドバーに接続先とセッションが並ぶ
プログラムの状態(後述の OSC 7501)もアプリに出ます。
ドキュメントによると、完了したセッションや許可待ちのセッションにはセッションの選択画面で印が付き、フォーカスしていないタブの見出しには作業中のスピナーや許可待ちの記号が出ます[4]。
複数のエージェントの状態をまとめて見る画面(unified priority inbox view)は、今後の予定として挙げられています。
別の Mac の Rex サーバーにつなぐ
次に、手元の Mac mini で Rex サーバーを動かし、MacBook からつなぎました。
Mac mini にはアプリを入れず、手元のアプリから取り出したサーバーのバンドル(/Applications/Rex Beta.app/Contents/Helpers/Rex Server.rex、84 MB)だけをコピーして起動しています。
内蔵の Tailscale で公開する
Rex のサーバーは、Tailscale のノードとして tailnet に参加する機能を内蔵しています。
Mac mini 側で次のコマンドを実行すると、サインイン用の URL が表示されます。
rex server tailscale on --hostname rex-mini
rex server status
tailscale: needs login
authenticate: https://login.tailscale.com/a/xxxxxxxxxxxx
ブラウザでサインインを承認すると、Rex サーバーが rex-mini という独立したデバイスとして tailnet に入ります。
ホストの Tailscale とは別のデバイスとして見えるので、管理画面には Mac mini 本体と rex-mini が並びます。
ただし、私の tailnet では、承認の直後に Rex が Tailscale を自分で止めました。
tailscale: disabled
error: HTTPS certificates are off for this tailnet. Turn them on (it's free) under DNS → HTTPS Certificates at https://login.tailscale.com/admin/dns, then turn Tailscale on again.
内蔵の Tailscale は、tailnet の HTTPS 証明書の機能を前提にしています。
管理画面の DNS の設定で HTTPS Certificates を有効にし、rex server tailscale on を実行し直すと、https://rex-mini.<tailnet>.ts.net で待ち受けるようになりました。
有効にした直後は同じエラーが出て、数十秒後に再実行すると通りました。
MacBook からは、-S に URL を渡すとつながります。
Tailscale のログイン ID で本人と判定され、Mac mini のサーバーを動かしているユーザーとして操作できました。
$ rex -S https://rex-mini.<tailnet>.ts.net whoami
you: <tailscale-login> over tailscale via tailscale from <macbook>, acting as <user>
接続先を host として登録する
毎回 URL を書かずに済むように、接続先を host として登録できます。
登録した host のラベルは、-S にそのまま渡せます。
rex hosts add mini https://rex-mini.<tailnet>.ts.net
rex hosts check
rex -S mini ls
1 つの host に接続先を複数登録でき、前から順に試します。
この host の一覧は、CLI が使うものです。
アプリの設定の「Remote Hosts」には別に登録する必要があり、CLI で登録した host はアプリには出てきませんでした。
アプリからつなぐ場合は、「Add Remote Host…」で https://rex-mini.<tailnet>.ts.net を追加します。

Remote Hosts に追加した Mac mini。名前とアイコンを設定できる
接続先ごとにアイコンを選べるので、サイドバーでどのマシンのセッションかを見分けやすいのもよい点です。
リモートで動かした処理はどうなるか
Mac mini のサーバーで 1 秒ごとのカウンタを回し、MacBook から時間をおいて読みました。
処理は Mac mini のサーバーで動いているので、MacBook 側が接続していない間もカウンタは進み続けていました。
$ rex -S mini capture -s remote-counter --trim | tail -1
tick 810 mac-mini 09:45:59
CLI からの 1 回の呼び出し(rex -S mini ls)にかかった時間は、5 回測って 0.07〜0.09 秒でした。

アプリから Mac mini のセッションを開いた画面
アプリから Mac mini のセッションに入力してみると、遅延はほとんどなく、手元のセッションと同じ感覚で使えました。
ただし、Mac mini を有線でつないでいるので、その影響も大きいかもしれません。
iPhone から Rex のセッションを開く
macOS の beta 版とは別に、iOS の alpha 版がテスト参加者向けに TestFlight で配布されています。
私が入れたのは Rex Dev 0.1.0 (1577) です。
iPhone のアプリは、tailnet 経由で接続できるようにした Rex サーバーにつなぎます。
MacBook 側でも内蔵の Tailscale を有効にすると、Mac mini のときと同じように、Rex サーバーが <macbook>-rex という独立したデバイスとして tailnet に入ります。
私は MacBook と Mac mini の両方のサーバーを iPhone のアプリに追加し、それぞれのセッションの一覧からシェルを開いて操作できました。
iOS アプリはまだ alpha 版ですが、操作感はとてもよかったです。
ペインの切り替えは横スワイプで直感的にでき、Mac 側のペインの配置も表示されるので、どのペインを操作しているのかが分かりやすいです。
入力中の遅延もほとんど感じませんでした。
Mac 版の Rex アプリにあるコマンドパレットを iOS アプリでもそのまま使え、とても便利でした。

iPhone からシェルを操作している画面。右上の図で、いまどのペインを開いているかが分かる
MacBook の CLI から rex client ls を見ると、iPhone のアプリは Mac のアプリや CLI と並ぶクライアントの 1 つとして見えます。
Tailscale のログイン ID で認証されていて、platform は ios です。
$ rex client ls
LABEL CLIENT KIND PRINCIPAL
<mac> Rex Beta 0.1.0 (1642) app uid 501 over unix
iPhone Rex Dev 0.1.0 (1577) app <tailscale-login> over tailscale via tailscale from <iphone>
iOS 版のアプリが持つ操作は、rex -C iPhone actions で一覧できます。
セッションとタブの切り替え、ペインの上下左右への分割、ソフトウェアキーボードの表示と非表示、リモートの host の追加などがあり、Mac 版と同じ操作の多くが iPhone からも使えます。
Claude Code から Rex を操作する
rex skill setup で入るもの
Rex には、コーディングエージェントに Rex の使い方を教える rex skill コマンドがあります。
対応しているのは Claude Code、Codex、OpenCode、pi の 4 つです。
$ rex skill status
Claude Code (found)
skill missing ~/.claude/skills/rex
hook missing ~/.claude/settings.json
Codex (found)
skill missing ~/.agents/skills/rex
hook missing ~/.codex/hooks.json
...
今回は、検証用のリポジトリだけに入れました。
--project を付けると、アカウント全体ではなくカレントのリポジトリに入ります。
rex skill setup --project --agent claude
入るのは skill と hook の 2 つでした。
--project で入れたので、上の rex skill status が示す ~/.claude/ ではなく、リポジトリの .claude/skills/rex と .claude/settings.local.json に入っています。
skill の本文は、「rex __internal skill を実行して、表示された案内に従え」という数行だけです。
案内の本文は CLI が出すので、Rex を更新すると、エージェントに渡る案内も一緒に新しくなります。
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "/bin/sh -c 'rex __internal session-start --agent claude --feature-session-naming=false 2>/dev/null || true'",
"timeout": 5
}
]
}
]
}
}
hook は SessionStart だけで、セッションの開始時に、どの Rex セッションとブロックで動いているかを Claude Code に伝えます。
Rex のターミナルには REX_SESSION と REX_BLOCK の環境変数が入っていて、案内は「ここで」と言われたらこの 2 つを使うように指示しています。
分割したペインでスクリプトを実行させる
Rex のブロックで Claude Code を起動し、外から rex send で次の依頼を送りました。
hello.sh を作って(1 秒おきに 5 回 hello を出して終わる)、Rex でいまのペインの右に分割したペインで実行し、終了コードと出力を確認して教えて
Claude Code は、まず skill の案内を読み、次のコマンドを組み立てて実行しました。
rex split -s "$REX_SESSION" -b "$REX_BLOCK" --split=right -c "$PWD" --keep-open --focus=false --label hello --json --wait -- ./hello.sh
rex capture -s "$REX_SESSION" -b $b --trim --unwrap
rex block call -s "$REX_SESSION" -b $b process
$b は、rex split --json の出力から取った新しいブロックの ID です。
--keep-open で実行後も出力を残し、--focus=false でフォーカスを動かさず、--wait で終了コードを受け取っています。
そのあと capture で出力を読み、process で終了状態を確かめてから報告しました。
依頼から報告までは 40 秒ほどでした。

Claude Code が右に分割したペインで hello.sh を実行し、終了コードと出力を報告した
Claude Code の状態を外から読む
Rex には、ターミナルの中のプログラムが自分の状態を報告する仕組みがあります。
プログラムが OSC 7501 というエスケープシーケンスを出すと、Rex はそれを状態として記録し、API とイベントで外に出します。
状態は idle、working、done、blocked、error の 5 つで、blocked には何を待っているか(permission、question、auth)が付きます。
Claude Code(2.1.312)は、この状態を自分で報告していました。
Claude Code は 2.1.295 で OSC 7501 に対応しています[6]。
Rex が入れた hook は SessionStart だけで、状態の報告には関わっていません。
状態は rex block call で読めます。
rex block call -b <block> program_status
前述の依頼を処理している間、5 秒ごとに読むと次のように変わりました。
msg には、Claude Code がいま何をしているかの 1 行が入ります。
{"state":"idle","app":"claude-code"}
{"state":"working","msg":null}
{"state":"working","msg":"Creating hello.sh and running it in a right split pane"}
...
{"state":"done"}
許可を求めるモード(--permission-mode default)で起動した Claude Code にファイルの作成を頼むと、許可待ちの間は blocked になりました。
msg には、何の許可を待っているかが入っています。
{"state":"blocked","kind":"permission","msg":"approve Write: /path/to/rex-agent-demo/blocked-test.txt"}
この状態で rex send-key -b <block> enter を送ると、許可ダイアログの 1 番目(Yes)が選ばれ、ファイルが作られて done に戻りました。
同じ情報は rex events --json にも流れます。
program_status_changed のほかに、Claude Code が付けたタイトル(title_changed)も届くので、許可待ちになったら通知を出す、といった仕組みを外に作れます。
{"type":"block_event","payload":{"name":"program_status_changed","payload":{"record":{"state":"working","app":"claude-code",...}}}}
{"type":"block_event","payload":{"name":"title_changed","payload":{"title":"Rex 分割ペインでの hello.sh 実行",...}}}

Claude Code が作業中の画面。Claude Code が付けたタイトルが、そのままサイドバーのタブ名になる
Claude Code が許可待ち(blocked)になると、サイドバーのタブのアイコンに青い点が付きました。

許可待ちの Claude Code のタブ。アイコンに青い点が付く
herdr のデスクトップアプリ
私は普段、エージェント向けのターミナルマルチプレクサ herdr を使っています。
その herdr からも、デスクトップアプリと、その土台になる herdr-core が公開されました。
Rex と同じく、アプリの外でターミナルを動かし続ける作りのようなので、こちらも試してみたいと思っています。
おわりに
Rex の beta 版で、アプリを閉じてもセッションが残ること、Claude Code に Rex を操作させること、その状態を外から読めることを確かめました。
特に Tailscale を内蔵していて、iOS アプリを含む複数のデバイスとの連携が Rex のエコシステムの中で完結するのが印象的でした。
CLI と API が最初からそろっていて、エージェントから使うための skill まで用意されている点もよいと感じました。
また、init.lua で tmux に近いキーの割り当てを再現でき、コピーモードは tmux より使いやすくなった点もよかったです。
私はこれまで Alacritty の上で herdr を使っていましたが、しばらくは Rex を使ってみるつもりです。
興味がある方は、公式の発表ページから waitlist に登録してみてください。
参考資料
- Superlogical
- Public testing is beginning(Superlogical)
- Rex Docs: CLI(Command targets)
- herdr のデスクトップアプリの発表(X)
https://www.superlogical.com/updates/public-testing-beginning ↩︎ ↩︎ ↩︎
https://www.superlogical.com/rex/docs/customize/key-sequences ↩︎
https://github.com/folke/tokyonight.nvim/tree/main/extras/ghostty ↩︎
https://www.superlogical.com/rex/docs/build/program-status ↩︎
https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md の 2.1.295 に「Added Program Status Protocol (OSC 7501) support」とある ↩︎








