キーボード操作がメインのUnixもいまやGUIがつく時代である。 X Window SystemではWindowsのように一画面上に複数の窓を開くことができる。 その窓を管理するのがウィンドウマネージャーの基本的な役割である。 ウィンドウマネージャーは星の数ほど存在している。 ウィンドウマネージャーを変えるだけで作業画面ががらっと変わるのであたかも別なOSになったかという気さえする。 ユーザの好みによってシンプルで機能の小さなものからGNOMEやKDEといったWindows顔負けの綺麗な統合デスクトップ環境*1までいろいろ選択できるのはX Window Systemの特権といえよう。
今、俺はratpoisonというシンプルなウィンドウマネージャーを使っている。 ratpoisonはいろいろな日記で触れられてはいるが、日本語でのまとまった紹介サイトは現時点*2では存在しないようなのでここで紹介しておこうと思う。 ついでに、ratpoisonはそのままでは日本語が表示できないので国際化しておいた。
現時点での最新版は1.4.0である。
Wikiが用意されているのでユーザが自由に書き込みすることができる。 Tipsなど情報も豊富。
Debian GNU/Linuxの人はaptが使えるが、最新版ではないので公式サイトから.tar.gzをひっぱってきてソースからインストールする必要がある。 国際化パッチとコマンドラインエディタ操作性向上パッチも当てておく。
cd /tmp tar xzf ratpoison-1.4.0.tar.gz cd ratpoison-1.4.0/ ./configure cd src wget http://www.rubyist.net/~rubikitch/computer/ratpoison/editor-1.4.0.patch && patch < editor-1.4.0.patch wget http://www.rubyist.net/~rubikitch/computer/ratpoison/i18n-1.4.0.patch && patch < i18n-1.4.0.patch cd .. make
「殺鼠剤」というだけあって、ひと癖もふた癖もあるウィンドウマネージャーなので万人にはおすすめできない。
日記サイトをめぐっていると、ratpoisonを誤解しているっぽい人が見受けられるので補足。 「ratpoisonは1画面に1つのウィンドウしか表示できない」というのは思い切り誤解だ。 ratpoisonは他のウィンドウマネージャーのように複数のウィンドウを表示できるし、仮想画面すらサポートされている。 infoでsplit/vsplitコマンドを参照しておくように。
ratpoisonはGNU Screenと同じような感覚で操作できる。 すなわち、prefixキーを押してからいろいろなキーを押すことになる。 prefixキーはデフォルトでは「C-t(Ctrlを押しながらt)」にバインドされている。 ここでは表記の都合上C-tのまま変更しないものとして説明していく。 prefixキーを変更する方法は後述する。
ratpoisonを起動したばかりの状態では既存のウィンドウが最大化されて重なった状態になる。 別な言い方をすれば、一番上のウィンドウしか見えない状態になっている。 ratpoisonから起動したXクライアントもすべて最大化される。 おっと、ここで「勝手に最大化するなコノヤロー」って声が聞こえてきそうだが、ちょっと待ってほしい。
ratpoisonではどのようにウィンドウを管理するかというと、ウィンドウに番号が振られる。 番号を指定することでそのウィンドウに切り換えられる。
C-t 0 〜 C-t 9, その番号のウィンドウに切り換え C-t n, 次(番号の大きい方)のウィンドウに切り換え C-t p, 前(番号の小さい方)のウィンドウに切り換え C-t C-t, 直前に選択したウィンドウに切り換え C-t t, 番号を入力してウィンドウに切り換えXクライアントは普通に端末から起動することはもちろん、ratpoisonから直接起動することもできる。 Windowsでいう「ファイル名を指定して実行」である。 短いコマンドはこれでもいいが、引数にファイル名をつける時などは補完がきかないのでやはり端末から起動した方がいいかもしれない。
C-t c, xtermを起動 C-t C-c, || C-t !, Xクライアントを実行 C-t C-!, 端末でコマンドを実行ratpoisonでは画面を複数の領域(フレーム)に分割することができる。 Xクライアントのウィンドウはフレームの大きさにぴったりおさまるように配置される。 「普通の」ウィンドウマネージャーの場合、ウィンドウはウィンドウマネージャーが勝手に適当な位置に配置することが多いし、ウィンドウが重なることも多い。 ratpoisonは予め配置場所を決めておき、ウィンドウをタイル状に配置するという方法をとる。 だからそういうスタイルに慣れるまではちょっと時間がかかるかもしれない。 しかし、そのスタイルに慣れ親しんだら手放せなくなるだろう。
C-t s, フレームを左右に二等分する C-t C-s, || C-t S, フレームを上下に二等分する C-t C-S, || C-t Tab, 次のフレームへ C-t M-Tab, 前のフレームへ C-t f, フレームを選択する C-t C-r, フレームをリサイズフレームをリサイズするとき、Emacsと同様の操作で上下左右(C-p, C-n, C-b, C-f)に拡大縮小し、最後にEnterを押すと完了。
すでに別のソフト(たとえばEmacs)でC-tを使っている場合、prefixをデフォルトのままにすると非常に使いづらい。 ratpoisonでは当然prefixを別のキーに割り当てることができる。 例によって設定ファイル ~/.ratpoisonrc に設定を書く。 たとえばC-zに割り当てる場合、
escape C-z
と書く。 なぜprefixではなくてescapeなのかというと、GNU Screenがそうだからである。
日本語キーボードを使っている人は無変換キー、変換キー、カタカナひらがなキーあたりをprefixにするといいかもしれない。 この場合、xmodmapでそれらのキーを適当なファンクションキーに割り当ててからratpoison側の設定をする。 たとえばカタカナひらがなキーをF17に割り当ててから、prefixをF17にするとよい。 ~/.xmodmapに
keycode 120 = F17
と書き、 ~/.ratpoisonrcに
escape F17
と書こう。 当然、~/.xinitrcか~/.xsessionに
xmodmap ~/.xmodmap
を書いてxmodmapを実行しておかないといけない。
なお、xmodmapで設定するkeycodeについてはxevかxbindkeys -kで調べることができる。
EmacsやGNU Screenと同様にratpoisonもあらかじめよく使うコマンドがキーに割り当てられている。 別な言い方をすると、すでにキーに割り当てられた動作もコマンドを入力してでも実行できる。 すでに割り当てられたキーではどういうコマンドが実行されているかは、C-t ?で見ることができる。
あるいは、シェルで
ratpoison -c 'help root'
を実行する。 すると、こんな出力が得られる。
C-g abort 0 select 0 1 select 1 2 select 2 3 select 3 4 select 4 5 select 5 6 select 6
言うまでもないとは思うが、左に割り当てられたキー、スペースをはさんで右にコマンドである。
全コマンドのリストはinfoで「(ratpoison) Commands」を開くとよい。 ウェブ上でもratpoison manual - Commandsで参照できる。
では、コマンドを入力してみよう。 GNU Screenと同様にC-t :でratpoisonのコマンドを入力して実行できる。
C-t : other C-t : select 0
などいろいろやってみよう。
親切なことに、コマンド名には補完が使える。 さらに、過去に入力したコマンドを取り出すヒストリ機能も。
嬉しいことにシェルからratpoisonに命令を下すこともできる。 *3 ということはすなわち、シェルスクリプトで自動的にたて続けにコマンドを実行できるということに他ならない!! おかげでratpoisonは非常に高い柔軟性を持つ。 ratpoisonは基本的な機能のみを提供し、複雑な操作がしたければスクリプトをゴリゴリ書いていく・・・ほんとにUnix的だ。
遠隔操縦の方法は簡単だ。シェルから
ratpoison -c コマンド1 [-c コマンド2 ...]
でコマンドを順に実行できる。 コマンドにスペースが含まれる場合はquoteする必要がある。 たとえばこんな感じに。
ratpoison -c 'fselect 0' -c 'select 0'
また、シェルから遠隔操縦する場合(non-interactively)は独特の動作をするコマンドもある。 そういうコマンドは結果を標準出力に書き出す。 たとえば、
ratpoison -c windows
を実行すると、標準出力にウィンドウのリストが書き出される。 何が嬉しいかというと、スクリプトが結果を利用できることだ。 おかげで「ある名前のウィンドウを選択する。もしそのウィンドウが見付からなかったら、プログラムを起動せよ」といったこともこなせる。
ただ、対話的に実行するのと同じ挙動をしてほしい場合、そういう挙動は嬉しくない。 そういう場合は、-iオプションもつける。
ratpoison -ic windows
といった具合に。
次に述べるように、仮想画面はシェルスクリプトで実装されている。
ratpoisonは一見貧弱だがその拡張性のおかげでさまざまな追加機能が実装されている。
仮想画面というのは画面を実際の数倍の広さに見せかける技術である。 広い広い仮想画面の一部を覗いているというイメージ。 特定のキー操作をするか、マウスカーソルを端へやると自動的に「隣」の仮想画面に移るので、それぞれの仮想画面への移動は楽である。 おかげで狭い実画面にたくさんのウィンドウをちりばめて混乱することもなくなり、画面を有効に使えるのだ。 実際仮想画面をサポートしているウィンドウマネージャーは多いし、Windowsでも仮想画面を実現するソフトは存在する。*4
ratpoisonの場合、仮想画面はrpwsというシェルスクリプトで実装されている。 ratpoisonの仮想画面は普通のそれとは違い、実画面の大きさの仮想画面が7枚重なっている。 それぞれの仮想画面は当然キー操作で切り換える。
ratpoisonをインストールするときにrpwsもインストールされているのでインストール作業はしなくてよい。 初期設定は、rpwsのコメントにあるように ~/.ratpoisonrc に
exec rpws -i exec rpws -b
の2行を追加する。 すると、C-t M-1で仮想画面1、C-t M-7で仮想画面7に切り換えられる。 2から6も同様である。
なぜ仮想画面が実装できるかというと、
からである。
fdumpというコマンドは現在のフレーム分割状態を数字の羅列で出力する。 frestoreはfdumpの出力形式を引数にとり、その分割状態へ復元する。 分割状態とは、それぞれのフレームの左上の座標、そのフレームのウィンドウIDなどである。 分割状態がどんなに複雑でも、fdump形式の引数さえ与えてしまえばfrestore一発でいつでも希望の分割状態にできる。 もちろんウィンドウIDは再起動すると変わってしまうこともあるが、フレーム分割状態が一発で復元できるのは大きい。 気に入った分割状態があったら ~/.ratpoisonrc に書いておくといいだろう。
ウィンドウのグループ分けとは、ウィンドウをratpoisonから見えたり見えなくしたりすることである。 ratpoison起動直後はすべてのウィンドウはdefaultというグループ下にある。 そのため、すべてのウィンドウを選択することができる。 新しくグループを作成し(gnewコマンド)、現在のグループを作成したばかりのグループにする(gselectコマンド)と、他のグループのウィンドウは選択できなくなる。 現在のグループ上でウィンドウを開くと、現在のグループでしか選択できない。 こんな機能あってもただ不便になるだけじゃないかと最初は思うかもしれないが、これは仮想画面を実装する上では必須の機能であることがわかる。
getenvコマンドは環境変数を出力するコマンドである。 ratpoison -cで起動したら標準出力に、対話的に起動したら画面上に出力される。 実際のところスクリプト専用コマンドといった位置付けだろう。 setenvコマンドは環境変数を設定する。 getenv/setenvはratpoison固有の『状態』を記憶するために使われるといっても過言ではない。
この3つの機能があって初めて仮想画面は実現される。
rpws -iを実行したら、新たなグループが6つ作成する(最初のひとつはdefaultという名前)。 それから、各々のグループにおいて初期の分割状態が記憶される。
rpws -bはただキーバインドを設定してるだけである。
そして、最も重要な仮想画面切り替え部分。それは、
分割状態が絡んでいるところはfdumpとfrestoreが使われ、「記憶」と「復元」のところで環境変数が使われている。 グループも切り換えているので、その仮想画面でしかウィンドウを選択できないようになっている。 こうしてめでたく仮想画面が実現できた。 「ratpoison本体は単純な機能のみを提供し、それ以上の複雑な機能はスクリプトで実現する」というポリシーを一番感じるスクリプトだと俺は思う。 一番理解が難しいのは多分グループについてだと思うが、言葉で説明するよりも実際rpwsを使ってみればあっさりと理解ができると思う。
え、別な仮想画面にいるとき、いつも使っているktermを選択するのにいちいち仮想画面を切り換えてからktermを選択しないといけなくて面倒だって?? 御安心を。スクリプトを書いて設定すればいいだけだから。
#!/bin/sh rpws 1 ratpoison -c 'select kterm'
このスクリプトをpathの通っているディレクトリにrp-ktermという名前で保存し、 ~/.ratpoisonrc に
bind o exec rp-kterm
などと書いてキーに割り当ててしまえばいい。
パッケージのcontrib内にはgenrpbindingsというコマンドが付属している。 これは、ratpoisonのソースコードからコマンドのリストを抜き出し、様々なスクリプト言語のライブラリを生成するコードジェネレーターだ。*5 生成されたコードを使うとシェル以外のスクリプト言語でratpoisonを操作することができる。 今のところ用意されているのはPerl、EmacsLisp、そしてなんと我らがRuby! PythonがなくてRubyというのがオツだ。 引数なしで実行すると、
Ratpoison.pm ratpoison-cmd.el ratpoison.rb
が生成される。
ratpoison.rbではそれぞれのコマンドが標準出力の内容を文字列で返すRatpoisonのモジュール関数として定義されている。
Emacs使いが多いratpoisonコミュニティにおいて、設定ファイル編集支援EmacsLispが作られるのはある意味当然の成行きである。 contrib/ratpoison.elをload-pathの通ったディレクトリにインストールしよう。 用意されている機能は、
ただ、ratpoison-commandの動作に不具合があるので、次のパッチを当ててほしい。
ratpoisonを使う人なら、GNU Screenも使っている人もいると思う。 ratpoison側からGNU Screenを操作することも可能である。
たとえば、こんな状況を想定してみる。
この状況でEmacsをさわりたい。このとき、
の3つの動作をしなければならず、非常に操作性がよくない。 是非とも自動化したい。 そして、ratpoisonから任意のGNU Screenのコマンドを送れるようにしておきたい。
そのためにはまず、rp-screenというスクリプトを作成する。
#!/bin/sh rpws 1 ratpoison -c 'fselect 0' -c 'select kterm' screen -X "$@"
rpws1でWS1へ移動。 fselect 0でktermのフレームへフォーカスをあわせる。 そして、select ktermで確実にktermのウィンドウにしておく。 なぜなら、ktermの「指定席」に他のウィンドウがある場合もありえるからだ。 そして、screen -Xで任意のGNU Screenコマンドを送信できるようにしておく。
このスクリプトを使って
rp-screen select 0
を実行すればどこのWSにいててもどこのウィンドウにいてても関係なしにめでたくEmacsへ到達できる。
さて、今度はratpoison側の設定に移ろう。まず、 ~/.ratpoisonrcに
alias screen exec rp-screen
を書いておく。 これで、ratpoison上にscreenというコマンドが定義された。 以後、screenというコマンドを ~/.ratpoisonrc でもC-t :でも使えるようになって非常に便利だ。
ここまでくれば、あとはrp-screen select 0をキーにバインドするだけである。
bind j screen select 0
などと書いておけばC-t jで一発でEmacsに切り換えられる。 他にもよく使うウィンドウについても同様な定義をしておくとよい。
応用として
bind c screen screen
と書いておけば、C-t cで新規にktermを起動する代わりに、screen上で新たなウィンドウが作られる。 この設定はktermウィンドウが増えまくることがないので俺は気に入っている。
ratpoisonは慣れれば十分実用的なウィンドウマネージャーなのだが、どうしても相性の悪いソフトは存在する。
前者の代表としてはgimpが有名である。 ratpoisonの天敵ともいえるgimpをどう対処するかについて述べる。
後者の方はやや仕方ないとも言える。 あらかじめ画像の大きさを求めておいて、defpaddingやfrestoreでウィンドウの大きさに合わせるという手もなきにしもあらず。 ratpoison上の画像ビューワならGImageViewがいいだろう。 画像ビューワ以外なら、希望の大きさのフレームを作成しておけば問題なし。
ratpoisonユーザにとってgimp問題は本当に悩まされる。 作者は「ratpoisonですべてをまかなうつもりはない」とのことなので対処する気はないようだ。 gimpのせいでratpoisonを使うのをやめた人も多いと俺は思う。
現状でできる対処方法は、次のうちどれかである。
rpwsで複数のWSを使っているときにtmpwmを使う案はすぐ思い付く案だが、いちいちウィンドウマネージャーを入れ替えるのは面倒である。
gimpに合うようにフレーム分割をしてなんとかratpoison上でgimpを使ってやろうとこういうスクリプトを書いた人がいる。
Xnestは「Xサーバとして働くXクライアント」である。 Xnestの中はXサーバなのでその中でウィンドウマネージャーを立ち上げたりXクライアントを立ち上げたりできる。 Xnestは同時にXクライアントなのでXnestを立ち上げたウィンドウマネージャー(親に相当。)からしてみたらひとつのウィンドウに過ぎない。 そのため、ratpoisonの中で新しいウィンドウマネージャーを立ち上げることができる。
Xnestを使うためにはxauthの設定をしないといけない。 うまく説明できないので下のページを参考にしてほしい。
rpwsを導入している今、Xnest用のWSを用意しておいた方がいいだろう。 シェルから次のコマンドでXnestが立ち上がるのが確認できる。
rpws 2; Xnest -geometry 1024x768 -kb :1 &
あとは好きなウィンドウマネージャーを立ち上げてgimpを使うとよい。
DISPLAY=:1 fvwm& DISPLAY=:1 gimp&
俺は今のところgimpを使っていないので自動化まではしていない。 各自で工夫してほしい。
混み入った要求にも柔軟にサポートしてくれるのがコマンドベースなインターフェースのありがたみだ。 rpwsも含め他人の書いたスクリプトを読むことで新たな使い方を発見したり、オリジナルの使い方が思い付いたりするだろう。 ユーザひとりひとりが自分好みのratpoisonに育ててほしい。
お気に入りのウィンドウマネージャーなのでいじらずにはいられない! ということで拙作パッチをいくらか。 Ver 1.3.0 RC2 Beta1に対するパッチである。
ratpoisonはそのままでは日本語が表示できないので国際化をしてみた。 国際化しないと何が困るかというと、日本語のウィンドウタイトルが文字化けしたり、echoコマンドで日本語のメッセージが出せない。
Xはすでに国際化機構が標準でついているのに使われていないというのはもったいない話だ。 作者が英語圏の人の場合、国際化機構を使わないで作られているソフトは多いが、仕方ない。
How To Internationalize Window Managerを参考に国際化をしてみたらあっさりできたのでここに置いておく。
今のところ、国際化といっても「日本語表示」までしかやっていない。 メッセージを日本語化したり、C-t :のコマンドラインに日本語入力ができるようにはしていない。 メッセージの英語は簡単だし、コマンドラインでの日本語入力の必要性はゼロに等しいと考えているから、手間の割に御利益が少ないからだ。
このパッチを当てて国際化した後、 ~/.ratpoisonrc でフォントの設定をしておく必要がある。 たとえば、次のフォントを使いたいとする。
半角フォント, -paw-fixed-medium-r-normal--16-150-75-75-c-80-jisx0201.1976-0 全角フォント, -paw-fixed-medium-r-normal--16-150-75-75-c-160-jisx0208.1983-0deffont -paw-fixed-medium-r-normal--16-150-75-75-c-*-*-*
あるいは、
deffont -paw-fixed-medium-r-normal--16-150-75-75-c-80-jisx0201.1976-0,-paw-fixed-medium-r-normal--16-150-75-75-c-160-jisx0208.1983-0
実は国際化パッチを当てたあと、フォントはフォントセットとして扱われるのでワイルドカードでマッチさせたり、コンマで区切ったりして複数のフォントを指定する。
ratpoisonのコマンドラインでも通常のシェルのようにC-m, C-i, C-hが使えたらいいなということでパッチ。 言うまでもないがC-mはEnter、C-iはTab、C-hはBackSpaceと同じである。
ratpoisonとともに使うと快適なソフトを紹介する。
シェルからメニューを作成する小さなプログラム。 ratpoisonにメニューはないが、このratmenを使えばratpoison上でメニューを構築できる。 こういう小さいプログラムが大活躍するのがUnixらしい。
作者が日本人な画像ビューワ。 ratpoisonではとにかくウィンドウを強制的にフレームの大きさにしてしまうので、通常の画像ビューワだと画像を表示しているウィンドウの大きさを変えてしまうせいで画像がゆがんでしまう。 でも、このGImageViewはそういう嫌な現象が起こらない。 しかもサムネイル(小さな画像)表示ができるなど、とても使いやすい。 ratpoisonの発想はいいんだけど、画像ビューワが使いものにならないなあと悩んでいる人は是非とも使ってみてほしい。
*1今のウィンドウマネージャーの話題の中心らしいが、俺は必要を感じていないので使わない。重いと聞くし。
*2[2004/05/21]現在
*3GNU Screenでいえばscreen -Xだ。
*4大昔、Windowsを使っていた頃に実際に使っていた。
*5達人プログラマの教えにあるように、コードジェネレーターを使うのは非常に有益。