"syn-include"
なんて物があるのを教えて貰いました。:he syn-include
9. Including syntax files *:syn-include* *E397*
It is often useful for one language's syntax file to include a syntax file for
a related language. Depending on the exact relationship, this can be done in
two different ways:
- If top-level syntax items in the included syntax file are to be
allowed at the top level in the including syntax, you can simply use
the |:runtime| command: >
" In cpp.vim:
:runtime! syntax/c.vim
:unlet b:current_syntax
< - If top-level syntax items in the included syntax file are to be
contained within a region in the including syntax, you can use the
":syntax include" command:
:sy[ntax] include [@{grouplist-name}] {file-name}
All syntax items declared in the included file will have the
"contained" flag added. In addition, if a group list is specified,
all top-level syntax items in the included file will be added to
that list. >
" In perl.vim:
:syntax include @Pod <sfile>:p:h/pod.vim
:syntax region perlPOD start="^=head" end="^=cut" contains=@Pod
<
When {file-name} is an absolute path (starts with "/", "c:", "$VAR"
or "<sfile>") that file is sourced. When it is a relative path
(e.g., "syntax/pod.vim") the file is searched for in 'runtimepath'.
All matching files are loaded. Using a relative path is
recommended, because it allows a user to replace the included file
with his own version, without replacing the file that does the ":syn
include".
知らんかった...これを使えばPerlのPodだけ別のsyntaxファイルから適用出来るといった物。
これは凄い!
つまりはregionだけ決められれば、その部分に言語毎のsyntaxが適用出来る事になる。試しに、はてなのスーパーPre記法に色を付けられる様にしてみた。
ベースはmotemenさんのhatena-vim
motemen's hatena-vim at master - GitHubこのVim scripts for posting/updating hatena diary/group
http://github.com/motemen/hatena-vim/tree/master
syntax/hatena.vim
の最下行に以下のコードを貼り付ける。
" append to syntax/hatena.vim
function SyntaxSuperPre()
let lnum = 1
let lmax = line("$")
let mx = '^>|\(.*\)|$'
while lnum <= lmax
let curline = getline(lnum)
if curline =~ mx
let lang = substitute(curline, mx, '\1', '')
exec 'runtime! syntax/'.lang.'.vim'
unlet b:current_syntax
let syntaxfile = fnameescape(substitute(globpath(&rtp, 'syntax/'.lang.'.vim'), '[\r\n].*$', '', ''))
if len(syntaxfile)
exec 'syntax include @inline_'.lang.' '.syntaxfile
exec 'syn region hatenaSuperPre matchgroup=hatenaBlockDelimiter start=+^>|'.lang.'|$+ end=+^||<$+ contains=@inline_'.lang
endif
end
let lnum = lnum + 1
endwhile
" workaround for perl
syn cluster inline_perl remove=perlFunctionName
endfunction
call SyntaxSuperPre()
適当なので使わないで下さいperlFunctionNameはregionが広すぎるので無効にしてます
すると...
おーーー!出ました。
続きはこの辺でやっていきます。出来上がったらmotemenさんにmergeして貰うのも良いかも。
ちなみに、filetype適用時にロードしているので、pre記法の言語を編集途中で変更したり、新しくスーパーPre記法を追加したりするとsyntaxが適用されなくなります。ま、これからですな。
syn-include++