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