| " Vim syntax file |
| " Language: PRQL |
| " Maintainer: vanillajonathan |
| " Last Change: 2025-03-07 |
| " |
| " https://prql-lang.org/ |
| " https://github.com/PRQL/prql |
| |
| " quit when a syntax file was already loaded. |
| if exists("b:current_syntax") |
| finish |
| endif |
| |
| " We need nocompatible mode in order to continue lines with backslashes. |
| " Original setting will be restored. |
| let s:cpo_save = &cpo |
| set cpo&vim |
| |
| syn keyword prqlBoolean false true |
| syn keyword prqlSelf this that |
| syn keyword prqlStatement null |
| syn keyword prqlConditional case |
| syn keyword prqlStatement prql let type alias in |
| syn keyword prqlRepeat loop |
| syn match prqlOperator display "\%(+\|-\|/\|*\|=\|\^\|&\||\|!\|>\|<\|%\|\~\)=\?" |
| syn match prqlOperator display "&&\|||" |
| syn keyword prqlInclude module |
| |
| " Annotations |
| syn match prqlAnnotation "@" display contained |
| syn match prqlAnnotationName "@\s*{\h\%(\w\|=\)*}" display contains=prqlAnnotation |
| |
| syn match prqlFunction "\h\w*" display contained |
| |
| syn match prqlComment "#.*$" contains=prqlTodo,@Spell |
| syn keyword prqlTodo FIXME NOTE TODO XXX contained |
| |
| " Triple-quoted strings can contain doctests. |
| syn region prqlString matchgroup=prqlQuotes |
| \ start=+\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" |
| \ contains=prqlEscape,@Spell |
| syn region prqlString matchgroup=prqlTripleQuotes |
| \ start=+\z('''\|"""\)+ end="\z1" keepend |
| \ contains=prqlEscape,prqlSpaceError,prqlDoctest,@Spell |
| syn region prqlFString matchgroup=prqlQuotes |
| \ start=+[f]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" |
| \ contains=prqlEscape,@Spell |
| syn region prqlFString matchgroup=prqlTripleQuotes |
| \ start=+f\z('''\|"""\)+ end="\z1" keepend |
| \ contains=prqlEscape,prqlSpaceError,prqlDoctest,@Spell |
| syn region prqlRString matchgroup=prqlQuotes |
| \ start=+r\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" |
| \ contains=@Spell |
| syn region prqlRString matchgroup=prqlTripleQuotes |
| \ start=+r\z('''\|"""\)+ end="\z1" keepend |
| \ contains=prqlSpaceError,prqlDoctest,@Spell |
| syn region prqlSString matchgroup=prqlQuotes |
| \ start=+s\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" |
| \ contains=@Spell |
| syn region prqlSString matchgroup=prqlTripleQuotes |
| \ start=+s\z('''\|"""\)+ end="\z1" keepend |
| \ contains=prqlSpaceError,prqlDoctest,@Spell |
| |
| syn match prqlEscape +\\[bfnrt'"\\]+ contained |
| syn match prqlEscape "\\\o\{1,3}" contained |
| syn match prqlEscape "\\x\x\{2}" contained |
| syn match prqlEscape "\%(\\u\x\{1,6}\)" contained |
| syn match prqlEscape "\\$" |
| |
| " It is very important to understand all details before changing the |
| " regular expressions below or their order. |
| " The word boundaries are *not* the floating-point number boundaries |
| " because of a possible leading or trailing decimal point. |
| " The expressions below ensure that all valid number literals are |
| " highlighted, and invalid number literals are not. For example, |
| " |
| " - a decimal point in '4.' at the end of a line is highlighted, |
| " - a second dot in 1.0.0 is not highlighted, |
| " - 08 is not highlighted, |
| " - 08e0 or 08j are highlighted, |
| " |
| if !exists("prql_no_number_highlight") |
| " numbers (including complex) |
| syn match prqlNumber "\<0[oO]\%(_\=\o\)\+\>" |
| syn match prqlNumber "\<0[xX]\%(_\=\x\)\+\>" |
| syn match prqlNumber "\<0[bB]\%(_\=[01]\)\+\>" |
| syn match prqlNumber "\<\%([1-9]\%(_\=\d\)*\|0\+\%(_\=0\)*\)\>" |
| syn match prqlNumber "\<\d\%(_\=\d\)*[jJ]\>" |
| syn match prqlNumber "\<\d\%(_\=\d\)*[eE][+-]\=\d\%(_\=\d\)*[jJ]\=\>" |
| syn match prqlNumber |
| \ "\<\d\%(_\=\d\)*\.\%([eE][+-]\=\d\%(_\=\d\)*\)\=[jJ]\=\%(\W\|$\)\@=" |
| syn match prqlNumber |
| \ "\%(^\|\W\)\zs\%(\d\%(_\=\d\)*\)\=\.\d\%(_\=\d\)*\%([eE][+-]\=\d\%(_\=\d\)*\)\=[jJ]\=\>" |
| endif |
| |
| " https://prql-lang.org/book/reference/stdlib/transforms/ |
| " |
| " PRQL built-in functions are in alphabetical order. |
| " |
| |
| " Built-in functions |
| syn keyword prqlBuiltin aggregate derive filter from group join select sort take window |
| |
| " Built-in types |
| syn keyword prqlType bool float int int8 int16 int32 int64 int128 text date time timestamp |
| |
| " avoid highlighting attributes as builtins |
| syn match prqlAttribute /\.\h\w*/hs=s+1 |
| \ contains=ALLBUT,prqlBuiltin,prqlFunction |
| \ transparent |
| |
| if exists("prql_space_error_highlight") |
| " trailing whitespace |
| syn match prqlSpaceError display excludenl "\s\+$" |
| " mixed tabs and spaces |
| syn match prqlSpaceError display " \+\t" |
| syn match prqlSpaceError display "\t\+ " |
| endif |
| |
| " Do not spell doctests inside strings. |
| " Notice that the end of a string, either ''', or """, will end the contained |
| " doctest too. Thus, we do *not* need to have it as an end pattern. |
| if !exists("prql_no_doctest_highlight") |
| if !exists("prql_no_doctest_code_highlight") |
| syn region prqlDoctest |
| \ start="^\s*>>>\s" end="^\s*$" |
| \ contained contains=ALLBUT,prqlDoctest,prqlFunction,@Spell |
| syn region prqlDoctestValue |
| \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$" |
| \ contained |
| else |
| syn region prqlDoctest |
| \ start="^\s*>>>" end="^\s*$" |
| \ contained contains=@NoSpell |
| endif |
| endif |
| |
| " The default highlight links. Can be overridden later. |
| hi def link prqlBoolean Boolean |
| hi def link prqlStatement Statement |
| hi def link prqlType Type |
| hi def link prqlConditional Conditional |
| hi def link prqlRepeat Repeat |
| hi def link prqlOperator Operator |
| hi def link prqlInclude Include |
| hi def link prqlAnnotation Define |
| hi def link prqlAnnotationName Function |
| hi def link prqlFunction Function |
| hi def link prqlComment Comment |
| hi def link prqlTodo Todo |
| hi def link prqlSelf Constant |
| hi def link prqlString String |
| hi def link prqlFString String |
| hi def link prqlRString String |
| hi def link prqlSString String |
| hi def link prqlQuotes String |
| hi def link prqlTripleQuotes prqlQuotes |
| hi def link prqlEscape Special |
| if !exists("prql_no_number_highlight") |
| hi def link prqlNumber Number |
| endif |
| if !exists("prql_no_builtin_highlight") |
| hi def link prqlBuiltin Function |
| endif |
| if exists("prql_space_error_highlight") |
| hi def link prqlSpaceError Error |
| endif |
| if !exists("prql_no_doctest_highlight") |
| hi def link prqlDoctest Special |
| hi def link prqlDoctestValue Define |
| endif |
| |
| let b:current_syntax = "prql" |
| |
| let &cpo = s:cpo_save |
| unlet s:cpo_save |
| |
| " vim:set sw=2 sts=2 ts=8 noet: |