1" Vim syntax file 2" Language: Python 3" Maintainer: Zvezdan Petkovic <[email protected]> 4" Last Change: 2021 Feb 15 5" Credits: Neil Schemenauer <[email protected]> 6" Dmitry Vasiliev 7" 8" This version is a major rewrite by Zvezdan Petkovic. 9" 10" - introduced highlighting of doctests 11" - updated keywords, built-ins, and exceptions 12" - corrected regular expressions for 13" 14" * functions 15" * decorators 16" * strings 17" * escapes 18" * numbers 19" * space error 20" 21" - corrected synchronization 22" - more highlighting is ON by default, except 23" - space error highlighting is OFF by default 24" 25" Optional highlighting can be controlled using these variables. 26" 27" let python_no_builtin_highlight = 1 28" let python_no_doctest_code_highlight = 1 29" let python_no_doctest_highlight = 1 30" let python_no_exception_highlight = 1 31" let python_no_number_highlight = 1 32" let python_space_error_highlight = 1 33" 34" All the options above can be switched on together. 35" 36" let python_highlight_all = 1 37" 38 39" quit when a syntax file was already loaded. 40if exists("b:current_syntax") 41 finish 42endif 43 44" We need nocompatible mode in order to continue lines with backslashes. 45" Original setting will be restored. 46let s:cpo_save = &cpo 47set cpo&vim 48 49if exists("python_no_doctest_highlight") 50 let python_no_doctest_code_highlight = 1 51endif 52 53if exists("python_highlight_all") 54 if exists("python_no_builtin_highlight") 55 unlet python_no_builtin_highlight 56 endif 57 if exists("python_no_doctest_code_highlight") 58 unlet python_no_doctest_code_highlight 59 endif 60 if exists("python_no_doctest_highlight") 61 unlet python_no_doctest_highlight 62 endif 63 if exists("python_no_exception_highlight") 64 unlet python_no_exception_highlight 65 endif 66 if exists("python_no_number_highlight") 67 unlet python_no_number_highlight 68 endif 69 let python_space_error_highlight = 1 70endif 71 72" Keep Python keywords in alphabetical order inside groups for easy 73" comparison with the table in the 'Python Language Reference' 74" https://docs.python.org/reference/lexical_analysis.html#keywords. 75" Groups are in the order presented in NAMING CONVENTIONS in syntax.txt. 76" Exceptions come last at the end of each group (class and def below). 77" 78" The list can be checked using: 79" 80" python3 -c 'import keyword, pprint; pprint.pprint(keyword.kwlist, compact=True)' 81" 82syn keyword pythonStatement False None True 83syn keyword pythonStatement as assert break continue del global 84syn keyword pythonStatement lambda nonlocal pass return with yield 85syn keyword pythonStatement class def nextgroup=pythonFunction skipwhite 86syn keyword pythonConditional elif else if 87syn keyword pythonRepeat for while 88syn keyword pythonOperator and in is not or 89syn keyword pythonException except finally raise try 90syn keyword pythonInclude from import 91syn keyword pythonAsync async await 92 93" Decorators 94" A dot must be allowed because of @MyClass.myfunc decorators. 95syn match pythonDecorator "@" display contained 96syn match pythonDecoratorName "@\s*\h\%(\w\|\.\)*" display contains=pythonDecorator 97 98" Python 3.5 introduced the use of the same symbol for matrix multiplication: 99" https://www.python.org/dev/peps/pep-0465/. We now have to exclude the 100" symbol from highlighting when used in that context. 101" Single line multiplication. 102syn match pythonMatrixMultiply 103 \ "\%(\w\|[])]\)\s*@" 104 \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue 105 \ transparent 106" Multiplication continued on the next line after backslash. 107syn match pythonMatrixMultiply 108 \ "[^\\]\\\s*\n\%(\s*\.\.\.\s\)\=\s\+@" 109 \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue 110 \ transparent 111" Multiplication in a parenthesized expression over multiple lines with @ at 112" the start of each continued line; very similar to decorators and complex. 113syn match pythonMatrixMultiply 114 \ "^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*\n\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}\n\%(\s*\.\.\.\s\)\=\s\+@\)*" 115 \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue 116 \ transparent 117 118syn match pythonFunction "\h\w*" display contained 119 120syn match pythonComment "#.*$" contains=pythonTodo,@Spell 121syn keyword pythonTodo FIXME NOTE NOTES TODO XXX contained 122 123" Triple-quoted strings can contain doctests. 124syn region pythonString matchgroup=pythonQuotes 125 \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" 126 \ contains=pythonEscape,@Spell 127syn region pythonString matchgroup=pythonTripleQuotes 128 \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend 129 \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell 130syn region pythonRawString matchgroup=pythonQuotes 131 \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" 132 \ contains=@Spell 133syn region pythonRawString matchgroup=pythonTripleQuotes 134 \ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend 135 \ contains=pythonSpaceError,pythonDoctest,@Spell 136 137syn match pythonEscape +\\[abfnrtv'"\\]+ contained 138syn match pythonEscape "\\\o\{1,3}" contained 139syn match pythonEscape "\\x\x\{2}" contained 140syn match pythonEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained 141" Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/ 142syn match pythonEscape "\\N{\a\+\%(\s\a\+\)*}" contained 143syn match pythonEscape "\\$" 144 145" It is very important to understand all details before changing the 146" regular expressions below or their order. 147" The word boundaries are *not* the floating-point number boundaries 148" because of a possible leading or trailing decimal point. 149" The expressions below ensure that all valid number literals are 150" highlighted, and invalid number literals are not. For example, 151" 152" - a decimal point in '4.' at the end of a line is highlighted, 153" - a second dot in 1.0.0 is not highlighted, 154" - 08 is not highlighted, 155" - 08e0 or 08j are highlighted, 156" 157" and so on, as specified in the 'Python Language Reference'. 158" https://docs.python.org/reference/lexical_analysis.html#numeric-literals 159if !exists("python_no_number_highlight") 160 " numbers (including longs and complex) 161 syn match pythonNumber "\<0[oO]\=\o\+[Ll]\=\>" 162 syn match pythonNumber "\<0[xX]\x\+[Ll]\=\>" 163 syn match pythonNumber "\<0[bB][01]\+[Ll]\=\>" 164 syn match pythonNumber "\<\%([1-9]\d*\|0\)[Ll]\=\>" 165 syn match pythonNumber "\<\d\+[jJ]\>" 166 syn match pythonNumber "\<\d\+[eE][+-]\=\d\+[jJ]\=\>" 167 syn match pythonNumber 168 \ "\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@=" 169 syn match pythonNumber 170 \ "\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>" 171endif 172 173" Group the built-ins in the order in the 'Python Library Reference' for 174" easier comparison. 175" https://docs.python.org/library/constants.html 176" http://docs.python.org/library/functions.html 177" Python built-in functions are in alphabetical order. 178" 179" The list can be checked using: 180" 181" python3 -c 'import builtins, pprint; pprint.pprint(dir(builtins), compact=True)' 182" 183" The constants added by the `site` module are not listed below because they 184" should not be used in programs, only in interactive interpreter. 185" Similarly for some other attributes and functions `__`-enclosed from the 186" output of the above command. 187" 188if !exists("python_no_builtin_highlight") 189 " built-in constants 190 " 'False', 'True', and 'None' are also reserved words in Python 3 191 syn keyword pythonBuiltin False True None 192 syn keyword pythonBuiltin NotImplemented Ellipsis __debug__ 193 " constants added by the `site` module 194 syn keyword pythonBuiltin quit exit copyright credits license 195 " built-in functions 196 syn keyword pythonBuiltin abs all any ascii bin bool breakpoint bytearray 197 syn keyword pythonBuiltin bytes callable chr classmethod compile complex 198 syn keyword pythonBuiltin delattr dict dir divmod enumerate eval exec 199 syn keyword pythonBuiltin filter float format frozenset getattr globals 200 syn keyword pythonBuiltin hasattr hash help hex id input int isinstance 201 syn keyword pythonBuiltin issubclass iter len list locals map max 202 syn keyword pythonBuiltin memoryview min next object oct open ord pow 203 syn keyword pythonBuiltin print property range repr reversed round set 204 syn keyword pythonBuiltin setattr slice sorted staticmethod str sum super 205 syn keyword pythonBuiltin tuple type vars zip __import__ 206 " avoid highlighting attributes as builtins 207 syn match pythonAttribute /\.\h\w*/hs=s+1 208 \ contains=ALLBUT,pythonBuiltin,pythonFunction,pythonAsync 209 \ transparent 210endif 211 212" From the 'Python Library Reference' class hierarchy at the bottom. 213" http://docs.python.org/library/exceptions.html 214if !exists("python_no_exception_highlight") 215 " builtin base exceptions (used mostly as base classes for other exceptions) 216 syn keyword pythonExceptions BaseException Exception 217 syn keyword pythonExceptions ArithmeticError BufferError LookupError 218 " builtin exceptions (actually raised) 219 syn keyword pythonExceptions AssertionError AttributeError EOFError 220 syn keyword pythonExceptions FloatingPointError GeneratorExit ImportError 221 syn keyword pythonExceptions IndentationError IndexError KeyError 222 syn keyword pythonExceptions KeyboardInterrupt MemoryError 223 syn keyword pythonExceptions ModuleNotFoundError NameError 224 syn keyword pythonExceptions NotImplementedError OSError OverflowError 225 syn keyword pythonExceptions RecursionError ReferenceError RuntimeError 226 syn keyword pythonExceptions StopAsyncIteration StopIteration SyntaxError 227 syn keyword pythonExceptions SystemError SystemExit TabError TypeError 228 syn keyword pythonExceptions UnboundLocalError UnicodeDecodeError 229 syn keyword pythonExceptions UnicodeEncodeError UnicodeError 230 syn keyword pythonExceptions UnicodeTranslateError ValueError 231 syn keyword pythonExceptions ZeroDivisionError 232 " builtin exception aliases for OSError 233 syn keyword pythonExceptions EnvironmentError IOError WindowsError 234 " builtin OS exceptions in Python 3 235 syn keyword pythonExceptions BlockingIOError BrokenPipeError 236 syn keyword pythonExceptions ChildProcessError ConnectionAbortedError 237 syn keyword pythonExceptions ConnectionError ConnectionRefusedError 238 syn keyword pythonExceptions ConnectionResetError FileExistsError 239 syn keyword pythonExceptions FileNotFoundError InterruptedError 240 syn keyword pythonExceptions IsADirectoryError NotADirectoryError 241 syn keyword pythonExceptions PermissionError ProcessLookupError TimeoutError 242 " builtin warnings 243 syn keyword pythonExceptions BytesWarning DeprecationWarning FutureWarning 244 syn keyword pythonExceptions ImportWarning PendingDeprecationWarning 245 syn keyword pythonExceptions ResourceWarning RuntimeWarning 246 syn keyword pythonExceptions SyntaxWarning UnicodeWarning 247 syn keyword pythonExceptions UserWarning Warning 248endif 249 250if exists("python_space_error_highlight") 251 " trailing whitespace 252 syn match pythonSpaceError display excludenl "\s\+$" 253 " mixed tabs and spaces 254 syn match pythonSpaceError display " \+\t" 255 syn match pythonSpaceError display "\t\+ " 256endif 257 258" Do not spell doctests inside strings. 259" Notice that the end of a string, either ''', or """, will end the contained 260" doctest too. Thus, we do *not* need to have it as an end pattern. 261if !exists("python_no_doctest_highlight") 262 if !exists("python_no_doctest_code_highlight") 263 syn region pythonDoctest 264 \ start="^\s*>>>\s" end="^\s*$" 265 \ contained contains=ALLBUT,pythonDoctest,pythonFunction,@Spell 266 syn region pythonDoctestValue 267 \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$" 268 \ contained 269 else 270 syn region pythonDoctest 271 \ start="^\s*>>>" end="^\s*$" 272 \ contained contains=@NoSpell 273 endif 274endif 275 276" Sync at the beginning of class, function, or method definition. 277syn sync match pythonSync grouphere NONE "^\%(def\|class\)\s\+\h\w*\s*[(:]" 278 279" The default highlight links. Can be overridden later. 280hi def link pythonStatement Statement 281hi def link pythonConditional Conditional 282hi def link pythonRepeat Repeat 283hi def link pythonOperator Operator 284hi def link pythonException Exception 285hi def link pythonInclude Include 286hi def link pythonAsync Statement 287hi def link pythonDecorator Define 288hi def link pythonDecoratorName Function 289hi def link pythonFunction Function 290hi def link pythonComment Comment 291hi def link pythonTodo Todo 292hi def link pythonString String 293hi def link pythonRawString String 294hi def link pythonQuotes String 295hi def link pythonTripleQuotes pythonQuotes 296hi def link pythonEscape Special 297if !exists("python_no_number_highlight") 298 hi def link pythonNumber Number 299endif 300if !exists("python_no_builtin_highlight") 301 hi def link pythonBuiltin Function 302endif 303if !exists("python_no_exception_highlight") 304 hi def link pythonExceptions Structure 305endif 306if exists("python_space_error_highlight") 307 hi def link pythonSpaceError Error 308endif 309if !exists("python_no_doctest_highlight") 310 hi def link pythonDoctest Special 311 hi def link pythonDoctestValue Define 312endif 313 314let b:current_syntax = "python" 315 316let &cpo = s:cpo_save 317unlet s:cpo_save 318 319" vim:set sw=2 sts=2 ts=8 noet: 320