CygwinからWin32版GVimを起動する


この記事は、Vim Advent Calendar 2014の27日目の記事ではありません。(たぶん)

Windowsで使えるVimにはいくつかの種類があります。例えば以下のようなものがあります。

  • Win32(or Win64)版のVim/GVim
  • Cygwin版のVim/GVim
  • MSYSのVim

それぞれの環境から別の環境のVimを起動するのはトラブルの元ですが、それでも別環境のVimを起動したい場合もあるでしょう。
ここでは、CygwinからWin32版のGVimを起動する場合の注意点を説明します。

環境変数

CygwinからWin32 GVimを起動する場合に一番問題になるのが環境変数です。Vimに関連する環境変数には以下のようなものがあります。

  • HOME
    .vimrc.gvimrcなどの設定ファイルを探す際に使用されます。Cygwinでは、/home/<user>が設定されています。Win32では通常は設定不要で、設定されていなければC:\Users\<user>が使われます。(Win32のホームディレクトリを、Cygwinのホームディレクトリを指すようにすることで設定ファイルを共有することも出来ますが、おすすめしません。)
  • SHELL
    Vimから外部コマンドを実行する際に使用されるシェルを指定します。Cygwinでは、/bin/bash等が設定されています。Win32では通常は設定不要で、設定されていなければcmd.exeが使われます。
  • PATH
    Vimから外部コマンドを実行する際に使われます。Cygwin内部では、通常のPATHの先頭に/usr/local/bin:/usr/binなどが追加されています。元の環境変数はORIGINAL_PATHに保存されています。Win32 GVimからCygwinのコマンドを実行する必要がなければ、元の環境変数を復元した方がよいでしょう。
  • TMP, TEMP
    一時ディレクトリの場所です。Cygwinでは、/tmp (=C:\cygwin\tmp)が設定されています。Win32では、C:\Users\<user>\AppData\Local\Tempが指定されています。一時ディレクトリに過ぎないので、大抵はどのディレクトリでも問題ないはずですが、外部コマンドによっては復元しておいた方がよいかもしれません。

以上を踏まえて、.bashrc等に以下のようなエイリアスを設定しておくとよいでしょう。

alias gvim='HOME= SHELL= PATH=$ORIGINAL_PATH gvim'

TMPTEMPも復元する場合は以下のようにするとよいでしょう。

alias gvim='HOME= SHELL= PATH=$ORIGINAL_PATH TMP=$LOCALAPPDATA\\Temp TEMP=$TMP gvim'

Win32版GVimにパスが通っていない場合は、末尾のgvim/cygwin/c/vim/gvim.exeなどのようにフルパスで指定してください。

これで、Cygwinからは、

gvim <filename> &

でWin32版GVimが起動できます。

パス形式

CygwinとWin32ではパスの形式が異なっています。前述の設定でWin32版GVimを起動する場合、ファイルのパスはWin32形式(あるいはWin32形式の\/に置き換えた形式)で指定する必要があります。
ファイルを相対パスで指定する場合には、Cygwin形式とWin32形式の違いを意識する必要はさほどありませんが、絶対パスで指定する場合には注意が必要です。(また、Cygwin形式のsymlinkについても注意する必要があります。)

自動変換(参考)

Cygwinのcygpathコマンドを利用すれば、パスの形式を相互に変換することが出来ます。例えば、

function gvimhelper() {
  HOME= SHELL= PATH=$ORIGINAL_PATH gvim $(cygpath -aw "$@")
}
alias gvim=gvimhelper

のような設定を行えば、パスを自動的にWin32形式に変換してGVimを起動することが出来ます。しかし、この設定の場合、GVimにオプションを渡すことが出来ないという問題があります。まじめに対処するには、引数を一つ一つチェックし、オプションでなければcygpathで変換するという処理が必要ですが、ここでは割愛します。

まとめ

CygwinからWin32版GVimを起動する際の注意点を述べましたが、GVimに限らず、他のWin32アプリを実行する際にも参考になるでしょう。