rcmdnk's blog
Last update

vim 7 GE-PACKT: vi improved

CygwinでVimを使っててたまに終了時にviminfoに書き込み出来ません と言われる事があって、取り敢えず無視してましたが WindowsとCygwinで生成されるファイルの初期のパーミッションだの調べてたら なんとなく理由が分かったと思うのでその対処法。

Windowsによって作られるviminfo

色々作業しようとしてCygwinの中だけで済めばいいのですが、 ちょっとしたテキストファイルとかをExplorerから開きたいとき、 ただ見るだけでもVimが便利なのでWindows用のVimを別途インストールして使っています。

この際に同じホームディレクトリを使うので、設定ファイルも一緒です。 で、これが問題でした。

Cygwinの中だけでVimを使っている場合は、 最初に作られるviminfoファイルもユーザー所有になるので問題ありません。

ただ、WindowsにVimを別途インストールしていて、 そちらで作業してしまうと、viminfoファイルがCygwin外のソフトに書き換えられ 所有者も変更されてしまい、 (再生成される様な形になる?)、 この際に生成されるviminfoファイルはCygwinから見るとAdministrators所有になっていて 書き込み不可の状態になります。

ちょっと考えれば分かりそうなものですが、 Cygwinが立ち上がってる時はディレクトリ移動もコマンドラインのが楽なので 適当なファイルもCygwinから開いて、 Windows側のVimを使う機会が少なかったので、なんか突然変更されててよくわからない、 と今まで思ってましたが、殆ど大丈夫だったりするので、取り敢えず無視してました、、、

対処法

要するに、同じviminfoを使うからいけないわけで、 別々のviminfoに書き込むように設定するだけです。

$HOME.vimrc_vimrcを作れば、Cygwinでは前者、WindowsのVimでは 後者を使う様に出来ますが、 同じ様なファイルを2つ作るのもあれなので、 今回はCygwin内ではVim、外ではGVimを使う様にして GVimかどうかでviminfoを分けるようにしました。

Windows以外では共通にしておいた方が何かと便利なので、 WindowsでGUIの場合だけ違うファイルになるように

.vimrc
1
2
3
4
5
if has("gui_running") && ( has("win32unix") || has ("win64unix") || has("win32") || has ("win64") )
  set viminfo+=n~/.vim/gviminfo
else
  set viminfo+=n~/.vim/viminfo
endif

この様な感じで設定。

追記: 2013/12/07

久々に色々見返してたらものすごく馬鹿なことをしてたことをここに発見したので追記。。。

上みたいな面倒なことやらず、単に

1
2
3
4
5
if (has("win32") || has ("win64") )
set viminfo+=n~/.vim/viminfo_win
else
set viminfo+=n~/.vim/viminfo
endif

で。win32unix等がCygwin、win32等がWindows側なのでWindows側の時だけviminfo_winへ。 GUIかどうかで分けなくても良いし、余計な事を済まなくて済みます。

この頃には既にwin32unixだけでCygwinだけのために設定してた物もあるので、 違いを知らなかった訳ではないと信じたいとこですが、なんか酷い話、自分のことですが。

従って下も全然必要の無いこと。

追記ここまで

GVimの方の設定を.gvimrcの中で viminfoを上書きするような形で書いてもOK。 この場合、既にn...のファイル指定を与えているので同じ様に+=は使えず 次の様な感じにしなくてはいけません。

.vimrc
1
set viminfo+=n~/.vim/viminfo
.gvimrc
1
2
3
4
5
if has("win32unix") || has ("win64unix") || has("win32") || has ("win64")
  viminfo='100,<{% comment %}>{% endcomment %}50,s10,h,n~/.vim/viminfo
  "set viminfo-=n~/.vim/viminfo
  "set viminfo+=n~/.vim/gviminfo
endif

こんな感じで.gvimrcの中で全てのオプションを設定し直すか 一度ファイル指定を除いてから再び加える必要があります。

ややこしいので最初の様に.vimrc内で閉じてしまう方が分かりやすいかと。

has("gui_running")を使うとVimを起動してから:guiコマンドで GVimになった時に設定が読み込まれない 1らしいのですが、 今回の件に限ってみれば問題ありません。 (むしろCygwin内でのVimGVim であればむしろ読み込んでほしくない設定でもあります。)

Sponsored Links
Sponsored Links

« Vimインストール CygwinでCan't fork()とかのエラーが出た時の対処法 »

}