1071d4279SBram Moolenaar" Vim syntax file 2071d4279SBram Moolenaar" Language: Python 3071d4279SBram Moolenaar" Maintainer: Neil Schemenauer <[email protected]> 4*34700a6aSBram Moolenaar" Last Change: 2013 Feb 26 55c73622aSBram Moolenaar" Credits: Zvezdan Petkovic <[email protected]> 65c73622aSBram Moolenaar" Neil Schemenauer <[email protected]> 75c73622aSBram Moolenaar" Dmitry Vasiliev 8071d4279SBram Moolenaar" 95c73622aSBram Moolenaar" This version is a major rewrite by Zvezdan Petkovic. 10071d4279SBram Moolenaar" 115c73622aSBram Moolenaar" - introduced highlighting of doctests 125c73622aSBram Moolenaar" - updated keywords, built-ins, and exceptions 135c73622aSBram Moolenaar" - corrected regular expressions for 14071d4279SBram Moolenaar" 155c73622aSBram Moolenaar" * functions 165c73622aSBram Moolenaar" * decorators 175c73622aSBram Moolenaar" * strings 185c73622aSBram Moolenaar" * escapes 195c73622aSBram Moolenaar" * numbers 205c73622aSBram Moolenaar" * space error 21071d4279SBram Moolenaar" 225c73622aSBram Moolenaar" - corrected synchronization 235c73622aSBram Moolenaar" - more highlighting is ON by default, except 245c73622aSBram Moolenaar" - space error highlighting is OFF by default 25071d4279SBram Moolenaar" 265c73622aSBram Moolenaar" Optional highlighting can be controlled using these variables. 27071d4279SBram Moolenaar" 285c73622aSBram Moolenaar" let python_no_builtin_highlight = 1 295c73622aSBram Moolenaar" let python_no_doctest_code_highlight = 1 305c73622aSBram Moolenaar" let python_no_doctest_highlight = 1 315c73622aSBram Moolenaar" let python_no_exception_highlight = 1 325c73622aSBram Moolenaar" let python_no_number_highlight = 1 335c73622aSBram Moolenaar" let python_space_error_highlight = 1 34071d4279SBram Moolenaar" 355c73622aSBram Moolenaar" All the options above can be switched on together. 36071d4279SBram Moolenaar" 37071d4279SBram Moolenaar" let python_highlight_all = 1 38071d4279SBram Moolenaar" 39071d4279SBram Moolenaar 405c73622aSBram Moolenaar" For version 5.x: Clear all syntax items. 415c73622aSBram 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 4800659069SBram Moolenaar" We need nocompatible mode in order to continue lines with backslashes. 4900659069SBram Moolenaar" Original setting will be restored. 5000659069SBram Moolenaarlet s:cpo_save = &cpo 5100659069SBram Moolenaarset cpo&vim 5200659069SBram Moolenaar 535c73622aSBram Moolenaar" Keep Python keywords in alphabetical order inside groups for easy 545c73622aSBram Moolenaar" comparison with the table in the 'Python Language Reference' 555c73622aSBram Moolenaar" http://docs.python.org/reference/lexical_analysis.html#keywords. 565c73622aSBram Moolenaar" Groups are in the order presented in NAMING CONVENTIONS in syntax.txt. 575c73622aSBram Moolenaar" Exceptions come last at the end of each group (class and def below). 585c73622aSBram Moolenaar" 595c73622aSBram Moolenaar" Keywords 'with' and 'as' are new in Python 2.6 605c73622aSBram Moolenaar" (use 'from __future__ import with_statement' in Python 2.5). 615c73622aSBram Moolenaar" 625c73622aSBram Moolenaar" Some compromises had to be made to support both Python 3.0 and 2.6. 635c73622aSBram Moolenaar" We include Python 3.0 features, but when a definition is duplicated, 645c73622aSBram Moolenaar" the last definition takes precedence. 655c73622aSBram Moolenaar" 665c73622aSBram Moolenaar" - 'False', 'None', and 'True' are keywords in Python 3.0 but they are 675c73622aSBram Moolenaar" built-ins in 2.6 and will be highlighted as built-ins below. 685c73622aSBram Moolenaar" - 'exec' is a built-in in Python 3.0 and will be highlighted as 695c73622aSBram Moolenaar" built-in below. 705c73622aSBram Moolenaar" - 'nonlocal' is a keyword in Python 3.0 and will be highlighted. 715c73622aSBram Moolenaar" - 'print' is a built-in in Python 3.0 and will be highlighted as 725c73622aSBram Moolenaar" built-in below (use 'from __future__ import print_function' in 2.6) 735c73622aSBram Moolenaar" 745c73622aSBram Moolenaarsyn keyword pythonStatement False, None, True 755c73622aSBram Moolenaarsyn keyword pythonStatement as assert break continue del exec global 765c73622aSBram Moolenaarsyn keyword pythonStatement lambda nonlocal pass print return with yield 775c73622aSBram Moolenaarsyn keyword pythonStatement class def nextgroup=pythonFunction skipwhite 785c73622aSBram Moolenaarsyn keyword pythonConditional elif else if 79071d4279SBram Moolenaarsyn keyword pythonRepeat for while 80071d4279SBram Moolenaarsyn keyword pythonOperator and in is not or 815c73622aSBram Moolenaarsyn keyword pythonException except finally raise try 825c73622aSBram Moolenaarsyn keyword pythonInclude from import 83071d4279SBram Moolenaar 849c102387SBram Moolenaar" Decorators (new in Python 2.4) 859c102387SBram Moolenaarsyn match pythonDecorator "@" display nextgroup=pythonFunction skipwhite 865c73622aSBram Moolenaar" The zero-length non-grouping match before the function name is 875c73622aSBram Moolenaar" extremely important in pythonFunction. Without it, everything is 885c73622aSBram Moolenaar" interpreted as a function inside the contained environment of 895c73622aSBram Moolenaar" doctests. 905c73622aSBram Moolenaar" A dot must be allowed because of @MyClass.myfunc decorators. 915c73622aSBram Moolenaarsyn match pythonFunction 925c73622aSBram Moolenaar \ "\%(\%(def\s\|class\s\|@\)\s*\)\@<=\h\%(\w\|\.\)*" contained 939c102387SBram Moolenaar 945c73622aSBram Moolenaarsyn match pythonComment "#.*$" contains=pythonTodo,@Spell 955c73622aSBram Moolenaarsyn keyword pythonTodo FIXME NOTE NOTES TODO XXX contained 965c73622aSBram Moolenaar 975c73622aSBram Moolenaar" Triple-quoted strings can contain doctests. 985c73622aSBram Moolenaarsyn region pythonString 995c73622aSBram Moolenaar \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" 1005c73622aSBram Moolenaar \ contains=pythonEscape,@Spell 1015c73622aSBram Moolenaarsyn region pythonString 1025c73622aSBram Moolenaar \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend 1035c73622aSBram Moolenaar \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell 1045c73622aSBram Moolenaarsyn region pythonRawString 1055c73622aSBram Moolenaar \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" 1065c73622aSBram Moolenaar \ contains=@Spell 1075c73622aSBram Moolenaarsyn region pythonRawString 1085c73622aSBram Moolenaar \ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend 1095c73622aSBram Moolenaar \ contains=pythonSpaceError,pythonDoctest,@Spell 1105c73622aSBram Moolenaar 111071d4279SBram Moolenaarsyn match pythonEscape +\\[abfnrtv'"\\]+ contained 112071d4279SBram Moolenaarsyn match pythonEscape "\\\o\{1,3}" contained 113071d4279SBram Moolenaarsyn match pythonEscape "\\x\x\{2}" contained 1145c73622aSBram Moolenaarsyn match pythonEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained 1155c73622aSBram Moolenaar" Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/ 1165c73622aSBram Moolenaarsyn match pythonEscape "\\N{\a\+\%(\s\a\+\)*}" contained 117071d4279SBram Moolenaarsyn match pythonEscape "\\$" 118071d4279SBram Moolenaar 119071d4279SBram Moolenaarif exists("python_highlight_all") 1205c73622aSBram Moolenaar if exists("python_no_builtin_highlight") 1215c73622aSBram Moolenaar unlet python_no_builtin_highlight 1225c73622aSBram Moolenaar endif 1235c73622aSBram Moolenaar if exists("python_no_doctest_code_highlight") 1245c73622aSBram Moolenaar unlet python_no_doctest_code_highlight 1255c73622aSBram Moolenaar endif 1265c73622aSBram Moolenaar if exists("python_no_doctest_highlight") 1275c73622aSBram Moolenaar unlet python_no_doctest_highlight 1285c73622aSBram Moolenaar endif 1295c73622aSBram Moolenaar if exists("python_no_exception_highlight") 1305c73622aSBram Moolenaar unlet python_no_exception_highlight 1315c73622aSBram Moolenaar endif 1325c73622aSBram Moolenaar if exists("python_no_number_highlight") 1335c73622aSBram Moolenaar unlet python_no_number_highlight 1345c73622aSBram Moolenaar endif 1355c73622aSBram Moolenaar let python_space_error_highlight = 1 136071d4279SBram Moolenaarendif 137071d4279SBram Moolenaar 1385c73622aSBram Moolenaar" It is very important to understand all details before changing the 1395c73622aSBram Moolenaar" regular expressions below or their order. 1405c73622aSBram Moolenaar" The word boundaries are *not* the floating-point number boundaries 1415c73622aSBram Moolenaar" because of a possible leading or trailing decimal point. 1425c73622aSBram Moolenaar" The expressions below ensure that all valid number literals are 1435c73622aSBram Moolenaar" highlighted, and invalid number literals are not. For example, 1445c73622aSBram Moolenaar" 1455c73622aSBram Moolenaar" - a decimal point in '4.' at the end of a line is highlighted, 1465c73622aSBram Moolenaar" - a second dot in 1.0.0 is not highlighted, 1475c73622aSBram Moolenaar" - 08 is not highlighted, 1485c73622aSBram Moolenaar" - 08e0 or 08j are highlighted, 1495c73622aSBram Moolenaar" 1505c73622aSBram Moolenaar" and so on, as specified in the 'Python Language Reference'. 1515c73622aSBram Moolenaar" http://docs.python.org/reference/lexical_analysis.html#numeric-literals 1525c73622aSBram Moolenaarif !exists("python_no_number_highlight") 153071d4279SBram Moolenaar " numbers (including longs and complex) 1545c73622aSBram Moolenaar syn match pythonNumber "\<0[oO]\=\o\+[Ll]\=\>" 1555c73622aSBram Moolenaar syn match pythonNumber "\<0[xX]\x\+[Ll]\=\>" 1565c73622aSBram Moolenaar syn match pythonNumber "\<0[bB][01]\+[Ll]\=\>" 1575c73622aSBram Moolenaar syn match pythonNumber "\<\%([1-9]\d*\|0\)[Ll]\=\>" 1585c73622aSBram Moolenaar syn match pythonNumber "\<\d\+[jJ]\>" 1595c73622aSBram Moolenaar syn match pythonNumber "\<\d\+[eE][+-]\=\d\+[jJ]\=\>" 1605c73622aSBram Moolenaar syn match pythonNumber 1615c73622aSBram Moolenaar \ "\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@=" 1625c73622aSBram Moolenaar syn match pythonNumber 1635c73622aSBram Moolenaar \ "\%(^\|\W\)\@<=\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>" 164071d4279SBram Moolenaarendif 165071d4279SBram Moolenaar 1665c73622aSBram Moolenaar" Group the built-ins in the order in the 'Python Library Reference' for 1675c73622aSBram Moolenaar" easier comparison. 1685c73622aSBram Moolenaar" http://docs.python.org/library/constants.html 1695c73622aSBram Moolenaar" http://docs.python.org/library/functions.html 1705c73622aSBram Moolenaar" http://docs.python.org/library/functions.html#non-essential-built-in-functions 1715c73622aSBram Moolenaar" Python built-in functions are in alphabetical order. 1725c73622aSBram Moolenaarif !exists("python_no_builtin_highlight") 1735c73622aSBram Moolenaar " built-in constants 1745c73622aSBram Moolenaar " 'False', 'True', and 'None' are also reserved words in Python 3.0 1755c73622aSBram Moolenaar syn keyword pythonBuiltin False True None 1765c73622aSBram Moolenaar syn keyword pythonBuiltin NotImplemented Ellipsis __debug__ 1775c73622aSBram Moolenaar " built-in functions 1785c73622aSBram Moolenaar syn keyword pythonBuiltin abs all any bin bool chr classmethod 1795c73622aSBram Moolenaar syn keyword pythonBuiltin compile complex delattr dict dir divmod 1805c73622aSBram Moolenaar syn keyword pythonBuiltin enumerate eval filter float format 1815c73622aSBram Moolenaar syn keyword pythonBuiltin frozenset getattr globals hasattr hash 1825c73622aSBram Moolenaar syn keyword pythonBuiltin help hex id input int isinstance 1835c73622aSBram Moolenaar syn keyword pythonBuiltin issubclass iter len list locals map max 1845c73622aSBram Moolenaar syn keyword pythonBuiltin min next object oct open ord pow print 1855c73622aSBram Moolenaar syn keyword pythonBuiltin property range repr reversed round set 1865c73622aSBram Moolenaar syn keyword pythonBuiltin setattr slice sorted staticmethod str 1875c73622aSBram Moolenaar syn keyword pythonBuiltin sum super tuple type vars zip __import__ 1885c73622aSBram Moolenaar " Python 2.6 only 1895c73622aSBram Moolenaar syn keyword pythonBuiltin basestring callable cmp execfile file 1905c73622aSBram Moolenaar syn keyword pythonBuiltin long raw_input reduce reload unichr 1915c73622aSBram Moolenaar syn keyword pythonBuiltin unicode xrange 1925c73622aSBram Moolenaar " Python 3.0 only 1935c73622aSBram Moolenaar syn keyword pythonBuiltin ascii bytearray bytes exec memoryview 1945c73622aSBram Moolenaar " non-essential built-in functions; Python 2.6 only 1955c73622aSBram Moolenaar syn keyword pythonBuiltin apply buffer coerce intern 196071d4279SBram Moolenaarendif 197071d4279SBram Moolenaar 1985c73622aSBram Moolenaar" From the 'Python Library Reference' class hierarchy at the bottom. 1995c73622aSBram Moolenaar" http://docs.python.org/library/exceptions.html 2005c73622aSBram Moolenaarif !exists("python_no_exception_highlight") 2015c73622aSBram Moolenaar " builtin base exceptions (only used as base classes for other exceptions) 2025c73622aSBram Moolenaar syn keyword pythonExceptions BaseException Exception 2035c73622aSBram Moolenaar syn keyword pythonExceptions ArithmeticError EnvironmentError 2045c73622aSBram Moolenaar syn keyword pythonExceptions LookupError 2055c73622aSBram Moolenaar " builtin base exception removed in Python 3.0 2065c73622aSBram Moolenaar syn keyword pythonExceptions StandardError 2075c73622aSBram Moolenaar " builtin exceptions (actually raised) 2085c73622aSBram Moolenaar syn keyword pythonExceptions AssertionError AttributeError BufferError 2095c73622aSBram Moolenaar syn keyword pythonExceptions EOFError FloatingPointError GeneratorExit 2105c73622aSBram Moolenaar syn keyword pythonExceptions IOError ImportError IndentationError 2115c73622aSBram Moolenaar syn keyword pythonExceptions IndexError KeyError KeyboardInterrupt 2125c73622aSBram Moolenaar syn keyword pythonExceptions MemoryError NameError NotImplementedError 2135c73622aSBram Moolenaar syn keyword pythonExceptions OSError OverflowError ReferenceError 2145c73622aSBram Moolenaar syn keyword pythonExceptions RuntimeError StopIteration SyntaxError 2155c73622aSBram Moolenaar syn keyword pythonExceptions SystemError SystemExit TabError TypeError 2165c73622aSBram Moolenaar syn keyword pythonExceptions UnboundLocalError UnicodeError 2175c73622aSBram Moolenaar syn keyword pythonExceptions UnicodeDecodeError UnicodeEncodeError 2185c73622aSBram Moolenaar syn keyword pythonExceptions UnicodeTranslateError ValueError VMSError 2195c73622aSBram Moolenaar syn keyword pythonExceptions WindowsError ZeroDivisionError 2205c73622aSBram Moolenaar " builtin warnings 2215c73622aSBram Moolenaar syn keyword pythonExceptions BytesWarning DeprecationWarning FutureWarning 2225c73622aSBram Moolenaar syn keyword pythonExceptions ImportWarning PendingDeprecationWarning 2235c73622aSBram Moolenaar syn keyword pythonExceptions RuntimeWarning SyntaxWarning UnicodeWarning 2245c73622aSBram Moolenaar syn keyword pythonExceptions UserWarning Warning 225071d4279SBram Moolenaarendif 226071d4279SBram Moolenaar 2275c73622aSBram Moolenaarif exists("python_space_error_highlight") 228071d4279SBram Moolenaar " trailing whitespace 2295c73622aSBram Moolenaar syn match pythonSpaceError display excludenl "\s\+$" 230071d4279SBram Moolenaar " mixed tabs and spaces 231071d4279SBram Moolenaar syn match pythonSpaceError display " \+\t" 232071d4279SBram Moolenaar syn match pythonSpaceError display "\t\+ " 233071d4279SBram Moolenaarendif 234071d4279SBram Moolenaar 2355c73622aSBram Moolenaar" Do not spell doctests inside strings. 2365c73622aSBram Moolenaar" Notice that the end of a string, either ''', or """, will end the contained 2375c73622aSBram Moolenaar" doctest too. Thus, we do *not* need to have it as an end pattern. 2385c73622aSBram Moolenaarif !exists("python_no_doctest_highlight") 239*34700a6aSBram Moolenaar if !exists("python_no_doctest_code_highlight") 2405c73622aSBram Moolenaar syn region pythonDoctest 2415c73622aSBram Moolenaar \ start="^\s*>>>\s" end="^\s*$" 2425c73622aSBram Moolenaar \ contained contains=ALLBUT,pythonDoctest,@Spell 2435c73622aSBram Moolenaar syn region pythonDoctestValue 2445c73622aSBram Moolenaar \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$" 2455c73622aSBram Moolenaar \ contained 2465c73622aSBram Moolenaar else 2475c73622aSBram Moolenaar syn region pythonDoctest 2485c73622aSBram Moolenaar \ start="^\s*>>>" end="^\s*$" 2495c73622aSBram Moolenaar \ contained contains=@NoSpell 2505c73622aSBram Moolenaar endif 2515c73622aSBram Moolenaarendif 2525c73622aSBram Moolenaar 2535c73622aSBram Moolenaar" Sync at the beginning of class, function, or method definition. 2545c73622aSBram Moolenaarsyn sync match pythonSync grouphere NONE "^\s*\%(def\|class\)\s\+\h\w*\s*(" 255071d4279SBram Moolenaar 256071d4279SBram Moolenaarif version >= 508 || !exists("did_python_syn_inits") 257071d4279SBram Moolenaar if version <= 508 258071d4279SBram Moolenaar let did_python_syn_inits = 1 259071d4279SBram Moolenaar command -nargs=+ HiLink hi link <args> 260071d4279SBram Moolenaar else 261071d4279SBram Moolenaar command -nargs=+ HiLink hi def link <args> 262071d4279SBram Moolenaar endif 263071d4279SBram Moolenaar 2645c73622aSBram Moolenaar " The default highlight links. Can be overridden later. 265071d4279SBram Moolenaar HiLink pythonStatement Statement 266071d4279SBram Moolenaar HiLink pythonConditional Conditional 267071d4279SBram Moolenaar HiLink pythonRepeat Repeat 2685c73622aSBram Moolenaar HiLink pythonOperator Operator 2695c73622aSBram Moolenaar HiLink pythonException Exception 2705c73622aSBram Moolenaar HiLink pythonInclude Include 2715c73622aSBram Moolenaar HiLink pythonDecorator Define 2725c73622aSBram Moolenaar HiLink pythonFunction Function 2735c73622aSBram Moolenaar HiLink pythonComment Comment 2745c73622aSBram Moolenaar HiLink pythonTodo Todo 275071d4279SBram Moolenaar HiLink pythonString String 276071d4279SBram Moolenaar HiLink pythonRawString String 277071d4279SBram Moolenaar HiLink pythonEscape Special 2785c73622aSBram Moolenaar if !exists("python_no_number_highlight") 279071d4279SBram Moolenaar HiLink pythonNumber Number 280071d4279SBram Moolenaar endif 2815c73622aSBram Moolenaar if !exists("python_no_builtin_highlight") 282071d4279SBram Moolenaar HiLink pythonBuiltin Function 283071d4279SBram Moolenaar endif 2845c73622aSBram Moolenaar if !exists("python_no_exception_highlight") 2855c73622aSBram Moolenaar HiLink pythonExceptions Structure 286071d4279SBram Moolenaar endif 2875c73622aSBram Moolenaar if exists("python_space_error_highlight") 288071d4279SBram Moolenaar HiLink pythonSpaceError Error 289071d4279SBram Moolenaar endif 2905c73622aSBram Moolenaar if !exists("python_no_doctest_highlight") 2915c73622aSBram Moolenaar HiLink pythonDoctest Special 2925c73622aSBram Moolenaar HiLink pythonDoctestValue Define 2935c73622aSBram Moolenaar endif 294071d4279SBram Moolenaar 295071d4279SBram Moolenaar delcommand HiLink 296071d4279SBram Moolenaarendif 297071d4279SBram Moolenaar 298071d4279SBram Moolenaarlet b:current_syntax = "python" 299071d4279SBram Moolenaar 30000659069SBram Moolenaarlet &cpo = s:cpo_save 30100659069SBram Moolenaarunlet s:cpo_save 30200659069SBram Moolenaar 3035c73622aSBram Moolenaar" vim:set sw=2 sts=2 ts=8 noet: 304