diff options
Diffstat (limited to 'runtime/syntax/chordpro.vim')
-rw-r--r-- | runtime/syntax/chordpro.vim | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/runtime/syntax/chordpro.vim b/runtime/syntax/chordpro.vim new file mode 100644 index 0000000..41a0a1e --- /dev/null +++ b/runtime/syntax/chordpro.vim @@ -0,0 +1,173 @@ +" Vim syntax file +" Language: ChordPro 6 (https://www.chordpro.org) +" Maintainer: Niels Bo Andersen <niels@niboan.dk> +" Last Change: 2022-04-15 + +" Quit when a syntax file was already loaded +if exists("b:current_syntax") + finish +endif + +let s:cpo_save = &cpo +set cpo&vim + +syn case ignore + +" Include embedded abc syntax +syn include @Abc syntax/abc.vim + +" Lilypond and Pango syntaxes could be embedded as well, but they are not +" available in the distribution. + +" Directives without arguments +syn keyword chordproDirective contained nextgroup=chordproConditional + \ new_song ns + \ start_of_chorus soc + \ chorus + \ start_of_verse sov + \ start_of_bridge sob + \ start_of_tab sot + \ start_of_grid sog + \ start_of_abc + \ start_of_ly + \ end_of_chorus eoc + \ end_of_verse eov + \ end_of_bridge eob + \ end_of_tab eot + \ end_of_grid eog + \ end_of_abc + \ end_of_ly + \ new_page np + \ new_physical_page npp + \ column_break cb + \ grid g + \ no_grid ng + \ transpose + \ chordfont cf chordsize cs chordcolour + \ footerfont footersize footercolour + \ gridfont gridsize gridcolour + \ tabfont tabsize tabcolour + \ tocfont tocsize toccolour + \ textfont tf textsize ts textcolour + \ titlefont titlesize titlecolour + +" Directives with arguments. Some directives are in both groups, as they can +" be used both with and without arguments +syn keyword chordproDirWithArg contained nextgroup=chordproConditional + \ title t + \ subtitle st + \ sorttitle + \ artist + \ composer + \ lyricist + \ arranger + \ copyright + \ album + \ year + \ key + \ time + \ tempo + \ duration + \ capo + \ comment c + \ highlight + \ comment_italic ci + \ comment_box cb + \ image + \ start_of_chorus soc + \ chorus + \ start_of_verse sov + \ start_of_bridge sob + \ start_of_tab sot + \ start_of_grid sog + \ start_of_abc + \ start_of_ly + \ define + \ chord + \ transpose + \ chordfont cf chordsize cs chordcolour + \ footerfont footersize footercolour + \ gridfont gridsize gridcolour + \ tabfont tabsize tabcolour + \ tocfont tocsize toccolour + \ textfont tf textsize ts textcolour + \ titlefont titlesize titlecolour + \ pagetype + \ titles + \ columns col + +syn keyword chordproMetaKeyword contained meta +syn keyword chordproMetadata contained title sorttitle subtitle artist composer lyricist arranger copyright album year key time tempo duration capo +syn keyword chordproStandardMetadata contained songindex page pages pagerange today tuning instrument user +syn match chordproStandardMetadata /instrument\.type/ contained +syn match chordproStandardMetadata /instrument\.description/ contained +syn match chordproStandardMetadata /user\.name/ contained +syn match chordproStandardMetadata /user\.fullname/ contained + +syn keyword chordproDefineKeyword contained frets fingers +syn match chordproDefineKeyword /base-fret/ contained + +syn match chordproArgumentsNumber /\d\+/ contained + +syn match chordproCustom /x_\w\+/ contained + +syn match chordproDirMatch /{\w\+\(-\w\+\)\?}/ contains=chordproDirective contained transparent +syn match chordproDirArgMatch /{\w\+\(-\w\+\)\?[: ]/ contains=chordproDirWithArg contained transparent +syn match chordproMetaMatch /{meta\(-\w\+\)\?[: ]\+\w\+/ contains=chordproMetaKeyword,chordproMetadata contained transparent +syn match chordproCustomMatch /{x_\w\+\(-\w\+\)\?[: ]/ contains=chordproCustom contained transparent + +syn match chordproConditional /-\w\+/ contained + +syn match chordproMetaDataOperator /[=|]/ contained +syn match chordproMetaDataValue /%{\w*/ contains=chordproMetaData,chordproStandardMetadata contained transparent +" Handles nested metadata tags, but the end of the containing chordproTag is +" not highlighted correctly, if there are more than two levels of nesting +syn region chordproMetaDataTag start=/%{\w*/ skip=/%{[^}]*}/ end=/}/ contains=chordproMetaDataValue,chordproMetaDataOperator,chordproMetadataTag contained + +syn region chordproArguments start=/{\w\+\(-\w\+\)\?[: ]/hs=e+1 skip=/%{[^}]*}/ end=/}/he=s-1 contains=chordproDirArgMatch,chordproArgumentsNumber,chordproMetaDataTag contained +syn region chordproArguments start=/{\(define\|chord\)\(-\w\+\)\?[: ]/hs=e+1 end=/}/he=s-1 contains=chordproDirArgMatch,chordproDefineKeyword,chordproArgumentsNumber contained +syn region chordproArguments start=/{meta\(-\w\+\)\?[: ]/hs=e+1 skip=/%{[^}]*}/ end=/}/he=s-1 contains=chordproMetaMatch,chordproMetaDataTag contained +syn region chordproArguments start=/{x_\w\+\(-\w\+\)\?[: ]/hs=e+1 end=/}/he=s-1 contains=chordproCustomMatch contained + +syn region chordproTag start=/{/ skip=/%{[^}]*}/ end=/}/ contains=chordproDirMatch,chordproArguments oneline + +syn region chordproChord matchgroup=chordproBracket start=/\[/ end=/]/ oneline + +syn region chordproAnnotation matchgroup=chordproBracket start=/\[\*/ end=/]/ oneline + +syn region chordproTab start=/{start_of_tab\(-\w\+\)\?\([: ].\+\)\?}\|{sot\(-\w\+\)\?\([: ].\+\)\?}/hs=e+1 end=/{end_of_tab}\|{eot}/me=s-1 contains=chordproTag,chordproComment keepend + +syn region chordproChorus start=/{start_of_chorus\(-\w\+\)\?\([: ].\+\)\?}\|{soc\(-\w\+\)\?\([: ].\+\)\?}/hs=e+1 end=/{end_of_chorus}\|{eoc}/me=s-1 contains=chordproTag,chordproChord,chordproAnnotation,chordproComment keepend + +syn region chordproBridge start=/{start_of_bridge\(-\w\+\)\?\([: ].\+\)\?}\|{sob\(-\w\+\)\?\([: ].\+\)\?}/hs=e+1 end=/{end_of_bridge}\|{eob}/me=s-1 contains=chordproTag,chordproChord,chordproAnnotation,chordproComment keepend + +syn region chordproAbc start=/{start_of_abc\(-\w\+\)\?\([: ].\+\)\?}/hs=e+1 end=/{end_of_abc}/me=s-1 contains=chordproTag,@Abc keepend + +syn match chordproComment /^#.*/ + +" Define the default highlighting. +hi def link chordproDirective Statement +hi def link chordproDirWithArg Statement +hi def link chordproConditional Statement +hi def link chordproCustom Statement +hi def link chordproMetaKeyword Statement +hi def link chordproMetaDataOperator Operator +hi def link chordproMetaDataTag Function +hi def link chordproArguments Special +hi def link chordproArgumentsNumber Number +hi def link chordproChord Type +hi def link chordproAnnotation Identifier +hi def link chordproTag Constant +hi def link chordproTab PreProc +hi def link chordproComment Comment +hi def link chordproBracket Constant +hi def link chordproDefineKeyword Identifier +hi def link chordproMetadata Identifier +hi def link chordproStandardMetadata Identifier +hi def chordproChorus term=bold cterm=bold gui=bold +hi def chordproBridge term=italic cterm=italic gui=italic + +let b:current_syntax = "chordpro" + +let &cpo = s:cpo_save +unlet s:cpo_save |