tmux + irssi + canything で Anything 風チャンネル切り替えする

irssi 環境を prgmr.com からさくら VPS に移行したついでに irssi のプラグインを見直していて、そのときに nicklist.pl というのをいれたわけですが、これがなかなか hackish な実装になっており(笑)、named pipe なファイルつくってそれを cat しておくと irssi がそこに nicklist を書き込むというような感じになってて、基本的に GNU screen などの縦分割と一緒に使うように設計されている。

で、僕はリモートサーバー上の GNU screen 上で irssi を動かしているので、それをつかうために縦分割をためしてみたわけですが、window 分割したときにでる caption を GNU screen では消すことができず、ローカルで使っている screen の hardstatus の上に、リモート screen の caption が出るという大変いやなかんじになってしまう。

設定見てもどうにも消せないっぽいので、screen 競合として名高い tmux を見てみると普通に消せたのでとりあえずリモートだけ tmux に移行をしてみた。

リモートだけのつもりが tmux をいじっているうちにこれはなかなか良いものだと言うことになり、ローカルも乗り換えるに至った。

まず、tmux をおすすめしてる記事はこれまでもよく目にしてきたがピンとこなかったのは、ほとんどの記事が GNU screen をハードに使ってる人のものではなかったからである。 GNU screen をハードに使ってる人のために僕が tmux の良いところを上げると、

  • tmux 内外問わず、すべての操作をコマンドから行える
  • window 増やさなくても window の中に分割窓(pane)をおける

他にもいろいろあるのだが、この二つは大きい。

tmux 内外問わず、すべての操作をコマンドから行える

これは script 的に動作を拡張しようとしたときに重要になる。 GNU screen でもまぁ screen -X でできるのだが、tmux に比べるとできることが限られており、ちょっと込み入ったことをやろうとするとすぐに screen にパッチを当てる、みたいなことになるw

window 増やさなくても window の中に分割窓(pane)をおける

tmux は window 分割の概念が screen とは異なっている。tmux では分割された小窓は pane とよばれ、window とは定義が違ったものが存在する。それによって window を増やすことなく画面を分割でき、それぞれの window が分割 pane のレイアウトを別々に管理することが可能になっている。

これは好みの問題もあるかもしれないが、僕は tmux 方式が気に入った。

これによって GNU screen 利用時より分割を積極的につかうようになった。特にライフチェンジングだなとおもったのは、分割窓を Emacs でいうところの popwin.el 的に使う方法だ。man をチラ見したり、辞書を引いたりそういうレベルで気軽にpaneをつくれ、man を終了するとpaneが自動で閉じるといった具合に便利に使える。

canything

Emacs 使いが分割窓を popwin 的に使うようになったらまず思いつくのがやっぱり Anything だ。コマンドラインベースのがあったら tmux と相性いいだろうなとおもったらすぐに見つかりました。

canything: CUIでAnything

上記サイトにも乗っているけれど、

$ tmux lsw | canything | cut -d":" -f 1 | xargs tmux select-window -t

とかすれば tmux ウィンドウを anything 風切り替えできるのですが、これを分割窓と組み合わせて、

# .tmux.conf
bind-key b split-window 'tmux lsw | canything | cut -d":" -f 1 | xargs tmux select-window -t'

みたいに設定すると、C-z b (僕はprefixキーz派) で Emacs っぽく画面分割され anything 風しぼりこみインタフェースで window 切り替えできる。すばらしい。

irssi で anything 風チャンネル切り替え

となるとやっぱり真っ先に思いつくのがこれでしょう。まず irssi プラグインを書き、コマンドラインから irssi のチャンネルリストを取得、チャンネル切り替えをできるようにするものを書いた。

channel-socket.pl

これを読み込んで、

/channel-socket start

とすると /tmp/irssi-channels.sock/tmp/irssi-set-channel.sock という二つの UNIX ドメインソケットが作られる。それぞれチャンネル取得用ソケットと、チャンネル切り替え用ソケットだ。

具体的には

$ nc -U /tmp/irssi-channels.sock

でチャンネル一覧取得でき、

$ echo '#emacs-ja' | nc -U /tmp/irssi-set-channel.sock

でチャンネルを切り替えられるっていう具合だ。

これを連結させて

$ nc -U /tmp/irssi-channels.sock | canything | nc -U /tmp/irssi-set-channel.sock

で、anything 風 チャンネル切り替えのできあがり。

これを tmux の分割窓とくみあわせれば完璧。さっきの tmux ウィンドウ切り替えみたいに tmux 側で bind しても良いが、irssi 側でやるのがより自然かなと思う。僕はこんな感じにした。

/bind meta-b command exec - tmux split-window 'nc -U /tmp/irssi-channels.sock | canything -i | nc -U /tmp/irssi-set-channel.sock'

これで irssi 上で M-b すればチャンネル一覧の anything 窓がでる。

Anything like incremental channel switching at irssi

こんな感じ。他にもいろんなことにつかえそうですね!

by typester / at 2012-03-26T06:53:00 / irssi · tmux / Comments(0)