1071d4279SBram Moolenaar" Vim syntax file 2071d4279SBram Moolenaar" Language: Python 3071d4279SBram Moolenaar" Maintainer: Neil Schemenauer <[email protected]> 4*5c73622aSBram Moolenaar" Last Change: 2009-10-13 5*5c73622aSBram Moolenaar" Credits: Zvezdan Petkovic <[email protected]> 6*5c73622aSBram Moolenaar" Neil Schemenauer <[email protected]> 7*5c73622aSBram Moolenaar" Dmitry Vasiliev 8071d4279SBram Moolenaar" 9*5c73622aSBram Moolenaar" This version is a major rewrite by Zvezdan Petkovic. 10071d4279SBram Moolenaar" 11*5c73622aSBram Moolenaar" - introduced highlighting of doctests 12*5c73622aSBram Moolenaar" - updated keywords, built-ins, and exceptions 13*5c73622aSBram Moolenaar" - corrected regular expressions for 14071d4279SBram Moolenaar" 15*5c73622aSBram Moolenaar" * functions 16*5c73622aSBram Moolenaar" * decorators 17*5c73622aSBram Moolenaar" * strings 18*5c73622aSBram Moolenaar" * escapes 19*5c73622aSBram Moolenaar" * numbers 20*5c73622aSBram Moolenaar" * space error 21071d4279SBram Moolenaar" 22*5c73622aSBram Moolenaar" - corrected synchronization 23*5c73622aSBram Moolenaar" - more highlighting is ON by default, except 24*5c73622aSBram Moolenaar" - space error highlighting is OFF by default 25071d4279SBram Moolenaar" 26*5c73622aSBram Moolenaar" Optional highlighting can be controlled using these variables. 27071d4279SBram Moolenaar" 28*5c73622aSBram Moolenaar" let python_no_builtin_highlight = 1 29*5c73622aSBram Moolenaar" let python_no_doctest_code_highlight = 1 30*5c73622aSBram Moolenaar" let python_no_doctest_highlight = 1 31*5c73622aSBram Moolenaar" let python_no_exception_highlight = 1 32*5c73622aSBram Moolenaar" let python_no_number_highlight = 1 33*5c73622aSBram Moolenaar" let python_space_error_highlight = 1 34071d4279SBram Moolenaar" 35*5c73622aSBram Moolenaar" All the options above can be switched on together. 36071d4279SBram Moolenaar" 37071d4279SBram Moolenaar" let python_highlight_all = 1 38071d4279SBram Moolenaar" 39071d4279SBram Moolenaar 40*5c73622aSBram Moolenaar" For version 5.x: Clear all syntax items. 41*5c73622aSBram Moolenaar" For version 6.x: Quit when a syntax file was already loaded. 42071d4279SBram Moolenaarif version < 600 43071d4279SBram Moolenaar syntax clear 44071d4279SBram Moolenaarelseif exists("b:current_syntax") 45071d4279SBram Moolenaar finish 46071d4279SBram Moolenaarendif 47071d4279SBram Moolenaar 48*5c73622aSBram Moolenaar" Keep Python keywords in alphabetical order inside groups for easy 49*5c73622aSBram Moolenaar" comparison with the table in the 'Python Language Reference' 50*5c73622aSBram Moolenaar" http://docs.python.org/reference/lexical_analysis.html#keywords. 51*5c73622aSBram Moolenaar" Groups are in the order presented in NAMING CONVENTIONS in syntax.txt. 52*5c73622aSBram Moolenaar" Exceptions come last at the end of each group (class and def below). 53*5c73622aSBram Moolenaar" 54*5c73622aSBram Moolenaar" Keywords 'with' and 'as' are new in Python 2.6 55*5c73622aSBram Moolenaar" (use 'from __future__ import with_statement' in Python 2.5). 56*5c73622aSBram Moolenaar" 57*5c73622aSBram Moolenaar" Some compromises had to be made to support both Python 3.0 and 2.6. 58*5c73622aSBram Moolenaar" We include Python 3.0 features, but when a definition is duplicated, 59*5c73622aSBram Moolenaar" the last definition takes precedence. 60*5c73622aSBram Moolenaar" 61*5c73622aSBram Moolenaar" - 'False', 'None', and 'True' are keywords in Python 3.0 but they are 62*5c73622aSBram Moolenaar" built-ins in 2.6 and will be highlighted as built-ins below. 63*5c73622aSBram Moolenaar" - 'exec' is a built-in in Python 3.0 and will be highlighted as 64*5c73622aSBram Moolenaar" built-in below. 65*5c73622aSBram Moolenaar" - 'nonlocal' is a keyword in Python 3.0 and will be highlighted. 66*5c73622aSBram Moolenaar" - 'print' is a built-in in Python 3.0 and will be highlighted as 67*5c73622aSBram Moolenaar" built-in below (use 'from __future__ import print_function' in 2.6) 68*5c73622aSBram Moolenaar" 69*5c73622aSBram Moolenaarsyn keyword pythonStatement False, None, True 70*5c73622aSBram Moolenaarsyn keyword pythonStatement as assert break continue del exec global 71*5c73622aSBram Moolenaarsyn keyword pythonStatement lambda nonlocal pass print return with yield 72*5c73622aSBram Moolenaarsyn keyword pythonStatement class def nextgroup=pythonFunction skipwhite 73*5c73622aSBram Moolenaarsyn keyword pythonConditional elif else if 74071d4279SBram Moolenaarsyn keyword pythonRepeat for while 75071d4279SBram Moolenaarsyn keyword pythonOperator and in is not or 76*5c73622aSBram Moolenaarsyn keyword pythonException except finally raise try 77*5c73622aSBram Moolenaarsyn keyword pythonInclude from import 78071d4279SBram Moolenaar 799c102387SBram Moolenaar" Decorators (new in Python 2.4) 809c102387SBram Moolenaarsyn match pythonDecorator "@" display nextgroup=pythonFunction skipwhite 81*5c73622aSBram Moolenaar" The zero-length non-grouping match before the function name is 82*5c73622aSBram Moolenaar" extremely important in pythonFunction. Without it, everything is 83*5c73622aSBram Moolenaar" interpreted as a function inside the contained environment of 84*5c73622aSBram Moolenaar" doctests. 85*5c73622aSBram Moolenaar" A dot must be allowed because of @MyClass.myfunc decorators. 86*5c73622aSBram Moolenaarsyn match pythonFunction 87*5c73622aSBram Moolenaar \ "\%(\%(def\s\|class\s\|@\)\s*\)\@<=\h\%(\w\|\.\)*" contained 889c102387SBram Moolenaar 89*5c73622aSBram Moolenaarsyn match pythonComment "#.*$" contains=pythonTodo,@Spell 90*5c73622aSBram Moolenaarsyn keyword pythonTodo FIXME NOTE NOTES TODO XXX contained 91*5c73622aSBram Moolenaar 92*5c73622aSBram Moolenaar" Triple-quoted strings can contain doctests. 93*5c73622aSBram Moolenaarsyn region pythonString 94*5c73622aSBram Moolenaar \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" 95*5c73622aSBram Moolenaar \ contains=pythonEscape,@Spell 96*5c73622aSBram Moolenaarsyn region pythonString 97*5c73622aSBram Moolenaar \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend 98*5c73622aSBram Moolenaar \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell 99*5c73622aSBram Moolenaarsyn region pythonRawString 100*5c73622aSBram Moolenaar \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" 101*5c73622aSBram Moolenaar \ contains=@Spell 102*5c73622aSBram Moolenaarsyn region pythonRawString 103*5c73622aSBram Moolenaar \ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend 104*5c73622aSBram Moolenaar \ contains=pythonSpaceError,pythonDoctest,@Spell 105*5c73622aSBram Moolenaar 106071d4279SBram Moolenaarsyn match pythonEscape +\\[abfnrtv'"\\]+ contained 107071d4279SBram Moolenaarsyn match pythonEscape "\\\o\{1,3}" contained 108071d4279SBram Moolenaarsyn match pythonEscape "\\x\x\{2}" contained 109*5c73622aSBram Moolenaarsyn match pythonEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained 110*5c73622aSBram Moolenaar" Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/ 111*5c73622aSBram Moolenaarsyn match pythonEscape "\\N{\a\+\%(\s\a\+\)*}" contained 112071d4279SBram Moolenaarsyn match pythonEscape "\\$" 113071d4279SBram Moolenaar 114071d4279SBram Moolenaarif exists("python_highlight_all") 115*5c73622aSBram Moolenaar if exists("python_no_builtin_highlight") 116*5c73622aSBram Moolenaar unlet python_no_builtin_highlight 117*5c73622aSBram Moolenaar endif 118*5c73622aSBram Moolenaar if exists("python_no_doctest_code_highlight") 119*5c73622aSBram Moolenaar unlet python_no_doctest_code_highlight 120*5c73622aSBram Moolenaar endif 121*5c73622aSBram Moolenaar if exists("python_no_doctest_highlight") 122*5c73622aSBram Moolenaar unlet python_no_doctest_highlight 123*5c73622aSBram Moolenaar endif 124*5c73622aSBram Moolenaar if exists("python_no_exception_highlight") 125*5c73622aSBram Moolenaar unlet python_no_exception_highlight 126*5c73622aSBram Moolenaar endif 127*5c73622aSBram Moolenaar if exists("python_no_number_highlight") 128*5c73622aSBram Moolenaar unlet python_no_number_highlight 129*5c73622aSBram Moolenaar endif 130*5c73622aSBram Moolenaar let python_space_error_highlight = 1 131071d4279SBram Moolenaarendif 132071d4279SBram Moolenaar 133*5c73622aSBram Moolenaar" It is very important to understand all details before changing the 134*5c73622aSBram Moolenaar" regular expressions below or their order. 135*5c73622aSBram Moolenaar" The word boundaries are *not* the floating-point number boundaries 136*5c73622aSBram Moolenaar" because of a possible leading or trailing decimal point. 137*5c73622aSBram Moolenaar" The expressions below ensure that all valid number literals are 138*5c73622aSBram Moolenaar" highlighted, and invalid number literals are not. For example, 139*5c73622aSBram Moolenaar" 140*5c73622aSBram Moolenaar" - a decimal point in '4.' at the end of a line is highlighted, 141*5c73622aSBram Moolenaar" - a second dot in 1.0.0 is not highlighted, 142*5c73622aSBram Moolenaar" - 08 is not highlighted, 143*5c73622aSBram Moolenaar" - 08e0 or 08j are highlighted, 144*5c73622aSBram Moolenaar" 145*5c73622aSBram Moolenaar" and so on, as specified in the 'Python Language Reference'. 146*5c73622aSBram Moolenaar" http://docs.python.org/reference/lexical_analysis.html#numeric-literals 147*5c73622aSBram Moolenaarif !exists("python_no_number_highlight") 148071d4279SBram Moolenaar " numbers (including longs and complex) 149*5c73622aSBram Moolenaar syn match pythonNumber "\<0[oO]\=\o\+[Ll]\=\>" 150*5c73622aSBram Moolenaar syn match pythonNumber "\<0[xX]\x\+[Ll]\=\>" 151*5c73622aSBram Moolenaar syn match pythonNumber "\<0[bB][01]\+[Ll]\=\>" 152*5c73622aSBram Moolenaar syn match pythonNumber "\<\%([1-9]\d*\|0\)[Ll]\=\>" 153*5c73622aSBram Moolenaar syn match pythonNumber "\<\d\+[jJ]\>" 154*5c73622aSBram Moolenaar syn match pythonNumber "\<\d\+[eE][+-]\=\d\+[jJ]\=\>" 155*5c73622aSBram Moolenaar syn match pythonNumber 156*5c73622aSBram Moolenaar \ "\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@=" 157*5c73622aSBram Moolenaar syn match pythonNumber 158*5c73622aSBram Moolenaar \ "\%(^\|\W\)\@<=\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>" 159071d4279SBram Moolenaarendif 160071d4279SBram Moolenaar 161*5c73622aSBram Moolenaar" Group the built-ins in the order in the 'Python Library Reference' for 162*5c73622aSBram Moolenaar" easier comparison. 163*5c73622aSBram Moolenaar" http://docs.python.org/library/constants.html 164*5c73622aSBram Moolenaar" http://docs.python.org/library/functions.html 165*5c73622aSBram Moolenaar" http://docs.python.org/library/functions.html#non-essential-built-in-functions 166*5c73622aSBram Moolenaar" Python built-in functions are in alphabetical order. 167*5c73622aSBram Moolenaarif !exists("python_no_builtin_highlight") 168*5c73622aSBram Moolenaar " built-in constants 169*5c73622aSBram Moolenaar " 'False', 'True', and 'None' are also reserved words in Python 3.0 170*5c73622aSBram Moolenaar syn keyword pythonBuiltin False True None 171*5c73622aSBram Moolenaar syn keyword pythonBuiltin NotImplemented Ellipsis __debug__ 172*5c73622aSBram Moolenaar " built-in functions 173*5c73622aSBram Moolenaar syn keyword pythonBuiltin abs all any bin bool chr classmethod 174*5c73622aSBram Moolenaar syn keyword pythonBuiltin compile complex delattr dict dir divmod 175*5c73622aSBram Moolenaar syn keyword pythonBuiltin enumerate eval filter float format 176*5c73622aSBram Moolenaar syn keyword pythonBuiltin frozenset getattr globals hasattr hash 177*5c73622aSBram Moolenaar syn keyword pythonBuiltin help hex id input int isinstance 178*5c73622aSBram Moolenaar syn keyword pythonBuiltin issubclass iter len list locals map max 179*5c73622aSBram Moolenaar syn keyword pythonBuiltin min next object oct open ord pow print 180*5c73622aSBram Moolenaar syn keyword pythonBuiltin property range repr reversed round set 181*5c73622aSBram Moolenaar syn keyword pythonBuiltin setattr slice sorted staticmethod str 182*5c73622aSBram Moolenaar syn keyword pythonBuiltin sum super tuple type vars zip __import__ 183*5c73622aSBram Moolenaar " Python 2.6 only 184*5c73622aSBram Moolenaar syn keyword pythonBuiltin basestring callable cmp execfile file 185*5c73622aSBram Moolenaar syn keyword pythonBuiltin long raw_input reduce reload unichr 186*5c73622aSBram Moolenaar syn keyword pythonBuiltin unicode xrange 187*5c73622aSBram Moolenaar " Python 3.0 only 188*5c73622aSBram Moolenaar syn keyword pythonBuiltin ascii bytearray bytes exec memoryview 189*5c73622aSBram Moolenaar " non-essential built-in functions; Python 2.6 only 190*5c73622aSBram Moolenaar syn keyword pythonBuiltin apply buffer coerce intern 191071d4279SBram Moolenaarendif 192071d4279SBram Moolenaar 193*5c73622aSBram Moolenaar" From the 'Python Library Reference' class hierarchy at the bottom. 194*5c73622aSBram Moolenaar" http://docs.python.org/library/exceptions.html 195*5c73622aSBram Moolenaarif !exists("python_no_exception_highlight") 196*5c73622aSBram Moolenaar " builtin base exceptions (only used as base classes for other exceptions) 197*5c73622aSBram Moolenaar syn keyword pythonExceptions BaseException Exception 198*5c73622aSBram Moolenaar syn keyword pythonExceptions ArithmeticError EnvironmentError 199*5c73622aSBram Moolenaar syn keyword pythonExceptions LookupError 200*5c73622aSBram Moolenaar " builtin base exception removed in Python 3.0 201*5c73622aSBram Moolenaar syn keyword pythonExceptions StandardError 202*5c73622aSBram Moolenaar " builtin exceptions (actually raised) 203*5c73622aSBram Moolenaar syn keyword pythonExceptions AssertionError AttributeError BufferError 204*5c73622aSBram Moolenaar syn keyword pythonExceptions EOFError FloatingPointError GeneratorExit 205*5c73622aSBram Moolenaar syn keyword pythonExceptions IOError ImportError IndentationError 206*5c73622aSBram Moolenaar syn keyword pythonExceptions IndexError KeyError KeyboardInterrupt 207*5c73622aSBram Moolenaar syn keyword pythonExceptions MemoryError NameError NotImplementedError 208*5c73622aSBram Moolenaar syn keyword pythonExceptions OSError OverflowError ReferenceError 209*5c73622aSBram Moolenaar syn keyword pythonExceptions RuntimeError StopIteration SyntaxError 210*5c73622aSBram Moolenaar syn keyword pythonExceptions SystemError SystemExit TabError TypeError 211*5c73622aSBram Moolenaar syn keyword pythonExceptions UnboundLocalError UnicodeError 212*5c73622aSBram Moolenaar syn keyword pythonExceptions UnicodeDecodeError UnicodeEncodeError 213*5c73622aSBram Moolenaar syn keyword pythonExceptions UnicodeTranslateError ValueError VMSError 214*5c73622aSBram Moolenaar syn keyword pythonExceptions WindowsError ZeroDivisionError 215*5c73622aSBram Moolenaar " builtin warnings 216*5c73622aSBram Moolenaar syn keyword pythonExceptions BytesWarning DeprecationWarning FutureWarning 217*5c73622aSBram Moolenaar syn keyword pythonExceptions ImportWarning PendingDeprecationWarning 218*5c73622aSBram Moolenaar syn keyword pythonExceptions RuntimeWarning SyntaxWarning UnicodeWarning 219*5c73622aSBram Moolenaar syn keyword pythonExceptions UserWarning Warning 220071d4279SBram Moolenaarendif 221071d4279SBram Moolenaar 222*5c73622aSBram Moolenaarif exists("python_space_error_highlight") 223071d4279SBram Moolenaar " trailing whitespace 224*5c73622aSBram Moolenaar syn match pythonSpaceError display excludenl "\s\+$" 225071d4279SBram Moolenaar " mixed tabs and spaces 226071d4279SBram Moolenaar syn match pythonSpaceError display " \+\t" 227071d4279SBram Moolenaar syn match pythonSpaceError display "\t\+ " 228071d4279SBram Moolenaarendif 229071d4279SBram Moolenaar 230*5c73622aSBram Moolenaar" Do not spell doctests inside strings. 231*5c73622aSBram Moolenaar" Notice that the end of a string, either ''', or """, will end the contained 232*5c73622aSBram Moolenaar" doctest too. Thus, we do *not* need to have it as an end pattern. 233*5c73622aSBram Moolenaarif !exists("python_no_doctest_highlight") 234*5c73622aSBram Moolenaar if !exists("python_no_doctest_code_higlight") 235*5c73622aSBram Moolenaar syn region pythonDoctest 236*5c73622aSBram Moolenaar \ start="^\s*>>>\s" end="^\s*$" 237*5c73622aSBram Moolenaar \ contained contains=ALLBUT,pythonDoctest,@Spell 238*5c73622aSBram Moolenaar syn region pythonDoctestValue 239*5c73622aSBram Moolenaar \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$" 240*5c73622aSBram Moolenaar \ contained 241*5c73622aSBram Moolenaar else 242*5c73622aSBram Moolenaar syn region pythonDoctest 243*5c73622aSBram Moolenaar \ start="^\s*>>>" end="^\s*$" 244*5c73622aSBram Moolenaar \ contained contains=@NoSpell 245*5c73622aSBram Moolenaar endif 246*5c73622aSBram Moolenaarendif 247*5c73622aSBram Moolenaar 248*5c73622aSBram Moolenaar" Sync at the beginning of class, function, or method definition. 249*5c73622aSBram Moolenaarsyn sync match pythonSync grouphere NONE "^\s*\%(def\|class\)\s\+\h\w*\s*(" 250071d4279SBram Moolenaar 251071d4279SBram Moolenaarif version >= 508 || !exists("did_python_syn_inits") 252071d4279SBram Moolenaar if version <= 508 253071d4279SBram Moolenaar let did_python_syn_inits = 1 254071d4279SBram Moolenaar command -nargs=+ HiLink hi link <args> 255071d4279SBram Moolenaar else 256071d4279SBram Moolenaar command -nargs=+ HiLink hi def link <args> 257071d4279SBram Moolenaar endif 258071d4279SBram Moolenaar 259*5c73622aSBram Moolenaar " The default highlight links. Can be overridden later. 260071d4279SBram Moolenaar HiLink pythonStatement Statement 261071d4279SBram Moolenaar HiLink pythonConditional Conditional 262071d4279SBram Moolenaar HiLink pythonRepeat Repeat 263*5c73622aSBram Moolenaar HiLink pythonOperator Operator 264*5c73622aSBram Moolenaar HiLink pythonException Exception 265*5c73622aSBram Moolenaar HiLink pythonInclude Include 266*5c73622aSBram Moolenaar HiLink pythonDecorator Define 267*5c73622aSBram Moolenaar HiLink pythonFunction Function 268*5c73622aSBram Moolenaar HiLink pythonComment Comment 269*5c73622aSBram Moolenaar HiLink pythonTodo Todo 270071d4279SBram Moolenaar HiLink pythonString String 271071d4279SBram Moolenaar HiLink pythonRawString String 272071d4279SBram Moolenaar HiLink pythonEscape Special 273*5c73622aSBram Moolenaar if !exists("python_no_number_highlight") 274071d4279SBram Moolenaar HiLink pythonNumber Number 275071d4279SBram Moolenaar endif 276*5c73622aSBram Moolenaar if !exists("python_no_builtin_highlight") 277071d4279SBram Moolenaar HiLink pythonBuiltin Function 278071d4279SBram Moolenaar endif 279*5c73622aSBram Moolenaar if !exists("python_no_exception_highlight") 280*5c73622aSBram Moolenaar HiLink pythonExceptions Structure 281071d4279SBram Moolenaar endif 282*5c73622aSBram Moolenaar if exists("python_space_error_highlight") 283071d4279SBram Moolenaar HiLink pythonSpaceError Error 284071d4279SBram Moolenaar endif 285*5c73622aSBram Moolenaar if !exists("python_no_doctest_highlight") 286*5c73622aSBram Moolenaar HiLink pythonDoctest Special 287*5c73622aSBram Moolenaar HiLink pythonDoctestValue Define 288*5c73622aSBram Moolenaar endif 289071d4279SBram Moolenaar 290071d4279SBram Moolenaar delcommand HiLink 291071d4279SBram Moolenaarendif 292071d4279SBram Moolenaar 293071d4279SBram Moolenaarlet b:current_syntax = "python" 294071d4279SBram Moolenaar 295*5c73622aSBram Moolenaar" vim:set sw=2 sts=2 ts=8 noet: 296