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