xref: /vim-8.2.3635/runtime/syntax/python.vim (revision 8cc2a9c0)
1" Vim syntax file
2" Language:	Python
3" Maintainer:	Zvezdan Petkovic <[email protected]>
4" Last Change:	2016 Oct 29
5" Credits:	Neil Schemenauer <[email protected]>
6"		Dmitry Vasiliev
7"
8"		This version is a major rewrite by Zvezdan Petkovic.
9"
10"		- introduced highlighting of doctests
11"		- updated keywords, built-ins, and exceptions
12"		- corrected regular expressions for
13"
14"		  * functions
15"		  * decorators
16"		  * strings
17"		  * escapes
18"		  * numbers
19"		  * space error
20"
21"		- corrected synchronization
22"		- more highlighting is ON by default, except
23"		- space error highlighting is OFF by default
24"
25" Optional highlighting can be controlled using these variables.
26"
27"   let python_no_builtin_highlight = 1
28"   let python_no_doctest_code_highlight = 1
29"   let python_no_doctest_highlight = 1
30"   let python_no_exception_highlight = 1
31"   let python_no_number_highlight = 1
32"   let python_space_error_highlight = 1
33"
34" All the options above can be switched on together.
35"
36"   let python_highlight_all = 1
37"
38
39" quit when a syntax file was already loaded.
40if exists("b:current_syntax")
41  finish
42endif
43
44" We need nocompatible mode in order to continue lines with backslashes.
45" Original setting will be restored.
46let s:cpo_save = &cpo
47set cpo&vim
48
49if exists("python_no_doctest_highlight")
50  let python_no_doctest_code_highlight = 1
51endif
52
53if exists("python_highlight_all")
54  if exists("python_no_builtin_highlight")
55    unlet python_no_builtin_highlight
56  endif
57  if exists("python_no_doctest_code_highlight")
58    unlet python_no_doctest_code_highlight
59  endif
60  if exists("python_no_doctest_highlight")
61    unlet python_no_doctest_highlight
62  endif
63  if exists("python_no_exception_highlight")
64    unlet python_no_exception_highlight
65  endif
66  if exists("python_no_number_highlight")
67    unlet python_no_number_highlight
68  endif
69  let python_space_error_highlight = 1
70endif
71
72" Keep Python keywords in alphabetical order inside groups for easy
73" comparison with the table in the 'Python Language Reference'
74" https://docs.python.org/2/reference/lexical_analysis.html#keywords,
75" https://docs.python.org/3/reference/lexical_analysis.html#keywords.
76" Groups are in the order presented in NAMING CONVENTIONS in syntax.txt.
77" Exceptions come last at the end of each group (class and def below).
78"
79" Keywords 'with' and 'as' are new in Python 2.6
80" (use 'from __future__ import with_statement' in Python 2.5).
81"
82" Some compromises had to be made to support both Python 3 and 2.
83" We include Python 3 features, but when a definition is duplicated,
84" the last definition takes precedence.
85"
86" - 'False', 'None', and 'True' are keywords in Python 3 but they are
87"   built-ins in 2 and will be highlighted as built-ins below.
88" - 'exec' is a built-in in Python 3 and will be highlighted as
89"   built-in below.
90" - 'nonlocal' is a keyword in Python 3 and will be highlighted.
91" - 'print' is a built-in in Python 3 and will be highlighted as
92"   built-in below (use 'from __future__ import print_function' in 2)
93" - async and await were added in Python 3.5 and are soft keywords.
94"
95syn keyword pythonStatement	False None True
96syn keyword pythonStatement	as assert break continue del exec global
97syn keyword pythonStatement	lambda nonlocal pass print return with yield
98syn keyword pythonStatement	class def nextgroup=pythonFunction skipwhite
99syn keyword pythonConditional	elif else if
100syn keyword pythonRepeat	for while
101syn keyword pythonOperator	and in is not or
102syn keyword pythonException	except finally raise try
103syn keyword pythonInclude	from import
104syn keyword pythonAsync		async await
105
106" Decorators (new in Python 2.4)
107" A dot must be allowed because of @MyClass.myfunc decorators.
108syn match   pythonDecorator	"@" display contained
109syn match   pythonDecoratorName	"@\s*\h\%(\w\|\.\)*" display contains=pythonDecorator
110
111" Python 3.5 introduced the use of the same symbol for matrix multiplication:
112" https://www.python.org/dev/peps/pep-0465/.  We now have to exclude the
113" symbol from highlighting when used in that context.
114" Single line multiplication.
115syn match   pythonMatrixMultiply
116      \ "\%(\w\|[])]\)\s*@"
117      \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
118      \ transparent
119" Multiplication continued on the next line after backslash.
120syn match   pythonMatrixMultiply
121      \ "[^\\]\\\s*\n\%(\s*\.\.\.\s\)\=\s\+@"
122      \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
123      \ transparent
124" Multiplication in a parenthesized expression over multiple lines with @ at
125" the start of each continued line; very similar to decorators and complex.
126syn match   pythonMatrixMultiply
127      \ "^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*\n\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}\n\%(\s*\.\.\.\s\)\=\s\+@\)*"
128      \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
129      \ transparent
130
131syn match   pythonFunction	"\h\w*" display contained
132
133syn match   pythonComment	"#.*$" contains=pythonTodo,@Spell
134syn keyword pythonTodo		FIXME NOTE NOTES TODO XXX contained
135
136" Triple-quoted strings can contain doctests.
137syn region  pythonString matchgroup=pythonQuotes
138      \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
139      \ contains=pythonEscape,@Spell
140syn region  pythonString matchgroup=pythonTripleQuotes
141      \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend
142      \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell
143syn region  pythonRawString matchgroup=pythonQuotes
144      \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
145      \ contains=@Spell
146syn region  pythonRawString matchgroup=pythonTripleQuotes
147      \ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend
148      \ contains=pythonSpaceError,pythonDoctest,@Spell
149
150syn match   pythonEscape	+\\[abfnrtv'"\\]+ contained
151syn match   pythonEscape	"\\\o\{1,3}" contained
152syn match   pythonEscape	"\\x\x\{2}" contained
153syn match   pythonEscape	"\%(\\u\x\{4}\|\\U\x\{8}\)" contained
154" Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/
155syn match   pythonEscape	"\\N{\a\+\%(\s\a\+\)*}" contained
156syn match   pythonEscape	"\\$"
157
158" It is very important to understand all details before changing the
159" regular expressions below or their order.
160" The word boundaries are *not* the floating-point number boundaries
161" because of a possible leading or trailing decimal point.
162" The expressions below ensure that all valid number literals are
163" highlighted, and invalid number literals are not.  For example,
164"
165" - a decimal point in '4.' at the end of a line is highlighted,
166" - a second dot in 1.0.0 is not highlighted,
167" - 08 is not highlighted,
168" - 08e0 or 08j are highlighted,
169"
170" and so on, as specified in the 'Python Language Reference'.
171" https://docs.python.org/2/reference/lexical_analysis.html#numeric-literals
172" https://docs.python.org/3/reference/lexical_analysis.html#numeric-literals
173if !exists("python_no_number_highlight")
174  " numbers (including longs and complex)
175  syn match   pythonNumber	"\<0[oO]\=\o\+[Ll]\=\>"
176  syn match   pythonNumber	"\<0[xX]\x\+[Ll]\=\>"
177  syn match   pythonNumber	"\<0[bB][01]\+[Ll]\=\>"
178  syn match   pythonNumber	"\<\%([1-9]\d*\|0\)[Ll]\=\>"
179  syn match   pythonNumber	"\<\d\+[jJ]\>"
180  syn match   pythonNumber	"\<\d\+[eE][+-]\=\d\+[jJ]\=\>"
181  syn match   pythonNumber
182	\ "\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@="
183  syn match   pythonNumber
184	\ "\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>"
185endif
186
187" Group the built-ins in the order in the 'Python Library Reference' for
188" easier comparison.
189" https://docs.python.org/2/library/constants.html
190" https://docs.python.org/3/library/constants.html
191" http://docs.python.org/2/library/functions.html
192" http://docs.python.org/3/library/functions.html
193" http://docs.python.org/2/library/functions.html#non-essential-built-in-functions
194" http://docs.python.org/3/library/functions.html#non-essential-built-in-functions
195" Python built-in functions are in alphabetical order.
196if !exists("python_no_builtin_highlight")
197  " built-in constants
198  " 'False', 'True', and 'None' are also reserved words in Python 3
199  syn keyword pythonBuiltin	False True None
200  syn keyword pythonBuiltin	NotImplemented Ellipsis __debug__
201  " built-in functions
202  syn keyword pythonBuiltin	abs all any bin bool bytearray callable chr
203  syn keyword pythonBuiltin	classmethod compile complex delattr dict dir
204  syn keyword pythonBuiltin	divmod enumerate eval filter float format
205  syn keyword pythonBuiltin	frozenset getattr globals hasattr hash
206  syn keyword pythonBuiltin	help hex id input int isinstance
207  syn keyword pythonBuiltin	issubclass iter len list locals map max
208  syn keyword pythonBuiltin	memoryview min next object oct open ord pow
209  syn keyword pythonBuiltin	print property range repr reversed round set
210  syn keyword pythonBuiltin	setattr slice sorted staticmethod str
211  syn keyword pythonBuiltin	sum super tuple type vars zip __import__
212  " Python 2 only
213  syn keyword pythonBuiltin	basestring cmp execfile file
214  syn keyword pythonBuiltin	long raw_input reduce reload unichr
215  syn keyword pythonBuiltin	unicode xrange
216  " Python 3 only
217  syn keyword pythonBuiltin	ascii bytes exec
218  " non-essential built-in functions; Python 2 only
219  syn keyword pythonBuiltin	apply buffer coerce intern
220  " avoid highlighting attributes as builtins
221  syn match   pythonAttribute	/\.\h\w*/hs=s+1
222	\ contains=ALLBUT,pythonBuiltin,pythonFunction,pythonAsync
223	\ transparent
224endif
225
226" From the 'Python Library Reference' class hierarchy at the bottom.
227" http://docs.python.org/2/library/exceptions.html
228" http://docs.python.org/3/library/exceptions.html
229if !exists("python_no_exception_highlight")
230  " builtin base exceptions (used mostly as base classes for other exceptions)
231  syn keyword pythonExceptions	BaseException Exception
232  syn keyword pythonExceptions	ArithmeticError BufferError
233  syn keyword pythonExceptions	LookupError
234  " builtin base exceptions removed in Python 3
235  syn keyword pythonExceptions	EnvironmentError StandardError
236  " builtin exceptions (actually raised)
237  syn keyword pythonExceptions	AssertionError AttributeError
238  syn keyword pythonExceptions	EOFError FloatingPointError GeneratorExit
239  syn keyword pythonExceptions	ImportError IndentationError
240  syn keyword pythonExceptions	IndexError KeyError KeyboardInterrupt
241  syn keyword pythonExceptions	MemoryError NameError NotImplementedError
242  syn keyword pythonExceptions	OSError OverflowError ReferenceError
243  syn keyword pythonExceptions	RuntimeError StopIteration SyntaxError
244  syn keyword pythonExceptions	SystemError SystemExit TabError TypeError
245  syn keyword pythonExceptions	UnboundLocalError UnicodeError
246  syn keyword pythonExceptions	UnicodeDecodeError UnicodeEncodeError
247  syn keyword pythonExceptions	UnicodeTranslateError ValueError
248  syn keyword pythonExceptions	ZeroDivisionError
249  " builtin OS exceptions in Python 3
250  syn keyword pythonExceptions	BlockingIOError BrokenPipeError
251  syn keyword pythonExceptions	ChildProcessError ConnectionAbortedError
252  syn keyword pythonExceptions	ConnectionError ConnectionRefusedError
253  syn keyword pythonExceptions	ConnectionResetError FileExistsError
254  syn keyword pythonExceptions	FileNotFoundError InterruptedError
255  syn keyword pythonExceptions	IsADirectoryError NotADirectoryError
256  syn keyword pythonExceptions	PermissionError ProcessLookupError
257  syn keyword pythonExceptions	RecursionError StopAsyncIteration
258  syn keyword pythonExceptions	TimeoutError
259  " builtin exceptions deprecated/removed in Python 3
260  syn keyword pythonExceptions	IOError VMSError WindowsError
261  " builtin warnings
262  syn keyword pythonExceptions	BytesWarning DeprecationWarning FutureWarning
263  syn keyword pythonExceptions	ImportWarning PendingDeprecationWarning
264  syn keyword pythonExceptions	RuntimeWarning SyntaxWarning UnicodeWarning
265  syn keyword pythonExceptions	UserWarning Warning
266  " builtin warnings in Python 3
267  syn keyword pythonExceptions	ResourceWarning
268endif
269
270if exists("python_space_error_highlight")
271  " trailing whitespace
272  syn match   pythonSpaceError	display excludenl "\s\+$"
273  " mixed tabs and spaces
274  syn match   pythonSpaceError	display " \+\t"
275  syn match   pythonSpaceError	display "\t\+ "
276endif
277
278" Do not spell doctests inside strings.
279" Notice that the end of a string, either ''', or """, will end the contained
280" doctest too.  Thus, we do *not* need to have it as an end pattern.
281if !exists("python_no_doctest_highlight")
282  if !exists("python_no_doctest_code_highlight")
283    syn region pythonDoctest
284	  \ start="^\s*>>>\s" end="^\s*$"
285	  \ contained contains=ALLBUT,pythonDoctest,pythonFunction,@Spell
286    syn region pythonDoctestValue
287	  \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$"
288	  \ contained
289  else
290    syn region pythonDoctest
291	  \ start="^\s*>>>" end="^\s*$"
292	  \ contained contains=@NoSpell
293  endif
294endif
295
296" Sync at the beginning of class, function, or method definition.
297syn sync match pythonSync grouphere NONE "^\%(def\|class\)\s\+\h\w*\s*[(:]"
298
299" The default highlight links.  Can be overridden later.
300hi def link pythonStatement		Statement
301hi def link pythonConditional		Conditional
302hi def link pythonRepeat		Repeat
303hi def link pythonOperator		Operator
304hi def link pythonException		Exception
305hi def link pythonInclude		Include
306hi def link pythonAsync			Statement
307hi def link pythonDecorator		Define
308hi def link pythonDecoratorName		Function
309hi def link pythonFunction		Function
310hi def link pythonComment		Comment
311hi def link pythonTodo			Todo
312hi def link pythonString		String
313hi def link pythonRawString		String
314hi def link pythonQuotes		String
315hi def link pythonTripleQuotes		pythonQuotes
316hi def link pythonEscape		Special
317if !exists("python_no_number_highlight")
318  hi def link pythonNumber		Number
319endif
320if !exists("python_no_builtin_highlight")
321  hi def link pythonBuiltin		Function
322endif
323if !exists("python_no_exception_highlight")
324  hi def link pythonExceptions		Structure
325endif
326if exists("python_space_error_highlight")
327  hi def link pythonSpaceError		Error
328endif
329if !exists("python_no_doctest_highlight")
330  hi def link pythonDoctest		Special
331  hi def link pythonDoctestValue	Define
332endif
333
334let b:current_syntax = "python"
335
336let &cpo = s:cpo_save
337unlet s:cpo_save
338
339" vim:set sw=2 sts=2 ts=8 noet:
340