indentLineプラグインを導入するとYAMLの構文強調がおかしくなる

Vimにはインデント階層を可視化してくれる indentLine というプラグインがあります。 このプラグイン、便利なので僕も使っているのですが、ひとつ問題点があります。このプラグインを導入すると、YAMLの構文強調がおかしくなるのです。

Fig. 1 indentLine無効時

f:id:mrk21:20140625182816p:plain

Fig. 2 indentLine有効時

f:id:mrk21:20140625182825p:plain

ふーむ、どうやらインデントされたブロックマッピングのキー部分がハイライトされてないですね。これはどういうことだろうと、indentLineのソースを読むと、after/plugin/indentLine.vimsyntax match ...部分が悪さをしていることが分かりました。

Fig. 3 after/plugin/indentLine.vim, 81行目

execute 'syntax match IndentLine /\%(^\s\+\)\@<=\%'.i.pattern.' / containedin=ALL conceal cchar=' . g:indentLine_char

つまり、indentLineの上記コードにおいて、/^\s\+/を喰っちゃってるので、ハイライトがされなくなったわけです。 この問題を解決するためには、ブロックマッピングのマッチングルールを変更する必要があるわけですが、どうやってやろう…

YAMLの構文強調・インデントを行うVimプラグインを作ってみた

はじめに

Vim標準のYAMLのインデントルールが気に入らなかったので、Vim script の勉強がてらにプラグインを作ってみました。 YAMLの構文は、YAML Ain’t Markup Language (YAML™) Version 1.2 を参考にしています。プラグインのソースは、 Github: mrk21/yaml-vim にあります。

プラグインの概要

このプラグインを導入することによって、次のインデントスタイルが可能になります。

---
# ブロックシーケンスとブロックマッピングを同じラインに書く
- name: create file
  command: >
    creates=/path/to/file
    touch /path/to/file

# ブロックシーケンスの"-"の後にスペースを入れないで改行
-
  name: install packages
  apt: name={{item}} state=present
  with_items:
    - package1
    - package2
---
# トップドメインのブロックスカラー
>
  ブロックスカラーの値

また、次の構文強調が追加されています。

  • ブロックスカラー: >, |
  • 後にスペースが存在しないブロックシーケンス: -

使い方

.vimrcプラグインをロードする設定を記述するだけです。

NeoBundle 'mrk21/yaml-vim'

最後に

Vimの構文強調は正規表現で単語を抜き出して行うので、こういったインデントによって意味合いが変わる言語は難しいですね。例えば、ブロックスカラーの値の部分のハイライトはおそらく無理でしょう。