2011/02/28

どうやらzshなしでは生きられない体になってしまったようなので…

ついにWindowsにまでcygwin-zshを入れてしまった。minttyとの組み合わせで快適。今まで、なるべくcygwinは避けて生きてきたのに……ホントにzshがないと生きられなくなりつつある。堕ちるところまで堕ちた感じだ。2月27日 via web Favorite Retweet Reply

 最近、上のようなことをTwitterでさんざんつぶやいてますが、表題のとおりです。
もうTab補完でどこにでも行けるコレに慣れてしまうと、手放せなくなる、っていうか補完がきかないとコマンドラインでの作業ができないくらいになりつつあります(>_<)
ホントにたくさんのコマンドの補完ルールが最初から入ってるので、どんどんオプションを覚えなくなって、どんどん堕ちていくw

 そんな、イイカンジに人を堕落させてくれるzshをWindowsに入れる際に、いろいろとコツがいったので、メモがわりに書き留めておきます。
自分以外にも、Windowsでzshを使うのをためらってた人がいたら、これでzshライフ始めましょう!

Cygwinを使います

 Windowsでzshを使うには、Cygwinを使う必要があります。
Cygwinについてはいくらでも情報があるので、ここではもうインストールされているものとします。

 zshはCygwinのインストーラからインストールできます。
setup.exeを起動して、Shellsカテゴリにあるzshとminttyを選択します:

 Windows標準のDOS窓は横幅が変えられなかったりして大変不便なので、今回はminttyをターミナルとして使います。
他にもPoderosaとかPuTTYを使う方法がありますが、シンプルで簡単に使えるminttyをとりあえず使ってます。
ホントは使い慣れたckwを使いたかったんですが、日本語まわりでcygwinと絶妙に相性がわるいので、断念しました。
「こっちのほうがオススメだよ!」っていうのがあったら教えてください><!

ログインシェルを変更する

 UNIXだったらchshするところですけれど、Cygwinにはついてこないようなので、/etc/passwdを直接書き換えてしまいましょう。
エディタで/etc/passwdを開いて、自分のユーザ名に相当する行の一番後ろのカラムを以下のようにzshのパスにします:

ユーザ名:unused:UID:GID:…(中略)…:ホームディレクトリ:/bin/zsh

 でも、これだけだとCygwin.batでは依然としてbashが起ち上がってしまいます。
これは、Cygwin.batがbashを決め打ちで起動してしまっているためです。

Cygwin.batを書き換える

 自分はこんな感じにしてます:

 色々やってますが、重要なのは最後の行だけです。
shを介してminttyをバックグラウンドで起動してます。minttyに「-」を渡して起動すると、ログインシェル、つまり上で設定したzshを起動してくれます。

 なんでわざわざバックグラウンド起動するのかというと、minttyはCygwin.batの動いてるDOS窓とは別に、新しくウィンドウを開いてそちらにzshを表示するので、普通に起動するとウィンドウが2枚になってちょっとおマヌケだからです。
バックグラウンドで開くと、Cygwin.batはminttyの実行終了を待たずに実行を終了してDOS窓を閉じてくれるというわけですね。

 残りはほとんど環境変数を設定してるだけ、他にもCygwin環境だけで有効にしたい環境変数があれば、ここで設定してしまいましょう。
特に、Windows形式でPATHを設定したい場合には、ここがラストチャンスです。(Cygwin環境に入る際にUNIX風のパスに変換されてしまいます)

 さて、これでめでたくzshが使えるようになりました!

 「起動してみたら、やたらいっぱい設定聞かれた。ワケわかんないしウザイからもういいよ」

っていう人は、ひとまず↓の内容をホームディレクトリの.zshrcに書いておけば、補完ライフを十分楽しめますよ!

 とりあえず、zshでTabキーを連打するところから始めましょう><
「もっとzshの実力を味わいたい!」 という方は、有名な連載『漢のzsh』の「コピペでzsh」からコピってみてくださいねっ!

 さて、Windowsでzshライフを快適にするために、もう少しだけ設定が続きますよ。

ウィンドウを出さないようにするとスマートだよね!

 すぐに閉じられるとはいうものの、起動時に2枚ウィンドウが出るのはちょっとウザイよね、っていう人は、ショートカットの設定で最小化状態で起動するようにしてしまいましょう:

 こうすると、一枚目のウィンドウは最小化のままで目に見えることなく、人知れず静かに閉じられるので、ずいぶんスマートになります。

openコマンドを足す

 MacOS Xでコマンドラインをお使いの方はご存知かと思いますが、指定したファイルをOSで関連付けられたアプリケーションで開いてくれるとっても便利なコマンド、それがopenです。
長年愛用していたNYACUSにも同様のopenコマンドが実装されており、自分にとってはなくてはならないコマンドなのですが、zshにはないので、自分で用意することにします。

 まず、関連付けられたアプリケーションで開く方法ですが、これはWSHの機能を使ってサクっとスクリプトに任せます。
こんなスクリプトを書きました:

 引数で並べたファイルをとにかく開いちゃうって内容です。
これをcscriptコマンドで呼び出せばいいわけですが、毎度毎度、「cscript open.js 〜」なんて書くのは興ざめですよね?
ここはzshで関数を書いてショートカットするようにします:

 これを.zshrcあたりに書いて、めでたく「open ファイル名」でファイルを開けるようになりました!
ちなみに、cygpathはUNIX形式のパスからWindows形式のパスに変換するコマンドですね。cscriptは、当然Windows形式しか認識しないので、必須なのです。

zshカワイイよ!!zsh!!

 こんなカンジで、Windowsでも、Enjoy zsh life!(>~<)b とりあえず自分はこんな設定で使ってますが、「こうしたほうがもっとイイよ!」ってのがあったら教えてください〜


※追記(2011/04/18)

 @mongrelPさんに cygstart なる便利コマンドがあることを教えてもらいました。ありがとうございます><!

@Maki_Daisuke →についてなんですが、openのかわりにcygstartというコマンドがあるそうです。aliasするだけでよろしい模様。 http://yanother.blogspot.com/2011/02/zsh.html4月18日 via web Favorite Retweet Reply

 というわけで、 alias open=cygstart しておくだけで良かったんですね。なにコレ便利!