Edited at

Vimで特定のファイルだけシンタックスハイライトが効かなくなる

More than 1 year has passed since last update.


はじめに

Vimで、ある特定のファイルだけシンタックスハイライトが効かなくなることがあるが、これは~/.vim/view以下に保存されている、バッファの表示情報がおかしくなっているから。


現象

いま、~/temp/test.cppをvimで開いたとする。いつもならfiletype=cppとなり、勝手にシンタックスハイライトされるはずだが、なぜか以下のようにハイライトされなくなってしまった。

image.png

:set filetype?と聞いてみても「filetype=」とつれない返事。

しかし、名前をつけて保存(:w test2.cpp)して、それを開く(:o test2.cpp)するとちゃんとシンタックスハイライトされる。

image.png

ファイルを移動しても同様。すなわち~/temp.test.cppを開いたときだけファイルタイプが認識されず、シンタックスハイライトがされない。


原因

これは、バッファの表示情報を保存しているファイルがおかしくなっているから。表示がおかしくなったファイルを開いた状態で、

:verbose :setlocal filetype?

を実行してみる。すると、

  filetype=

Last set from ~/.vim/view/~=+temp=+test.cpp=

と表示される。これは、現在ファイルタイプは設定されておらず(filetype=)、その設定は~/.vim/view/~=+temp=+test.cpp=というファイルによって行われたことを示す。この~/.vim/view以下のファイルは、バッファの表示状態(カーソル位置やフォルディング状態等)を保存するファイルだが、たまにそれがおかしくなるようだ。

さっそくこのファイル~/.vim/view/~=+temp=+test.cpp=を開いてみると、

if &filetype != ''

setlocal filetype=
endif
(snip)
if &syntax != ''
setlocal syntax=
endif

という記述がある。つまり、ファイルタイプやシンタックス情報をわざわざ上書きしている。これらの行を消してから再度先ほどのファイルを開いて見る(この表示情報保存ファイルを消してしまっても良い)。

image.png

正しくシンタックスハイライトされた。もちろん真面目に:set filetype=cppとかしても良い。

また、稀なケースとして、ファイルタイプは正しく認識されているのに、シンタックスハイライトだけされない、ということがあるかもしれない。つまり:set filetype?cppを返すのに、シンタックスハイライトされない場合がある。これは表示情報ファイルが

if &filetype != 'cpp'

setlocal filetype=cpp
endif
(snip)
if &syntax != ''
setlocal syntax=
endif

と、ファイルタイプだけ正しく設定され、シンタックスが設定されていない場合に起きる。この場合もこのファイルを修正するか、当該バッファで:set filetype=cppすれば治る。


まとめ

Vimで、ある特定のファイルだけ表示がおかしくなったら、それは~/.vim/view以下に保存されている表示情報がおかしくなっているから。Vim側でも治せるが、おそらく当該ファイルを消してしまうのが手っ取り早い。ちなみにこの現象、Macのターミナル上のVimでたまに起きるんだけど、未だ原因不明。あまり他に同様なことが起きている人がいないので、僕の.vimrcが悪いのかも。