Hatena::ブログ(Diary)

namutakaの日記 このページをアンテナに追加 RSSフィード

2010-01-16

MacVimの起動方法いろいろ

Macを使う上でのエディタをMacVimを使っている。

そのため、コマンドからファイルを開くときにもMacVimを使うようにするために、MacVimの起動方法を調べた。

最初はネットで調べてたけど、そういえば、そもそものMacVimのヘルプに書かれてることにようやく気づいた。

ヘルプでの説明は、MacVim上で以下のコマンドを実行すれば読むことができる。

:help macvim-start

通常の起動方法

% mvim

通常はmvimコマンドで、新規ウインドウで起動する。

これは通常のVIMと同じようなものなので、VIMと同じ起動オプションが使える。

mvimコマンドは実際にはBashファイルで、その中では最終的に以下のようなVIMコマンドを実行している。

/Applications/MacVim.app/Contents/MacOS/Vim -g file ...

また、このmvimを基にして以下(ヘルプ抜粋)のようにシンボリックリンクを作ると、各VIM系コマンドとして使える。

(例えば、mvimdiffがvimdiffの代わり)

The "mvim" script can be symlinked to in order to start up MacVim in different
modes as follows (assuming you placed "mvim" in "/usr/local/bin"): >
	* Diff:		ln -s /usr/local/bin/mvim mvimdiff
	* Read-only:	ln -s /usr/local/bin/mvim mview
	* Ex:		ln -s /usr/local/bin/mvim mex
	* Restricted:	ln -s /usr/local/bin/mvim rmvim
If the symlink destination starts with "m" (or "g"), Vim will start in GUI
mode.  Removing the initial "m" from the above destination names makes Vim
start without the GUI.  (In the last case, the destination name can be
"rmvim", "rgvim" or "rvim".)

注意:Mac(Snow Leopard)だと、/usr/localフォルダは無く、/usr/bin/mvimになる。


VIMのコマンド引数とかを指定しなくて、どうなってんのかと思ったら、mvimの処理中で自分自身の起動された時のコマンド名をもとにコマンドオプションを追加していた。

例えば、コマンド終端が"vimdiff"という文字だったら、"-dO"が付けられてVIMが起動される。


既存のウインドウで新しいタブで開く

% mvim --remote-tab-silent file ...

単にmvimコマンドを使うと、実行ごとに新しいウインドウが開いてしまう。

せっかくタブ化できるんだから、タブで開きたい。


そういうときは、mvimのオプションの--remote系を使うと、既存のVIMウインドウ内で、ファイルを開くことができる。

"--remote"の後に"-tab"を付けると、1ファイル1タブで開く。"-tab"を付けないと、バッファとして同じタブ内に開いてしまう。

"-silent"を付けると、既存のVIMがないときにエラーメッセージを出さない。(はずだけど、なぜか英語でのエラーメッセージが消えてくれない。バグ?)


また、"--servername"オプションを併用すると、流用するVIMウインドウを指定することができる。

VIMウインドウごとにサーバー名が割り当てられるらしく、"--serverlist"オプションで起動中のサーバー名一覧を表示できる。(serverといっても専用のサーバープロセスが起動されているというわけではなさそう)

以下のように"--servername"オプションサーバー名を指定すれば、開く対象のウインドウを指定できる。

#無指定は、"VIM"という名前になる
% mvim
#2つ目は"VIM2"
% mvim
#名前を指定して起動もできる
% mvim --servername "VIMVIM"
#一覧を表示
% mvim --serverlist
VIM
VIM2
VIMVIM
#2つ目のウインドウで開く
% mvim --servername "VIM2" --remote-tab-silent filename

ちょっと問題なのは、通常のVIM起動オプションがほとんど使えなくなること。

おそらく起動オプションは、プロセス起動に対するものとしか効いてくれないのだと思う。

例えば、以下のようにしても読み取り専用で開くことはできない。

% mvim -R --remote-tab-silent filename
#-Rは効かない。

その代わり、"--remote"の後に、”+XXX"という表記でexコマンドを記述すれば、ファイルオープン時にそれを実行できる。

例えば、読み取り専用でファイルを開くには、下記のようにする。

% mvim --remote-tab-silent +"set readonly" filename

exコマンドを複数指定したいときは、「|」区切りで列挙する。

これで、起動オプションが使えなくてもなんとでもなりそう。


アプリケーションとして起動

% open -a MacVim file ...

これは、Finderとかでアプリアイコンダブルクリックして起動するのと、同じことをコマンド上から行う方法。


openコマンドは、アプリ名を引数に渡せばアプリを起動できる。

アプリ名ではなく、ファイル名を指定すれば、関連付けに従ってファイルを開くことができる。

Windowsでいうとstartコマンド)

"-a"オプションは、関連づけではなく、指定したアプリでファイルを開くための指定。

このとき、開いたファイルが新規ウインドウで開くか、新規タブで開くかは、MacVimの環境設定で設定する。

#環境設定の「アプリケーションからファイルを開くとき」プルダウンの中で「引数リストに設定する」は、どういう意味だろう?


ただしこの方法は、通常のVIM起動オプションもEXコマンドも使えなさそう。

openコマンドのヘルプでは、アプリへの起動オプションは"--args"後に設定するように書いてあるけど、MacVimに対しては通常のVIM向けのオプションは効かなかった。

例えば、以下のようにしても読み取り専用にはならない。

% open -a MacVim file --args -R
#-Rは効かない

そのため、mvimの代わりとして使うには、ちょっと不便。


まとめ

ということで、基本的には--remoteを使うのを前提として、以下のエイリアスを設定しておく。

alias mvi="mvim --remote-tab-silent"

これで、タブで開くときは"mvi"、新規ウインドウで開くときは"mvim"という感じで使い分けることにする。