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