summaryrefslogtreecommitdiffstats
path: root/runtime/syntax/chordpro.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/syntax/chordpro.vim')
-rw-r--r--runtime/syntax/chordpro.vim173
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