LoginSignup
5
4

More than 5 years have passed since last update.

dein.vimのtomlのhook_*部分をシンタックスハイライトさせる

Last updated at Posted at 2017-05-20

image.png
こんな感じにする。

SyntaxRangeというプラグインを使うと、ある範囲のシンタックスハイライトを違うファイルタイプのシンタックスでハイライトにできる。

call SyntaxRange#Include("hook_add = '''", "'''", 'vim', '')

hook_add = '''から始まって'''で終わる範囲をvimのシンタックスでハイライトできる。最後の引数は始まりと終わり部分の文字列のハイライトグループ(NonTextなど)の設定。ここでは空にしているので、なにも設定しない。

これを他のhook_*とか"""で囲んだときにも対応させて、dein*.tomlのファイルを開いたときに実行するように設定するとこんな感じ。

augroup MyVimrc
    autocmd!
augroup END

autocmd MyVimrc BufNewFile,BufRead dein*.toml call s:syntax_range_dein()

function! s:syntax_range_dein() abort
  let start = '^\s*hook_\%('.
  \           'add\|source\|post_source\|post_update'.
  \           '\)\s*=\s*%s'

  call SyntaxRange#Include(printf(start, "'''"), "'''", 'vim', '')
  call SyntaxRange#Include(printf(start, '"""'), '"""', 'vim', '')
endfunction

プラグインの修正

この修正は本家に取り込まれました。

元々のSyntaxRangeでは、SyntaxRange#Includeするたびに、すでに読み込み済みのシンタックスファイルも

unlet b:current_syntax
syntax include @vim syntax/vim.vim

して再読込している。vimのシンタックスファイルを再読込すると

runtime/syntax/vim.vim
syn sync linecont "^\s\+\\"

の部分で「E403: 構文同期: 連続行パターンが2度指定されました」というエラーが出てしまう。
なので、読み込み済みのシンタックスファイルは読み込まないようにする処理を追加する必要がある 読み込まないようにすると再度ファイルを開いたときシンタックスを効かせたい範囲のシンタックスが消えてしまったので、例外をcatchしてもみ消すようにした。

また、SyntaxRange#Includeで渡した文字列をprintf

start="%s" end="%s"

のように直接当てはめているので、文字列に"を含む場合はおかしくなるので、"をescapeしてやる必要がある。

オリジナルとのdiff

5
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4