ゆず日記

戦う Vimmer 兼 Dvorakユーザ 兼 Kinesisユーザ 兼 おぺらー が戦わないブログ

Vim でjsonファイルを開いた時にチラつくダブルクォーテーションを何とかしたお話。

Vimjsonファイル編集時にダブルクォートが非表示になり、カーソル行だけダブルクォートが表示される(表示される分だけテキスト位置がズレる)現象が。

f:id:Yuzuemon:20150115034524p:plain

こんな感じ。ぶっちゃけかなりイライラする。

んー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でいうダブルクォーテーションのような、構文としては必要だが視認性を妨げるものを非表示にできる機能のようだ。

後述の concealcursorconceallevel で挙動を変更可能。

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を変更してないか確認してみるといいですね。