xref: /vim-8.2.3635/runtime/syntax/python.vim (revision 34700a6a)
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