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