いやー、皆さん本当に無断リンク禁止問題がお好きなようで。無断リンク禁止教の信者に対して徹底的に、何故無断リンクが良くないのかとか聞いてみたいとか思うときもあるけど。でも思い返してみたら、それって宗教が害悪になるプロセスと同様にそうやって刷り込まれているからってのが原因で、宗教と同じ程度にはいかんともしがたいんだよなあ。
見方を変えれば、宗教と同程度にはどうにかなるということでもある。宗教から自力で抜け出すことは十分に可能なんだから。
Mercurial で使うエディタを変更したいなど、バージョン管理ツールでコミットメッセージを書くプログラムを変更したい場合はある。だけど普通に export EDITOR=scribes などとすると、うまくいかない場合がある。何故かというと、大抵のプログラムは自身のプロセス内部で system 関数などでコマンドを呼び出しているはずであり、それは vi などの端末の制御を握ったままのエディタを想定した動作なのだ。
じゃあそういう場合、どうすれば scribes を使えるのか? 俺が上記のページのコメントに書いた方法で大体あってるはずだが、それをもうちょっと一般化させると次のような手順になる。
まずは次のようなシェルスクリプトを書き、適当な名前で保存してパスを通し、環境変数 EDITOR に設定する。
#!/bin/bash
PROGRAM=scribes # ここにはお好きなエディタをどうぞ
$PROGRAM $1
while [ -n "`ps t | grep $PROGRAM | grep $1`" ]
do
sleep 1
done
これが何をしているかというと、適当なエディタを起動したあとにそのエディタのプロセスが生きている間は空ループを回し、端末の制御権を握ったままにしているのだ。こうしないと、起動時に端末の制御を手放すエディタ (scribes, gvim など) では問題が起こる。例えば次のような操作を考えてみる。
>>> import os
>>> os.system("vi"); # vi が終了するまで戻ってこない
>>> os.system("scribes") # 即座に制御が戻ってくる
>>> os.system("gvim") # 即座に制御が戻ってくる
>>> os.system("gedit") # gedit が終了するまで戻ってこない
プログラムの内部でこういうことをやっていると、エディタによっては制御が即座に戻ってきてしまって (ファイルが作成される前に戻ってきてしまう) 期待した動作にならないのだ。 Mercurial のコードを調べてみたら、やはり似たような事をしている (ui.py と util.py あたりを参照)。というかまあ、普通はそれくらいしか方法はないよな。何にせよ、殆んどの場合は上記のシェルスクリプトで解決可能だろう。
ただどういうわけか、 satoshi さんのケースは gedit でおかしくなってるんだよなあ。試しに Mercurial をインストールしてやってみたら、 satoshi さんのやり方で出来たし。うちと gedit や Mercurial のバージョン (うちは gedit は 2.14.3 で Mercurial は 0.8) が違うのか? でもそれでそこまで大きな差が出るとは思えないしな。謎だ。
っていうか Mercurial 、コマンド体系と履歴へのアクセス方法は俺の目指している方向と結構似てる? まあ俺はもっと原始的なリポジトリの構造を考えているから (darcs がかなり近い)、あんま似たような事にはならないと思うけど。というかバイナリ形式でデータを持っているのが俺の目指す方向と決定的に違うな。
しかしあれだ、とっとと作り終えないと誰かに先を越されてしまいそうだ。というかこの世のどこかには既にあるのかもしれない。まあ俺は車輪の再発明が趣味なので、どっちにせよマイペースで作っていきますが。