tmux で複数のセッションにリンクしたウィンドウはどうやって作るのか悩む修行

tmux のサーバ、クライアント、セッション、ウィンドウなどがだいぶわかってきた。tmux(1) の日本語訳 (http://bytebucket.org/ns9tks/tmux-ja/wiki/tmux-ja.html) のおかげ。感謝 (http://d.hatena.ne.jp/ns9tks/20091016/1255691027)。
とりあえず、(サーバに接続していても) どのセッションにもアタッチしていないクライアントは作れなさげ。作れたとしたら、ウィンドウも持たないのでステータスラインだけになるのだろう、と思っていた。それでもいい気はするけど。サーバに接続してさえいれば list-sessions とかできるわけだし。

ところで tmux で複数のセッションにリンクしたウィンドウはどうやって作るのだろう。tmux(1) の unlink-window コマンドの説明を読むと次のように書いてある。

-k が与えられなければ、ウィンドウは複数のセッションに
リンクしている場合のみリンクを解除できます。
ウィンドウはどのセッションにも
リンクしていない状態にはできません。

これを読むと一つのウィンドウが複数のセッションにリンクできるように読める。link-window コマンドでできるのかなあ、といろいろ試しているがうまくいってない。そもそも link-window コマンドが理解できてない。このコマンド、引数で渡すのが「セッションとウィンドウ」じゃなくて「ウィンドウとウィンドウ」なんだよなあ。

それはそれとして、そのうちペインに一切触れない「tmux のちょっとした使い方」のエントリでも書いてみようかな。tmux の解説しているページは、たいていペインを取り上げているみたいな気がするから。それだけじゃないよね、ということで。そもそも、ペインフルよりペインレスがいい、と思うのは私だけ? 世の中 M な人が多いのかなあ。

追記 2009-11-17

複数のセッションにリンクしたウィンドウの作り方がわかった。やはり link-window が正解。
たとえば、スクリーン (仮想端末アプリとか SSH クライアントソフトとか) を二つ用意し、一方をスクリーン 0、他方をスクリーン 1 とする。そして両方のスクリーンで tmux new-session を起動する。

$ tmux new-session

そうすると両スクリーンでそれぞれ tmux のクライアントが起動し、新しいセッションが作られる (セッション名はそれぞれ 0 と 1) 。それぞれのセッションはそれぞれに一つウィンドウを持っている (ウィンドウ名は 0:0 と 1:0)。ウィンドウのリンクがわかりやすいよう、スクリーン 1 側のウィンドウ (1:0) でコマンドを実行しておく。なんでもいいけど、たとえばこんな風に。

$ while echo -n ^_^; do sleep 1; done

で、ウィンドウ 1:0 を、スクリーン 0 側のセッションにくっつけるには、スクリーン 0 側で

link-window -s 1:0

とする。そうするとスクリーン 0 に新たなウィンドウ (0:1) が作られ、

^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^

な表示が出てくる。

link-window するとき、カレントセッションにくっつけたいソースウィンドウを -s で指定し、ターゲットウィンドウ -t は指定しないのがミソ。
tmux(1) の「コマンド」節に、ウィンドウ名の指定に関するところに次のように書かれている。

空のウィンドウ名は (new-window や link-window コマンドのように) 
適切なら次の使われていない番号になり、
そうでなければセッションのカレントウィンドウが選ばれます。

今まで私が失敗していたのは、ターゲットウィンドウとしてすでに存在するウィンドウを指定していたから。今あるウィンドウと差し替えていいなら -k もつけて、現在のウィンドウで動いているプロセスには死んでもらう。

link-window -k -s 1:0 -t 0:0
ウィンドウのインスタンスと名前

ところで、こうやって複数のセッションにリンクしたウィンドウを作ると、そのウィンドウは複数の名前を持つことになる。先の例で言えば、^_^ なウィンドウはインスタンスとしては一つだけれども、0:1 と 1:0 と二つの名前を持つことになる。ウィンドウの命名ルールが session.window という形式になっている以上あたりまえなのだが。この「プロセスを管理しているインスタンス」という概念と「セッションに属した (リンクした) 表示画面」という概念は、異なるものながらどちらもウィンドウという名前になっている。前者はバッファとか呼んでもいいような気がするけれど、tmux 用語的にはバッファはコピーペースト用の記憶領域として使われている。tmux の実装の中では別の識別子で区別されているんだろうなあ、と思ってみたりする。