1" Vim syntax file 2" Language: Python 3" Maintainer: Zvezdan Petkovic <[email protected]> 4" Last Change: 2016 Oct 29 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/2/reference/lexical_analysis.html#keywords, 75" https://docs.python.org/3/reference/lexical_analysis.html#keywords. 76" Groups are in the order presented in NAMING CONVENTIONS in syntax.txt. 77" Exceptions come last at the end of each group (class and def below). 78" 79" Keywords 'with' and 'as' are new in Python 2.6 80" (use 'from __future__ import with_statement' in Python 2.5). 81" 82" Some compromises had to be made to support both Python 3 and 2. 83" We include Python 3 features, but when a definition is duplicated, 84" the last definition takes precedence. 85" 86" - 'False', 'None', and 'True' are keywords in Python 3 but they are 87" built-ins in 2 and will be highlighted as built-ins below. 88" - 'exec' is a built-in in Python 3 and will be highlighted as 89" built-in below. 90" - 'nonlocal' is a keyword in Python 3 and will be highlighted. 91" - 'print' is a built-in in Python 3 and will be highlighted as 92" built-in below (use 'from __future__ import print_function' in 2) 93" - async and await were added in Python 3.5 and are soft keywords. 94" 95syn keyword pythonStatement False None True 96syn keyword pythonStatement as assert break continue del exec global 97syn keyword pythonStatement lambda nonlocal pass print return with yield 98syn keyword pythonStatement class def nextgroup=pythonFunction skipwhite 99syn keyword pythonConditional elif else if 100syn keyword pythonRepeat for while 101syn keyword pythonOperator and in is not or 102syn keyword pythonException except finally raise try 103syn keyword pythonInclude from import 104syn keyword pythonAsync async await 105 106" Decorators (new in Python 2.4) 107" A dot must be allowed because of @MyClass.myfunc decorators. 108syn match pythonDecorator "@" display contained 109syn match pythonDecoratorName "@\s*\h\%(\w\|\.\)*" display contains=pythonDecorator 110 111" Python 3.5 introduced the use of the same symbol for matrix multiplication: 112" https://www.python.org/dev/peps/pep-0465/. We now have to exclude the 113" symbol from highlighting when used in that context. 114" Single line multiplication. 115syn match pythonMatrixMultiply 116 \ "\%(\w\|[])]\)\s*@" 117 \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue 118 \ transparent 119" Multiplication continued on the next line after backslash. 120syn match pythonMatrixMultiply 121 \ "[^\\]\\\s*\n\%(\s*\.\.\.\s\)\=\s\+@" 122 \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue 123 \ transparent 124" Multiplication in a parenthesized expression over multiple lines with @ at 125" the start of each continued line; very similar to decorators and complex. 126syn match pythonMatrixMultiply 127 \ "^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*\n\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}\n\%(\s*\.\.\.\s\)\=\s\+@\)*" 128 \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue 129 \ transparent 130 131syn match pythonFunction "\h\w*" display contained 132 133syn match pythonComment "#.*$" contains=pythonTodo,@Spell 134syn keyword pythonTodo FIXME NOTE NOTES TODO XXX contained 135 136" Triple-quoted strings can contain doctests. 137syn region pythonString matchgroup=pythonQuotes 138 \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" 139 \ contains=pythonEscape,@Spell 140syn region pythonString matchgroup=pythonTripleQuotes 141 \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend 142 \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell 143syn region pythonRawString matchgroup=pythonQuotes 144 \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" 145 \ contains=@Spell 146syn region pythonRawString matchgroup=pythonTripleQuotes 147 \ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend 148 \ contains=pythonSpaceError,pythonDoctest,@Spell 149 150syn match pythonEscape +\\[abfnrtv'"\\]+ contained 151syn match pythonEscape "\\\o\{1,3}" contained 152syn match pythonEscape "\\x\x\{2}" contained 153syn match pythonEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained 154" Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/ 155syn match pythonEscape "\\N{\a\+\%(\s\a\+\)*}" contained 156syn match pythonEscape "\\$" 157 158" It is very important to understand all details before changing the 159" regular expressions below or their order. 160" The word boundaries are *not* the floating-point number boundaries 161" because of a possible leading or trailing decimal point. 162" The expressions below ensure that all valid number literals are 163" highlighted, and invalid number literals are not. For example, 164" 165" - a decimal point in '4.' at the end of a line is highlighted, 166" - a second dot in 1.0.0 is not highlighted, 167" - 08 is not highlighted, 168" - 08e0 or 08j are highlighted, 169" 170" and so on, as specified in the 'Python Language Reference'. 171" https://docs.python.org/2/reference/lexical_analysis.html#numeric-literals 172" https://docs.python.org/3/reference/lexical_analysis.html#numeric-literals 173if !exists("python_no_number_highlight") 174 " numbers (including longs and complex) 175 syn match pythonNumber "\<0[oO]\=\o\+[Ll]\=\>" 176 syn match pythonNumber "\<0[xX]\x\+[Ll]\=\>" 177 syn match pythonNumber "\<0[bB][01]\+[Ll]\=\>" 178 syn match pythonNumber "\<\%([1-9]\d*\|0\)[Ll]\=\>" 179 syn match pythonNumber "\<\d\+[jJ]\>" 180 syn match pythonNumber "\<\d\+[eE][+-]\=\d\+[jJ]\=\>" 181 syn match pythonNumber 182 \ "\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@=" 183 syn match pythonNumber 184 \ "\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>" 185endif 186 187" Group the built-ins in the order in the 'Python Library Reference' for 188" easier comparison. 189" https://docs.python.org/2/library/constants.html 190" https://docs.python.org/3/library/constants.html 191" http://docs.python.org/2/library/functions.html 192" http://docs.python.org/3/library/functions.html 193" http://docs.python.org/2/library/functions.html#non-essential-built-in-functions 194" http://docs.python.org/3/library/functions.html#non-essential-built-in-functions 195" Python built-in functions are in alphabetical order. 196if !exists("python_no_builtin_highlight") 197 " built-in constants 198 " 'False', 'True', and 'None' are also reserved words in Python 3 199 syn keyword pythonBuiltin False True None 200 syn keyword pythonBuiltin NotImplemented Ellipsis __debug__ 201 " built-in functions 202 syn keyword pythonBuiltin abs all any bin bool bytearray callable chr 203 syn keyword pythonBuiltin classmethod compile complex delattr dict dir 204 syn keyword pythonBuiltin divmod enumerate eval filter float format 205 syn keyword pythonBuiltin frozenset getattr globals hasattr hash 206 syn keyword pythonBuiltin help hex id input int isinstance 207 syn keyword pythonBuiltin issubclass iter len list locals map max 208 syn keyword pythonBuiltin memoryview min next object oct open ord pow 209 syn keyword pythonBuiltin print property range repr reversed round set 210 syn keyword pythonBuiltin setattr slice sorted staticmethod str 211 syn keyword pythonBuiltin sum super tuple type vars zip __import__ 212 " Python 2 only 213 syn keyword pythonBuiltin basestring cmp execfile file 214 syn keyword pythonBuiltin long raw_input reduce reload unichr 215 syn keyword pythonBuiltin unicode xrange 216 " Python 3 only 217 syn keyword pythonBuiltin ascii bytes exec 218 " non-essential built-in functions; Python 2 only 219 syn keyword pythonBuiltin apply buffer coerce intern 220 " avoid highlighting attributes as builtins 221 syn match pythonAttribute /\.\h\w*/hs=s+1 222 \ contains=ALLBUT,pythonBuiltin,pythonFunction,pythonAsync 223 \ transparent 224endif 225 226" From the 'Python Library Reference' class hierarchy at the bottom. 227" http://docs.python.org/2/library/exceptions.html 228" http://docs.python.org/3/library/exceptions.html 229if !exists("python_no_exception_highlight") 230 " builtin base exceptions (used mostly as base classes for other exceptions) 231 syn keyword pythonExceptions BaseException Exception 232 syn keyword pythonExceptions ArithmeticError BufferError 233 syn keyword pythonExceptions LookupError 234 " builtin base exceptions removed in Python 3 235 syn keyword pythonExceptions EnvironmentError StandardError 236 " builtin exceptions (actually raised) 237 syn keyword pythonExceptions AssertionError AttributeError 238 syn keyword pythonExceptions EOFError FloatingPointError GeneratorExit 239 syn keyword pythonExceptions ImportError IndentationError 240 syn keyword pythonExceptions IndexError KeyError KeyboardInterrupt 241 syn keyword pythonExceptions MemoryError NameError NotImplementedError 242 syn keyword pythonExceptions OSError OverflowError ReferenceError 243 syn keyword pythonExceptions RuntimeError StopIteration SyntaxError 244 syn keyword pythonExceptions SystemError SystemExit TabError TypeError 245 syn keyword pythonExceptions UnboundLocalError UnicodeError 246 syn keyword pythonExceptions UnicodeDecodeError UnicodeEncodeError 247 syn keyword pythonExceptions UnicodeTranslateError ValueError 248 syn keyword pythonExceptions ZeroDivisionError 249 " builtin OS exceptions in Python 3 250 syn keyword pythonExceptions BlockingIOError BrokenPipeError 251 syn keyword pythonExceptions ChildProcessError ConnectionAbortedError 252 syn keyword pythonExceptions ConnectionError ConnectionRefusedError 253 syn keyword pythonExceptions ConnectionResetError FileExistsError 254 syn keyword pythonExceptions FileNotFoundError InterruptedError 255 syn keyword pythonExceptions IsADirectoryError NotADirectoryError 256 syn keyword pythonExceptions PermissionError ProcessLookupError 257 syn keyword pythonExceptions RecursionError StopAsyncIteration 258 syn keyword pythonExceptions TimeoutError 259 " builtin exceptions deprecated/removed in Python 3 260 syn keyword pythonExceptions IOError VMSError WindowsError 261 " builtin warnings 262 syn keyword pythonExceptions BytesWarning DeprecationWarning FutureWarning 263 syn keyword pythonExceptions ImportWarning PendingDeprecationWarning 264 syn keyword pythonExceptions RuntimeWarning SyntaxWarning UnicodeWarning 265 syn keyword pythonExceptions UserWarning Warning 266 " builtin warnings in Python 3 267 syn keyword pythonExceptions ResourceWarning 268endif 269 270if exists("python_space_error_highlight") 271 " trailing whitespace 272 syn match pythonSpaceError display excludenl "\s\+$" 273 " mixed tabs and spaces 274 syn match pythonSpaceError display " \+\t" 275 syn match pythonSpaceError display "\t\+ " 276endif 277 278" Do not spell doctests inside strings. 279" Notice that the end of a string, either ''', or """, will end the contained 280" doctest too. Thus, we do *not* need to have it as an end pattern. 281if !exists("python_no_doctest_highlight") 282 if !exists("python_no_doctest_code_highlight") 283 syn region pythonDoctest 284 \ start="^\s*>>>\s" end="^\s*$" 285 \ contained contains=ALLBUT,pythonDoctest,pythonFunction,@Spell 286 syn region pythonDoctestValue 287 \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$" 288 \ contained 289 else 290 syn region pythonDoctest 291 \ start="^\s*>>>" end="^\s*$" 292 \ contained contains=@NoSpell 293 endif 294endif 295 296" Sync at the beginning of class, function, or method definition. 297syn sync match pythonSync grouphere NONE "^\%(def\|class\)\s\+\h\w*\s*[(:]" 298 299" The default highlight links. Can be overridden later. 300hi def link pythonStatement Statement 301hi def link pythonConditional Conditional 302hi def link pythonRepeat Repeat 303hi def link pythonOperator Operator 304hi def link pythonException Exception 305hi def link pythonInclude Include 306hi def link pythonAsync Statement 307hi def link pythonDecorator Define 308hi def link pythonDecoratorName Function 309hi def link pythonFunction Function 310hi def link pythonComment Comment 311hi def link pythonTodo Todo 312hi def link pythonString String 313hi def link pythonRawString String 314hi def link pythonQuotes String 315hi def link pythonTripleQuotes pythonQuotes 316hi def link pythonEscape Special 317if !exists("python_no_number_highlight") 318 hi def link pythonNumber Number 319endif 320if !exists("python_no_builtin_highlight") 321 hi def link pythonBuiltin Function 322endif 323if !exists("python_no_exception_highlight") 324 hi def link pythonExceptions Structure 325endif 326if exists("python_space_error_highlight") 327 hi def link pythonSpaceError Error 328endif 329if !exists("python_no_doctest_highlight") 330 hi def link pythonDoctest Special 331 hi def link pythonDoctestValue Define 332endif 333 334let b:current_syntax = "python" 335 336let &cpo = s:cpo_save 337unlet s:cpo_save 338 339" vim:set sw=2 sts=2 ts=8 noet: 340