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
letstart='^\s*hook_\%('.
\ 'add\|source\|post_source\|post_update'.
\ '\)\s*=\s*%s'call SyntaxRange#Include(printf(start,"'''"),"'''",'vim','')call SyntaxRange#Include(printf(start,'"""'),'"""','vim','')endfunction
元々のプラグインでは問題が出たのでforkして修正したのがこちらを使うと良い。
修正点
元々のSyntaxRangeでは、SyntaxRange#Include
するたびに、すでに読み込み済みのシンタックスファイルも
unlet b:current_syntax
syntax include @vim syntax/vim.vim
して再読込している。vimのシンタックスファイルを再読込すると
runtime/syntax/vim.vim
synsync linecont "^\s\+\\"
の部分で「E403: 構文同期: 連続行パターンが2度指定されました」というエラーが出てしまう。
なので、読み込み済みのシンタックスファイルは読み込まないようにする処理を追加する必要がある。
また、SyntaxRange#Include
で渡した文字列をprintf
で
start="%s"end="%s"
のように直接当てはめているので、文字列に"を含む場合はおかしくなるので、"をescapeしてやる必要がある。
オリジナルとのdiff