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