Vim でjsonファイルを開いた時にチラつくダブルクォーテーションを何とかしたお話。
Vimでjsonファイル編集時にダブルクォートが非表示になり、カーソル行だけダブルクォートが表示される(表示される分だけテキスト位置がズレる)現象が。

こんな感じ。ぶっちゃけかなりイライラする。
んーvim-jsonも入れてないけど何でだろ?ということで /Applications/MacVim.app/Contents/Resources/vim/runtime/syntax/json.vim を確認してみた所、
" NOTE that for the concealing to work your conceallevel should be set to 2 " Syntax: Strings " Separated into a match and region because a region by itself is always greedy syn match jsonStringMatch /"\([^"]\|\\\"\)\+"\ze[[:blank:]\r\n]*[,}\]]/ contains=jsonString if has('conceal') > syn region jsonString oneline matchgroup=jsonQuote start=/"/ skip=/\\\\\|\\"/ end=/"/ concealends contains=jsonEscape contained else > syn region jsonString oneline matchgroup=jsonQuote start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=jsonEscape contained endif
とドンピシャな箇所がありまして、:help conceallevel してフムフムとしながら.vimrcに
autocmd Filetype json setl conceallevel=0
と書いたら解決した。
MacVimでは、Custom Version 7.4 (KaoriYa 20141204) にアップデートしたタイミングでjson.vimが更新されていた。
Conceal機能
concealは隠す、秘密にするの意。
要はjsonでいうダブルクォーテーションのような、構文としては必要だが視認性を妨げるものを非表示にできる機能のようだ。
後述の concealcursor や conceallevel で挙動を変更可能。
concealcursor
カーソル行のテキストを Conceal表示するモードをセットする
| concealcursor | 説明 |
|---|---|
| n | ノーマルモード |
| v | ビジュアルモード |
| i | 挿入モード |
| c | コマンドライン編集 |
試しに :set concealcursorしてみたらiがセットされていた。
conceallevel
| conceallevel | 説明 |
|---|---|
| 0 | 通常通り表示(デフォルト) |
| 1 | conceal対象のテキストは代理文字(初期設定はスペース)に置換される |
| 2 | conceal対象のテキストは非表示になる |
| 3 | conceal対象のテキストは完全に非表示 |
conceallevel=0 が従来通りの表示。
conceallevel=2 だとカーソル行がダブルクォーテーション分だけずれて見づらい。
conceallevel=1 はスペースで置き換わっているため、ズレがなくカレント行にした時のみダブルクォーテーションが表示され、スッキリしていて見易いので最終的にはこっちを使うことにした。
まとめ
最終的には以下の設定にして様子見することにした。
if has('conceal') set conceallevel=1 concealcursor= endif
本来は conceallevel=0 concealcursor= の為、今回のMacVimのアップデートで同症状が出る人は限られると思う。
自分の環境では別のpluginの設定箇所で set conceallevel=2 concealcursor=i をしていたのでトラブルに見舞われた。
もし同様の症状が起きていたら、どこかでconceallevelを変更してないか確認してみるといいですね。