極稀に、今入力しているコマンドを、別の端末の上で既に動いている zsh で実際に入力したように実行したいということがあったので作ってみました。
デモ動画はこちらから (http://www.youtube.com/watch?v=AfPgznZvBr8h):
ソースコードはこちらから (https://github.com/hchbaw/zrv.zsh.git)
使い方です。
ファイルを autoload
して zrv
を呼び出してサーバーをスタートします。
% tmux
;# サーバー側はtmux上で動かすのが必須です
% git clone https://github.com/hchbaw/zrv.zsh.git
% fpath+="$(echo ${:-./zrv.zsh}(:A))"
% autoload -Uz zrv
% zrv
クライアント側では以下の zrv-client
のような関数を使って通信します。
zrv-client () {
local -i REPLY;
setopt localoptions errreturn
zmodload zsh/net/socket
zsocket /tmp/zrv-${UID}/default
print -u $REPLY "$1"
exec {REPLY}>&- # このファイルディスクリプタ閉じるのを忘れないで!
}
関数を定義したら例えば以下のような感じに使うことができます。
% zrv-client "echo hi"
⇒ "echo hi" をサーバーに送信、サーバー側で実行、表示します。
% zrv-client "sleep 5
echo hihi"
⇒ サーバーに復数のコマンドを送信、サーバー側では一行すつ実行、表示します。
以下雑感です。
プロトコルを考えるのはつらかったので、クライアントから切断された後、送ったコマンドが実行される、ということにしました。
accept-line
の後に何かキーを押さないと実行されなかったのでこんな感じになっていて、サーバー側は tmux
上じゃないと動作しません。
recursive-edit
内でないと $BUFFER
を更新しても実際のコマンドラインに反映されなかったので、やっぱりこんな感じになっています。
といった、強引にねじふせたおもちゃです。正直なんだかなあという感じになっちゃったサーバーですけれども少しは遊べます。
自分では主に、今いるウインドウの横のウインドウで、サーバーが表示されているペインを表示して、今いるウインドウのコマンドラインの内容を $PWD
への cd
も伴って送信する、などしています。
なんだろ、このコマンドを実行しちゃうと出力でウインドウ一ぱいになっちゃいそう、とか、コマンドの結果が返ってくるのに微妙に時間経かりそうだ、という時にサーバー側で実行して、その次のコマンドを入力し始める、みたいな使い方です。
ごめんなさい長くなっちゃった。おつかれ様でした!