diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2017-12-30 11:55:40 +0100 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2017-12-30 11:55:40 +0100 |
commit | 17ad302c54063be1871c7f82d75b77e7c595e10c (patch) | |
tree | 67e2645d21baa9e05958dda9693d0f7b3a834929 /syntax | |
parent | 1541356fe1300a6bf2553ff1d7170036e797e07e (diff) | |
download | vim-polyglot-17ad302c54063be1871c7f82d75b77e7c595e10c.tar.gz vim-polyglot-17ad302c54063be1871c7f82d75b77e7c595e10c.zip |
Change python syntax providers, closes #209v3.3.0
Diffstat (limited to 'syntax')
-rw-r--r-- | syntax/python.vim | 671 |
1 files changed, 416 insertions, 255 deletions
diff --git a/syntax/python.vim b/syntax/python.vim index 55f20a36..e3ac9ca1 100644 --- a/syntax/python.vim +++ b/syntax/python.vim @@ -1,326 +1,487 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'python') == -1 -" Vim syntax file -" -" Based on python.vim (from Vim 6.1 distribution) -" by Neil Schemenauer <nas@python.ca> +" For version 5.x: Clear all syntax items +" For versions greater than 6.x: Quit when a syntax file was already loaded +if v:version < 600 + syntax clear +elseif exists('b:current_syntax') + finish +endif + " -" Notes Armin: +" Commands " -" This version of the syntax file works better for 2.x and 3.x without -" having to switch modes. +command! -buffer Python2Syntax let b:python_version_2 = 1 | let &syntax=&syntax +command! -buffer Python3Syntax let b:python_version_2 = 0 | let &syntax=&syntax + +" Enable option if it's not defined +function! s:EnableByDefault(name) + if !exists(a:name) + let {a:name} = 1 + endif +endfunction + +" Check if option is enabled +function! s:Enabled(name) + return exists(a:name) && {a:name} +endfunction + +" Is it Python 2 syntax? +function! s:Python2Syntax() + if exists('b:python_version_2') + return b:python_version_2 + endif + return s:Enabled('g:python_version_2') +endfunction + " -" Thanks: +" Default options " -" Jeroen Ruigrok van der Werven -" for the idea of highlighting for erroneous operators -" Pedro Algarvio -" for the patch to enable spell checking only for the right spots -" (strings and comments) + +call s:EnableByDefault('g:python_slow_sync') +call s:EnableByDefault('g:python_highlight_builtin_funcs_kwarg') + +if s:Enabled('g:python_highlight_all') + call s:EnableByDefault('g:python_highlight_builtins') + if s:Enabled('g:python_highlight_builtins') + call s:EnableByDefault('g:python_highlight_builtin_objs') + call s:EnableByDefault('g:python_highlight_builtin_funcs') + endif + call s:EnableByDefault('g:python_highlight_exceptions') + call s:EnableByDefault('g:python_highlight_string_formatting') + call s:EnableByDefault('g:python_highlight_string_format') + call s:EnableByDefault('g:python_highlight_string_templates') + call s:EnableByDefault('g:python_highlight_indent_errors') + call s:EnableByDefault('g:python_highlight_space_errors') + call s:EnableByDefault('g:python_highlight_doctests') + call s:EnableByDefault('g:python_print_as_function') + call s:EnableByDefault('g:python_highlight_class_vars') + call s:EnableByDefault('g:python_highlight_operators') +endif " -" Options: +" Keywords " -" For set option do: let OPTION_NAME = 1 -" For clear option do: let OPTION_NAME = 0 + +syn keyword pythonStatement break continue del return pass yield global assert lambda with +syn keyword pythonStatement raise nextgroup=pythonExClass skipwhite +syn keyword pythonStatement def class nextgroup=pythonFunction skipwhite +if s:Enabled('g:python_highlight_class_vars') + syn keyword pythonClassVar self cls +endif +syn keyword pythonRepeat for while +syn keyword pythonConditional if elif else +syn keyword pythonException try except finally +" The standard pyrex.vim unconditionally removes the pythonInclude group, so +" we provide a dummy group here to avoid crashing pyrex.vim. +syn keyword pythonInclude import +syn keyword pythonImport import +syn match pythonRaiseFromStatement '\<from\>' +syn match pythonImport '^\s*\zsfrom\>' + + +if s:Python2Syntax() + if !s:Enabled('g:python_print_as_function') + syn keyword pythonStatement print + endif + syn keyword pythonStatement exec + syn keyword pythonImport as + syn match pythonFunction '[a-zA-Z_][a-zA-Z0-9_]*' display contained +else + syn keyword pythonStatement as nonlocal + syn match pythonStatement '\v\.@<!<await>' + syn match pythonFunction '\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*' display contained + syn match pythonStatement '\<async\s\+def\>' nextgroup=pythonFunction skipwhite + syn match pythonStatement '\<async\s\+with\>' + syn match pythonStatement '\<async\s\+for\>' + syn cluster pythonExpression contains=pythonStatement,pythonRepeat,pythonConditional,pythonOperator,pythonNumber,pythonHexNumber,pythonOctNumber,pythonBinNumber,pythonFloat,pythonString,pythonBytes,pythonBoolean,pythonBuiltinObj,pythonBuiltinFunc +endif + + " -" Option names: +" Operators " -" For highlight builtin functions: -" python_highlight_builtins +syn keyword pythonOperator and in is not or +if s:Enabled('g:python_highlight_operators') + syn match pythonOperator '\V=\|-\|+\|*\|@\|/\|%\|&\||\|^\|~\|<\|>\|!=' +endif +syn match pythonError '[$?]\|\([-+@%&|^~]\)\1\{1,}\|\([=*/<>]\)\2\{2,}\|\([+@/%&|^~<>]\)\3\@![-+*@/%&|^~<>]\|\*\*[*@/%&|^<>]\|=[*@/%&|^<>]\|-[+*@/%&|^~<]\|[<!>]\+=\{2,}\|!\{2,}=\+' display + " -" For highlight standard exceptions: -" python_highlight_exceptions +" Decorators (new in Python 2.4) " -" For highlight string formatting: -" python_highlight_string_formatting + +syn match pythonDecorator '^\s*\zs@' display nextgroup=pythonDottedName skipwhite +if s:Python2Syntax() + syn match pythonDottedName '[a-zA-Z_][a-zA-Z0-9_]*\%(\.[a-zA-Z_][a-zA-Z0-9_]*\)*' display contained +else + syn match pythonDottedName '\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\%(\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\)*' display contained +endif +syn match pythonDot '\.' display containedin=pythonDottedName + " -" For highlight indentation errors: -" python_highlight_indent_errors +" Comments " -" For highlight trailing spaces: -" python_highlight_space_errors + +syn match pythonComment '#.*$' display contains=pythonTodo,@Spell +if !s:Enabled('g:python_highlight_file_headers_as_comments') + syn match pythonRun '\%^#!.*$' + syn match pythonCoding '\%^.*\%(\n.*\)\?#.*coding[:=]\s*[0-9A-Za-z-_.]\+.*$' +endif +syn keyword pythonTodo TODO FIXME XXX contained + " -" For highlight doc-tests: -" python_highlight_doctests +" Errors " -" If you want all possible Python highlighting: -" (This option not override previously set options) -" python_highlight_all + +syn match pythonError '\<\d\+[^0-9[:space:]]\+\>' display + +" Mixing spaces and tabs also may be used for pretty formatting multiline +" statements +if s:Enabled('g:python_highlight_indent_errors') + syn match pythonIndentError '^\s*\%( \t\|\t \)\s*\S'me=e-1 display +endif + +" Trailing space errors +if s:Enabled('g:python_highlight_space_errors') + syn match pythonSpaceError '\s\+$' display +endif + " -" For fast machines: -" python_slow_sync +" Strings " -" For version 5.x: Clear all syntax items -" For version 6.x: Quit when a syntax file was already loaded -if version < 600 - syntax clear -elseif exists("b:current_syntax") - finish +if s:Python2Syntax() + " Python 2 strings + syn region pythonString start=+[bB]\='+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonString start=+[bB]\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonString start=+[bB]\="""+ skip=+\\"+ end=+"""+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest2,pythonSpaceError,@Spell + syn region pythonString start=+[bB]\='''+ skip=+\\'+ end=+'''+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest,pythonSpaceError,@Spell +else + " Python 3 byte strings + syn region pythonBytes start=+[bB]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonBytesError,pythonBytesContent,@Spell + syn region pythonBytes start=+[bB]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBytesError,pythonBytesContent,@Spell + syn region pythonBytes start=+[bB]'''+ skip=+\\'+ end=+'''+ keepend contains=pythonBytesError,pythonBytesContent,pythonDocTest,pythonSpaceError,@Spell + syn region pythonBytes start=+[bB]"""+ skip=+\\"+ end=+"""+ keepend contains=pythonBytesError,pythonBytesContent,pythonDocTest2,pythonSpaceError,@Spell + + syn match pythonBytesError '.\+' display contained + syn match pythonBytesContent '[\u0000-\u00ff]\+' display contained contains=pythonBytesEscape,pythonBytesEscapeError endif -if exists("python_highlight_all") && python_highlight_all != 0 - " Not override previously set options - if !exists("python_highlight_builtins") - let python_highlight_builtins = 1 - endif - if !exists("python_highlight_exceptions") - let python_highlight_exceptions = 1 - endif - if !exists("python_highlight_string_formatting") - let python_highlight_string_formatting = 1 - endif - if !exists("python_highlight_indent_errors") - let python_highlight_indent_errors = 1 - endif - if !exists("python_highlight_space_errors") - let python_highlight_space_errors = 1 - endif - if !exists("python_highlight_doctests") - let python_highlight_doctests = 1 - endif +syn match pythonBytesEscape +\\[abfnrtv'"\\]+ display contained +syn match pythonBytesEscape '\\\o\o\=\o\=' display contained +syn match pythonBytesEscapeError '\\\o\{,2}[89]' display contained +syn match pythonBytesEscape '\\x\x\{2}' display contained +syn match pythonBytesEscapeError '\\x\x\=\X' display contained +syn match pythonBytesEscape '\\$' + +syn match pythonUniEscape '\\u\x\{4}' display contained +syn match pythonUniEscapeError '\\u\x\{,3}\X' display contained +syn match pythonUniEscape '\\U\x\{8}' display contained +syn match pythonUniEscapeError '\\U\x\{,7}\X' display contained +syn match pythonUniEscape '\\N{[A-Z ]\+}' display contained +syn match pythonUniEscapeError '\\N{[^A-Z ]\+}' display contained + +if s:Python2Syntax() + " Python 2 Unicode strings + syn region pythonUniString start=+[uU]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonUniString start=+[uU]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonUniString start=+[uU]'''+ skip=+\\'+ end=+'''+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest,pythonSpaceError,@Spell + syn region pythonUniString start=+[uU]"""+ skip=+\\"+ end=+"""+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest2,pythonSpaceError,@Spell +else + " Python 3 strings + syn region pythonString start=+'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonString start=+'''+ skip=+\\'+ end=+'''+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest,pythonSpaceError,@Spell + syn region pythonString start=+"""+ skip=+\\"+ end=+"""+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest2,pythonSpaceError,@Spell + + syn region pythonFString start=+[fF]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonFString start=+[fF]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonFString start=+[fF]'''+ skip=+\\'+ end=+'''+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest,pythonSpaceError,@Spell + syn region pythonFString start=+[fF]"""+ skip=+\\"+ end=+"""+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest2,pythonSpaceError,@Spell endif -" Keywords -syn keyword pythonStatement break continue del -syn keyword pythonStatement exec return -syn keyword pythonStatement pass raise -syn keyword pythonStatement global assert -syn keyword pythonStatement lambda yield -syn keyword pythonStatement async await -syn keyword pythonStatement with nonlocal True False None -syn keyword pythonStatement def class nextgroup=pythonFunction skipwhite -syn match pythonFunction "[a-zA-Z_][a-zA-Z0-9_]*" display contained -syn keyword pythonRepeat for while -syn keyword pythonConditional if elif else -syn keyword pythonImport import from as -syn keyword pythonException try except finally -syn keyword pythonOperator and in is not or - -" Print keyword but only if not used as function -syn match pythonStatement "\<print\>\((\|,\|*=\)\@!" display +if s:Python2Syntax() + " Python 2 Unicode raw strings + syn region pythonUniRawString start=+[uU][rR]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,pythonUniRawEscape,pythonUniRawEscapeError,@Spell + syn region pythonUniRawString start=+[uU][rR]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,pythonUniRawEscape,pythonUniRawEscapeError,@Spell + syn region pythonUniRawString start=+[uU][rR]'''+ skip=+\\'+ end=+'''+ keepend contains=pythonUniRawEscape,pythonUniRawEscapeError,pythonDocTest,pythonSpaceError,@Spell + syn region pythonUniRawString start=+[uU][rR]"""+ skip=+\\"+ end=+"""+ keepend contains=pythonUniRawEscape,pythonUniRawEscapeError,pythonDocTest2,pythonSpaceError,@Spell -" Decorators (new in Python 2.4) -syn match pythonDecorator "@" display nextgroup=pythonFunction skipwhite + syn match pythonUniRawEscape '\%([^\\]\%(\\\\\)*\)\@<=\\u\x\{4}' display contained + syn match pythonUniRawEscapeError '\%([^\\]\%(\\\\\)*\)\@<=\\u\x\{,3}\X' display contained +endif -" Comments -syn match pythonComment "#.*$" display contains=pythonTodo,@Spell -syn match pythonRun "\%^#!.*$" -syn match pythonCoding "\%^.*\(\n.*\)\?#.*coding[:=]\s*[0-9A-Za-z-_.]\+.*$" -syn keyword pythonTodo TODO FIXME XXX contained +" Python 2/3 raw strings +if s:Python2Syntax() + syn region pythonRawString start=+[bB]\=[rR]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawString start=+[bB]\=[rR]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawString start=+[bB]\=[rR]'''+ skip=+\\'+ end=+'''+ keepend contains=pythonDocTest,pythonSpaceError,@Spell + syn region pythonRawString start=+[bB]\=[rR]"""+ skip=+\\"+ end=+"""+ keepend contains=pythonDocTest2,pythonSpaceError,@Spell +else + syn region pythonRawString start=+[rR]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawString start=+[rR]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawString start=+[rR]'''+ skip=+\\'+ end=+'''+ keepend contains=pythonDocTest,pythonSpaceError,@Spell + syn region pythonRawString start=+[rR]"""+ skip=+\\"+ end=+"""+ keepend contains=pythonDocTest2,pythonSpaceError,@Spell + + syn region pythonRawFString start=+\%([fF][rR]\|[rR][fF]\)'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawFString start=+\%([fF][rR]\|[rR][fF]\)"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawFString start=+\%([fF][rR]\|[rR][fF]\)'''+ skip=+\\'+ end=+'''+ keepend contains=pythonDocTest,pythonSpaceError,@Spell + syn region pythonRawFString start=+\%([fF][rR]\|[rR][fF]\)"""+ skip=+\\"+ end=+"""+ keepend contains=pythonDocTest,pythonSpaceError,@Spell + + syn region pythonRawBytes start=+\%([bB][rR]\|[rR][bB]\)'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawBytes start=+\%([bB][rR]\|[rR][bB]\)"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawBytes start=+\%([bB][rR]\|[rR][bB]\)'''+ skip=+\\'+ end=+'''+ keepend contains=pythonDocTest,pythonSpaceError,@Spell + syn region pythonRawBytes start=+\%([bB][rR]\|[rR][bB]\)"""+ skip=+\\"+ end=+"""+ keepend contains=pythonDocTest2,pythonSpaceError,@Spell +endif -" Errors -syn match pythonError "\<\d\+\D\+\>" display -syn match pythonError "[$?]" display -syn match pythonError "[-+&|]\{2,}" display -syn match pythonError "[=]\{3,}" display - -" TODO: Mixing spaces and tabs also may be used for pretty formatting multiline -" statements. For now I don't know how to work around this. -if exists("python_highlight_indent_errors") && python_highlight_indent_errors != 0 - syn match pythonIndentError "^\s*\( \t\|\t \)\s*\S"me=e-1 display +syn match pythonRawEscape +\\['"]+ display contained + +if s:Enabled('g:python_highlight_string_formatting') + " % operator string formatting + if s:Python2Syntax() + syn match pythonStrFormatting '%\%(([^)]\+)\)\=[-#0 +]*\d*\%(\.\d\+\)\=[hlL]\=[diouxXeEfFgGcrs%]' contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString,pythonBytesContent + syn match pythonStrFormatting '%[-#0 +]*\%(\*\|\d\+\)\=\%(\.\%(\*\|\d\+\)\)\=[hlL]\=[diouxXeEfFgGcrs%]' contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString,pythonBytesContent + else + syn match pythonStrFormatting '%\%(([^)]\+)\)\=[-#0 +]*\d*\%(\.\d\+\)\=[hlL]\=[diouxXeEfFgGcrs%]' contained containedin=pythonString,pythonRawString,pythonBytesContent + syn match pythonStrFormatting '%[-#0 +]*\%(\*\|\d\+\)\=\%(\.\%(\*\|\d\+\)\)\=[hlL]\=[diouxXeEfFgGcrs%]' contained containedin=pythonString,pythonRawString,pythonBytesContent + endif endif -" Trailing space errors -if exists("python_highlight_space_errors") && python_highlight_space_errors != 0 - syn match pythonSpaceError "\s\+$" display +if s:Enabled('g:python_highlight_string_format') + " str.format syntax + if s:Python2Syntax() + syn match pythonStrFormat '{{\|}}' contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + syn match pythonStrFormat '{\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)\=\%(\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\[\%(\d\+\|[^!:\}]\+\)\]\)*\%(![rsa]\)\=\%(:\%({\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)}\|\%([^}]\=[<>=^]\)\=[ +-]\=#\=0\=\d*,\=\%(\.\d\+\)\=[bcdeEfFgGnosxX%]\=\)\=\)\=}' contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + else + syn match pythonStrFormat "{\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)\=\%(\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\[\%(\d\+\|[^!:\}]\+\)\]\)*\%(![rsa]\)\=\%(:\%({\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)}\|\%([^}]\=[<>=^]\)\=[ +-]\=#\=0\=\d*,\=\%(\.\d\+\)\=[bcdeEfFgGnosxX%]\=\)\=\)\=}" contained containedin=pythonString,pythonRawString + syn region pythonStrInterpRegion start="{"he=e+1,rs=e+1 end="\%(![rsa]\)\=\%(:\%({\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)}\|\%([^}]\=[<>=^]\)\=[ +-]\=#\=0\=\d*,\=\%(\.\d\+\)\=[bcdeEfFgGnosxX%]\=\)\=\)\=}"hs=s-1,re=s-1 extend contained containedin=pythonFString,pythonRawFString contains=pythonStrInterpRegion,@pythonExpression + syn match pythonStrFormat "{{\|}}" contained containedin=pythonString,pythonRawString,pythonFString,pythonRawFString + endif endif -" Strings -syn region pythonString start=+'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonEscape,pythonEscapeError,@Spell -syn region pythonString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonEscape,pythonEscapeError,@Spell -syn region pythonString start=+"""+ end=+"""+ keepend contains=pythonEscape,pythonEscapeError,pythonDocTest2,pythonSpaceError,@Spell -syn region pythonString start=+'''+ end=+'''+ keepend contains=pythonEscape,pythonEscapeError,pythonDocTest,pythonSpaceError,@Spell - -syn match pythonEscape +\\[abfnrtv'"\\]+ display contained -syn match pythonEscape "\\\o\o\=\o\=" display contained -syn match pythonEscapeError "\\\o\{,2}[89]" display contained -syn match pythonEscape "\\x\x\{2}" display contained -syn match pythonEscapeError "\\x\x\=\X" display contained -syn match pythonEscape "\\$" - -" Byte-Strings -syn region pythonBString start=+[bB]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonBEscape,pythonBEscapeError,@Spell -syn region pythonBString start=+[bB]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBEscape,pythonBEscapeError,@Spell -syn region pythonBString start=+[bB]"""+ end=+"""+ keepend contains=pythonBEscape,pythonBEscapeError,pythonDocTest2,pythonSpaceError,@Spell -syn region pythonBString start=+[bB]'''+ end=+'''+ keepend contains=pythonBEscape,pythonBEscapeError,pythonDocTest,pythonSpaceError,@Spell - -syn match pythonBEscape +\\[abfnrtv'"\\]+ display contained -syn match pythonBEscape "\\\o\o\=\o\=" display contained -syn match pythonBEscapeError "\\\o\{,2}[89]" display contained -syn match pythonBEscape "\\x\x\{2}" display contained -syn match pythonBEscapeError "\\x\x\=\X" display contained -syn match pythonBEscape "\\$" - -" Unicode strings -syn region pythonUniString start=+[uU]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonEscape,pythonUniEscape,pythonEscapeError,pythonUniEscapeError,@Spell -syn region pythonUniString start=+[uU]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonEscape,pythonUniEscape,pythonEscapeError,pythonUniEscapeError,@Spell -syn region pythonUniString start=+[uU]"""+ end=+"""+ keepend contains=pythonEscape,pythonUniEscape,pythonEscapeError,pythonUniEscapeError,pythonDocTest2,pythonSpaceError,@Spell -syn region pythonUniString start=+[uU]'''+ end=+'''+ keepend contains=pythonEscape,pythonUniEscape,pythonEscapeError,pythonUniEscapeError,pythonDocTest,pythonSpaceError,@Spell - -syn match pythonUniEscape "\\u\x\{4}" display contained -syn match pythonUniEscapeError "\\u\x\{,3}\X" display contained -syn match pythonUniEscape "\\U\x\{8}" display contained -syn match pythonUniEscapeError "\\U\x\{,7}\X" display contained -syn match pythonUniEscape "\\N{[A-Z ]\+}" display contained -syn match pythonUniEscapeError "\\N{[^A-Z ]\+}" display contained - -" Raw strings -syn region pythonRawString start=+[rR]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,@Spell -syn region pythonRawString start=+[rR]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,@Spell -syn region pythonRawString start=+[rR]"""+ end=+"""+ keepend contains=pythonDocTest2,pythonSpaceError,@Spell -syn region pythonRawString start=+[rR]'''+ end=+'''+ keepend contains=pythonDocTest,pythonSpaceError,@Spell - -syn match pythonRawEscape +\\['"]+ display transparent contained - -" Unicode raw strings -syn region pythonUniRawString start=+[uU][rR]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,pythonUniRawEscape,pythonUniRawEscapeError,@Spell -syn region pythonUniRawString start=+[uU][rR]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,pythonUniRawEscape,pythonUniRawEscapeError,@Spell -syn region pythonUniRawString start=+[uU][rR]"""+ end=+"""+ keepend contains=pythonUniRawEscape,pythonUniRawEscapeError,pythonDocTest2,pythonSpaceError,@Spell -syn region pythonUniRawString start=+[uU][rR]'''+ end=+'''+ keepend contains=pythonUniRawEscape,pythonUniRawEscapeError,pythonDocTest,pythonSpaceError,@Spell - -syn match pythonUniRawEscape "\([^\\]\(\\\\\)*\)\@<=\\u\x\{4}" display contained -syn match pythonUniRawEscapeError "\([^\\]\(\\\\\)*\)\@<=\\u\x\{,3}\X" display contained - -if exists("python_highlight_string_formatting") && python_highlight_string_formatting != 0 - " String formatting - syn match pythonStrFormat "%\(([^)]\+)\)\=[-#0 +]*\d*\(\.\d\+\)\=[hlL]\=[diouxXeEfFgGcrs%]" contained containedin=pythonString,pythonBString,pythonUniString,pythonRawString,pythonUniRawString - syn match pythonStrFormat "%[-#0 +]*\(\*\|\d\+\)\=\(\.\(\*\|\d\+\)\)\=[hlL]\=[diouxXeEfFgGcrs%]" contained containedin=pythonString,pythonBString,pythonUniString,pythonRawString,pythonUniRawString +if s:Enabled('g:python_highlight_string_templates') + " string.Template format + if s:Python2Syntax() + syn match pythonStrTemplate '\$\$' contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + syn match pythonStrTemplate '\${[a-zA-Z_][a-zA-Z0-9_]*}' contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + syn match pythonStrTemplate '\$[a-zA-Z_][a-zA-Z0-9_]*' contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + else + syn match pythonStrTemplate '\$\$' contained containedin=pythonString,pythonRawString + syn match pythonStrTemplate '\${[a-zA-Z_][a-zA-Z0-9_]*}' contained containedin=pythonString,pythonRawString + syn match pythonStrTemplate '\$[a-zA-Z_][a-zA-Z0-9_]*' contained containedin=pythonString,pythonRawString + endif endif -if exists("python_highlight_doctests") && python_highlight_doctests != 0 +if s:Enabled('g:python_highlight_doctests') " DocTests - syn region pythonDocTest start="^\s*>>>" end=+'''+he=s-1 end="^\s*$" contained - syn region pythonDocTest2 start="^\s*>>>" end=+"""+he=s-1 end="^\s*$" contained + syn region pythonDocTest start='^\s*>>>' skip=+\\'+ end=+'''+he=s-1 end='^\s*$' contained + syn region pythonDocTest2 start='^\s*>>>' skip=+\\"+ end=+"""+he=s-1 end='^\s*$' contained endif +" " Numbers (ints, longs, floats, complex) -syn match pythonHexNumber "\<0[xX]\x\+[lL]\=\>" display -syn match pythonHexNumber "\<0[xX]\>" display -syn match pythonNumber "\<\d\+[lLjJ]\=\>" display -syn match pythonFloat "\.\d\+\([eE][+-]\=\d\+\)\=[jJ]\=\>" display -syn match pythonFloat "\<\d\+[eE][+-]\=\d\+[jJ]\=\>" display -syn match pythonFloat "\<\d\+\.\d*\([eE][+-]\=\d\+\)\=[jJ]\=" display - -syn match pythonOctalError "\<0\o*[89]\d*[lL]\=\>" display -syn match pythonHexError "\<0[xX]\X\+[lL]\=\>" display - -if exists("python_highlight_builtins") && python_highlight_builtins != 0 - " Builtin functions, types and objects - syn keyword pythonBuiltinObj Ellipsis NotImplemented - - syn keyword pythonBuiltinFunc __import__ abs all any apply - syn keyword pythonBuiltinFunc basestring bool buffer bytearray bytes callable - syn keyword pythonBuiltinFunc chr classmethod cmp coerce compile complex - syn keyword pythonBuiltinFunc delattr dict dir divmod enumerate eval - syn keyword pythonBuiltinFunc execfile file filter float frozenset getattr - syn keyword pythonBuiltinfunc globals hasattr hash help hex id - syn keyword pythonBuiltinFunc input int intern isinstance - syn keyword pythonBuiltinFunc issubclass iter len list locals long map max - syn keyword pythonBuiltinFunc min object oct open ord pow property range - syn keyword pythonBuiltinFunc raw_input reduce reload repr - syn keyword pythonBuiltinFunc reversed round set setattr - syn keyword pythonBuiltinFunc slice sorted staticmethod str sum super tuple - syn keyword pythonBuiltinFunc type unichr unicode vars xrange zip +" + +if s:Python2Syntax() + syn match pythonHexError '\<0[xX]\x*[g-zG-Z]\+\x*[lL]\=\>' display + syn match pythonOctError '\<0[oO]\=\o*\D\+\d*[lL]\=\>' display + syn match pythonBinError '\<0[bB][01]*\D\+\d*[lL]\=\>' display + + syn match pythonHexNumber '\<0[xX]\x\+[lL]\=\>' display + syn match pythonOctNumber '\<0[oO]\o\+[lL]\=\>' display + syn match pythonBinNumber '\<0[bB][01]\+[lL]\=\>' display + + syn match pythonNumberError '\<\d\+\D[lL]\=\>' display + syn match pythonNumber '\<\d[lL]\=\>' display + syn match pythonNumber '\<[0-9]\d\+[lL]\=\>' display + syn match pythonNumber '\<\d\+[lLjJ]\>' display + + syn match pythonOctError '\<0[oO]\=\o*[8-9]\d*[lL]\=\>' display + syn match pythonBinError '\<0[bB][01]*[2-9]\d*[lL]\=\>' display + + syn match pythonFloat '\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>' display + syn match pythonFloat '\<\d\+[eE][+-]\=\d\+[jJ]\=\>' display + syn match pythonFloat '\<\d\+\.\d*\%([eE][+-]\=\d\+\)\=[jJ]\=' display +else + syn match pythonOctError '\<0[oO]\=\o*\D\+\d*\>' display + " pythonHexError comes after pythonOctError so that 0xffffl is pythonHexError + syn match pythonHexError '\<0[xX]\x*[g-zG-Z]\x*\>' display + syn match pythonBinError '\<0[bB][01]*\D\+\d*\>' display + + syn match pythonHexNumber '\<0[xX][_0-9a-fA-F]*\x\>' display + syn match pythonOctNumber '\<0[oO][_0-7]*\o\>' display + syn match pythonBinNumber '\<0[bB][_01]*[01]\>' display + + syn match pythonNumberError '\<\d[_0-9]*\D\>' display + syn match pythonNumberError '\<0[_0-9]\+\>' display + syn match pythonNumberError '\<0_x\S*\>' display + syn match pythonNumberError '\<0[bBxXoO][_0-9a-fA-F]*_\>' display + syn match pythonNumberError '\<\d[_0-9]*_\>' display + syn match pythonNumber '\<\d\>' display + syn match pythonNumber '\<[1-9][_0-9]*\d\>' display + syn match pythonNumber '\<\d[jJ]\>' display + syn match pythonNumber '\<[1-9][_0-9]*\d[jJ]\>' display + + syn match pythonOctError '\<0[oO]\=\o*[8-9]\d*\>' display + syn match pythonBinError '\<0[bB][01]*[2-9]\d*\>' display + + syn match pythonFloat '\.\d\%([_0-9]*\d\)\=\%([eE][+-]\=\d\%([_0-9]*\d\)\=\)\=[jJ]\=\>' display + syn match pythonFloat '\<\d\%([_0-9]*\d\)\=[eE][+-]\=\d\%([_0-9]*\d\)\=[jJ]\=\>' display + syn match pythonFloat '\<\d\%([_0-9]*\d\)\=\.\d\%([_0-9]*\d\)\=\%([eE][+-]\=\d\%([_0-9]*\d\)\=\)\=[jJ]\=' display endif -if exists("python_highlight_exceptions") && python_highlight_exceptions != 0 - " Builtin exceptions and warnings - syn keyword pythonExClass BaseException - syn keyword pythonExClass Exception StandardError ArithmeticError - syn keyword pythonExClass LookupError EnvironmentError - - syn keyword pythonExClass AssertionError AttributeError EOFError - syn keyword pythonExClass FloatingPointError GeneratorExit IOError - syn keyword pythonExClass ImportError IndexError KeyError - syn keyword pythonExClass KeyboardInterrupt MemoryError NameError - syn keyword pythonExClass NotImplementedError OSError OverflowError - syn keyword pythonExClass ReferenceError RuntimeError StopIteration - syn keyword pythonExClass SyntaxError IndentationError TabError - syn keyword pythonExClass SystemError SystemExit TypeError - syn keyword pythonExClass UnboundLocalError UnicodeError - syn keyword pythonExClass UnicodeEncodeError UnicodeDecodeError - syn keyword pythonExClass UnicodeTranslateError ValueError - syn keyword pythonExClass WindowsError ZeroDivisionError - - syn keyword pythonExClass Warning UserWarning DeprecationWarning - syn keyword pythonExClass PendingDepricationWarning SyntaxWarning - syn keyword pythonExClass RuntimeWarning FutureWarning OverflowWarning - syn keyword pythonExClass ImportWarning UnicodeWarning +" +" Builtin objects and types +" + +if s:Enabled('g:python_highlight_builtin_objs') + syn keyword pythonNone None + syn keyword pythonBoolean True False + syn keyword pythonBuiltinObj Ellipsis NotImplemented + syn match pythonBuiltinObj '\v\.@<!<%(object|bool|int|float|tuple|str|list|dict|set|frozenset|bytearray|bytes)>' + syn keyword pythonBuiltinObj __debug__ __doc__ __file__ __name__ __package__ + syn keyword pythonBuiltinObj __loader__ __spec__ __path__ __cached__ +endif + +" +" Builtin functions +" + +if s:Enabled('g:python_highlight_builtin_funcs') + let s:funcs_re = '__import__|abs|all|any|bin|callable|chr|classmethod|compile|complex|delattr|dir|divmod|enumerate|eval|filter|format|getattr|globals|hasattr|hash|help|hex|id|input|isinstance|issubclass|iter|len|locals|map|max|memoryview|min|next|oct|open|ord|pow|property|range|repr|reversed|round|setattr|slice|sorted|staticmethod|sum|super|type|vars|zip' + + if s:Python2Syntax() + let s:funcs_re .= '|apply|basestring|buffer|cmp|coerce|execfile|file|intern|long|raw_input|reduce|reload|unichr|unicode|xrange' + if s:Enabled('g:python_print_as_function') + let s:funcs_re .= '|print' + endif + else + let s:funcs_re .= '|ascii|exec|print' + endif + + let s:funcs_re = 'syn match pythonBuiltinFunc ''\v\.@<!\zs<%(' . s:funcs_re . ')>' + + if !s:Enabled('g:python_highlight_builtin_funcs_kwarg') + let s:funcs_re .= '\=@!' + endif + + execute s:funcs_re . '''' + unlet s:funcs_re endif -if exists("python_slow_sync") && python_slow_sync != 0 +" +" Builtin exceptions and warnings +" + +if s:Enabled('g:python_highlight_exceptions') + let s:exs_re = 'BaseException|Exception|ArithmeticError|LookupError|EnvironmentError|AssertionError|AttributeError|BufferError|EOFError|FloatingPointError|GeneratorExit|IOError|ImportError|IndexError|KeyError|KeyboardInterrupt|MemoryError|NameError|NotImplementedError|OSError|OverflowError|ReferenceError|RuntimeError|StopIteration|SyntaxError|IndentationError|TabError|SystemError|SystemExit|TypeError|UnboundLocalError|UnicodeError|UnicodeEncodeError|UnicodeDecodeError|UnicodeTranslateError|ValueError|VMSError|WindowsError|ZeroDivisionError|Warning|UserWarning|BytesWarning|DeprecationWarning|PendingDepricationWarning|SyntaxWarning|RuntimeWarning|FutureWarning|ImportWarning|UnicodeWarning' + + if s:Python2Syntax() + let s:exs_re .= '|StandardError' + else + let s:exs_re .= '|BlockingIOError|ChildProcessError|ConnectionError|BrokenPipeError|ConnectionAbortedError|ConnectionRefusedError|ConnectionResetError|FileExistsError|FileNotFoundError|InterruptedError|IsADirectoryError|NotADirectoryError|PermissionError|ProcessLookupError|TimeoutError|StopAsyncIteration|ResourceWarning' + endif + + execute 'syn match pythonExClass ''\v\.@<!\zs<%(' . s:exs_re . ')>''' + unlet s:exs_re +endif + +if s:Enabled('g:python_slow_sync') syn sync minlines=2000 else " This is fast but code inside triple quoted strings screws it up. It " is impossible to fix because the only way to know if you are inside a " triple quoted string is to start from the beginning of the file. - syn sync match pythonSync grouphere NONE "):$" + syn sync match pythonSync grouphere NONE '):$' syn sync maxlines=200 endif -if version >= 508 || !exists("did_python_syn_inits") - if version <= 508 +if v:version >= 508 || !exists('did_python_syn_inits') + if v:version <= 508 let did_python_syn_inits = 1 command -nargs=+ HiLink hi link <args> else command -nargs=+ HiLink hi def link <args> endif - HiLink pythonStatement Statement - HiLink pythonImport Statement - HiLink pythonFunction Function - HiLink pythonConditional Conditional - HiLink pythonRepeat Repeat - HiLink pythonException Exception - HiLink pythonOperator Operator + HiLink pythonStatement Statement + HiLink pythonRaiseFromStatement Statement + HiLink pythonImport Include + HiLink pythonFunction Function + HiLink pythonConditional Conditional + HiLink pythonRepeat Repeat + HiLink pythonException Exception + HiLink pythonOperator Operator + + HiLink pythonDecorator Define + HiLink pythonDottedName Function + HiLink pythonDot Normal + + HiLink pythonComment Comment + if !s:Enabled('g:python_highlight_file_headers_as_comments') + HiLink pythonCoding Special + HiLink pythonRun Special + endif + HiLink pythonTodo Todo - HiLink pythonDecorator Define + HiLink pythonError Error + HiLink pythonIndentError Error + HiLink pythonSpaceError Error - HiLink pythonComment Comment - HiLink pythonCoding Special - HiLink pythonRun Special - HiLink pythonTodo Todo + HiLink pythonString String + HiLink pythonRawString String + HiLink pythonRawEscape Special - HiLink pythonError Error - HiLink pythonIndentError Error - HiLink pythonSpaceError Error + HiLink pythonUniEscape Special + HiLink pythonUniEscapeError Error - HiLink pythonString String - HiLink pythonBString String - HiLink pythonUniString String - HiLink pythonRawString String - HiLink pythonUniRawString String + if s:Python2Syntax() + HiLink pythonUniString String + HiLink pythonUniRawString String + HiLink pythonUniRawEscape Special + HiLink pythonUniRawEscapeError Error + else + HiLink pythonBytes String + HiLink pythonRawBytes String + HiLink pythonBytesContent String + HiLink pythonBytesError Error + HiLink pythonBytesEscape Special + HiLink pythonBytesEscapeError Error + HiLink pythonFString String + HiLink pythonRawFString String + HiLink pythonStrInterpRegion Special + endif - HiLink pythonEscape Special - HiLink pythonBEscape Special - HiLink pythonEscapeError Error - HiLink pythonBEscapeError Error - HiLink pythonUniEscape Special - HiLink pythonUniEscapeError Error - HiLink pythonUniRawEscape Special - HiLink pythonUniRawEscapeError Error + HiLink pythonStrFormatting Special + HiLink pythonStrFormat Special + HiLink pythonStrTemplate Special - HiLink pythonStrFormat Special + HiLink pythonDocTest Special + HiLink pythonDocTest2 Special - HiLink pythonDocTest Special - HiLink pythonDocTest2 Special + HiLink pythonNumber Number + HiLink pythonHexNumber Number + HiLink pythonOctNumber Number + HiLink pythonBinNumber Number + HiLink pythonFloat Float + HiLink pythonNumberError Error + HiLink pythonOctError Error + HiLink pythonHexError Error + HiLink pythonBinError Error - HiLink pythonNumber Number - HiLink pythonHexNumber Number - HiLink pythonFloat Float - HiLink pythonOctalError Error - HiLink pythonHexError Error + HiLink pythonBoolean Boolean + HiLink pythonNone Constant - HiLink pythonBuiltinObj Structure - HiLink pythonBuiltinFunc Function + HiLink pythonBuiltinObj Structure + HiLink pythonBuiltinFunc Function - HiLink pythonExClass Structure + HiLink pythonExClass Structure + HiLink pythonClassVar Identifier delcommand HiLink endif -let b:current_syntax = "python" +let b:current_syntax = 'python' endif |