memo

2011-01-14

vim に reST の sourcecode ディレクティブ内をいい感じに色付けして欲しい

blikit では reStructuredText (docutils) を一部拡張していて、 その一つに中身を pygments でシンタックスハイライトしてくれる sourcecode ディレクティブがある。

んで、 reST なファイルは当然 vim で編集するわけで、 vim でもいい感じにシンタックスハイライトしてくれるとうれしい。

ということで、 syntax/rst.vim を拡張する。

~/.vim/syntax/rst.vim:

" use another syntax inside sourcecode directive
let s:sourcecode_syntaxes = [
      \ ['vim', 'vim'],
      \ ['sh', '\(ba\)\?sh'],
      \ ['python', 'python'],
\ ]
let b:orig_current_syntax = b:current_syntax

for [s:syn_name, s:syn_pattern] in s:sourcecode_syntaxes
  unlet! b:current_syntax

  let s:source_name = 'rstSource' . substitute(s:syn_name, '^.', '\u&', '')
  let s:inc_name = s:syn_name . 'Syntax'

  execute 'syn include @' . s:inc_name . ' syntax/' . s:syn_name . '.vim'
  execute 'syn region ' . s:source_name . ' contained matchgroup=rstDirective'
      \ . ' start=/sourcecode::\s*' . s:syn_pattern . '/'
      \ . ' skip=/^$/'
      \ . ' end=/^\s\@!/ contains=@' . s:inc_name
  execute 'syn cluster rstDirectives add=' . s:source_name
endfor

let b:current_syntax = b:orig_current_syntax
unlet b:orig_current_syntax

なんか若干色がおかしいところがある気がするけど、大体動いてるからまあいいか。