openコマンドでターミナルからアプリを起動する

ターミナル自体はTerminal.appでもなんでもいいんだけど、自分はxterm-256colorが使いたいのでiTermをインストールして使っている。
まぁ本当はvimで256カラーが使いたいだけなので、gvimやMacVimを使うからどうでもいいんだけどw

ターミナルからMacVimを起動する

SubversionやGitなどのVCSでコミットログを書くエディタをvimではなくてMacVimにしたい。


まぁ普通に$EDITORとかに設定すればいいんだけど、あれ、.appなアプリってどうやって起動すんの?
.appってWindowsでいう.exeみたいなもんかなーと思って試しに実行してみようとしたらディレクトリじゃねーか。なんだこれどうやって実行すんだ?


ふむふむ、なんでもopenコマンドというやつで実行するらしい。

open -a MacVim

ってやったらMacVimが起動した!
というわけで

#!/bin/sh
open -a MacVim "$@"

という内容でgvimというシェルスクリプトをこしらえてみたんだけど、起動した後すぐに制御が戻ってしまうので、メッセージ未編集と判断されてコミットできねー。
つーわけでman openしてみたら色々とオプションがあって、-Wを指定すると終了を待つようになるらしい。


ついでに-nで新しいインスタンスとして起動するようにする。
でないとMacの場合全てのウィンドウを閉じてもアプリは終了しないので、他に編集中のMacVimがあったら全部終了しないといつまでも待ってしまうことになる。
おまけでMacVim側の設定も「最後のウィンドウを閉じた時:MacVimを終了」にしておくと:wqやZZでそのまま終了してくれるので使い勝手が良くなる。

#!/bin/sh
open -W -n -a MacVim "$@"

出来上がったシェルスクリプトがこれ。これを~/bin/gvim-waitとかって名前で置いておいて、$SVN_EDITORと$GIT_EDITRに設定した。
ついでに-W -n無しのほうもgvimという名前で置いておいた。

カレントディレクトリはホーム固定なの?

ところで上記でこしらえたgvimだと存在しないファイルが指定出来ないことに気づいた。

cd ~/tmp
gvim newfile.txt

とやって起動すると

The file /Users/pasela/tmp/newfile.txt does not exists.

と怒られてしまい、新規ファイルの編集が出来ない。openコマンドの引数の一部として解釈されて存在チェックに引っかかっているらしい。
またまたopenコマンドを調べてみると--argsでアプリの引数が指定出来るとのことなので、こちらでファイル名を指定してみたが……

cd ~/tmp
open -a MacVim --args newfile.txt

なんと~/newfile.txtとして起動してしまうではないか。
色々試してみたんだけど、どうもopen実行時のカレントディレクトリに関わらずホームディレクトリ固定で起動するらしい?
もっというとopenではなく/Applications/MacVim.app/Contents/MacOS/MacVimを直接起動しても同じ状況だった。
/Applications/MacVim.app/Contents/MacOS/Vimの方はカレントディレクトリを維持したまま起動したので、MacVimがおかしい?


実はsvn ciをやったときのcommit.tmpがまさにそんな感じなので全然メッセージが編集できないという罠にはまったのだった。
もっともコミット時にはcommit.tmpは存在するに決まってるので、上記では--argsではなくopenの引数として$@を渡すこと*1で妥協をしているのだが、gvimのほうはこれでは新規ファイルが編集できないではないか。
ううーん、カレントディレクトリを指定するようなオプションも見あたらないしこれは困った……。
MacVimはどうやらオプションを受け取ってくれないみたいなので--cmd ":cd ~/tmp"とかしても利いてくれない。

MacVimのフォント

今までUbuntuWindowsで使ってた時はguifontだけでフォントの設定ができてたんだけど、MacVimではguifontに加えてguifontwideも設定しないと日本語の部分が変わってくれなかった。

*1:この場合はパスとか修正してくれるのかな?何らかの修正が入るらしい。逆に--argsのところは「何もしないよ」と書かれている。