xref: /vim-8.2.3635/runtime/syntax/python.vim (revision 87fd0924)
1" Vim syntax file
2" Language:	Python
3" Maintainer:	Zvezdan Petkovic <[email protected]>
4" Last Change:	2021 Feb 15
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/reference/lexical_analysis.html#keywords.
75" Groups are in the order presented in NAMING CONVENTIONS in syntax.txt.
76" Exceptions come last at the end of each group (class and def below).
77"
78" The list can be checked using:
79"
80" python3 -c 'import keyword, pprint; pprint.pprint(keyword.kwlist, compact=True)'
81"
82syn keyword pythonStatement	False None True
83syn keyword pythonStatement	as assert break continue del global
84syn keyword pythonStatement	lambda nonlocal pass return with yield
85syn keyword pythonStatement	class def nextgroup=pythonFunction skipwhite
86syn keyword pythonConditional	elif else if
87syn keyword pythonRepeat	for while
88syn keyword pythonOperator	and in is not or
89syn keyword pythonException	except finally raise try
90syn keyword pythonInclude	from import
91syn keyword pythonAsync		async await
92
93" Decorators
94" A dot must be allowed because of @MyClass.myfunc decorators.
95syn match   pythonDecorator	"@" display contained
96syn match   pythonDecoratorName	"@\s*\h\%(\w\|\.\)*" display contains=pythonDecorator
97
98" Python 3.5 introduced the use of the same symbol for matrix multiplication:
99" https://www.python.org/dev/peps/pep-0465/.  We now have to exclude the
100" symbol from highlighting when used in that context.
101" Single line multiplication.
102syn match   pythonMatrixMultiply
103      \ "\%(\w\|[])]\)\s*@"
104      \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
105      \ transparent
106" Multiplication continued on the next line after backslash.
107syn match   pythonMatrixMultiply
108      \ "[^\\]\\\s*\n\%(\s*\.\.\.\s\)\=\s\+@"
109      \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
110      \ transparent
111" Multiplication in a parenthesized expression over multiple lines with @ at
112" the start of each continued line; very similar to decorators and complex.
113syn match   pythonMatrixMultiply
114      \ "^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*\n\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}\n\%(\s*\.\.\.\s\)\=\s\+@\)*"
115      \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue
116      \ transparent
117
118syn match   pythonFunction	"\h\w*" display contained
119
120syn match   pythonComment	"#.*$" contains=pythonTodo,@Spell
121syn keyword pythonTodo		FIXME NOTE NOTES TODO XXX contained
122
123" Triple-quoted strings can contain doctests.
124syn region  pythonString matchgroup=pythonQuotes
125      \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
126      \ contains=pythonEscape,@Spell
127syn region  pythonString matchgroup=pythonTripleQuotes
128      \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend
129      \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell
130syn region  pythonRawString matchgroup=pythonQuotes
131      \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
132      \ contains=@Spell
133syn region  pythonRawString matchgroup=pythonTripleQuotes
134      \ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend
135      \ contains=pythonSpaceError,pythonDoctest,@Spell
136
137syn match   pythonEscape	+\\[abfnrtv'"\\]+ contained
138syn match   pythonEscape	"\\\o\{1,3}" contained
139syn match   pythonEscape	"\\x\x\{2}" contained
140syn match   pythonEscape	"\%(\\u\x\{4}\|\\U\x\{8}\)" contained
141" Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/
142syn match   pythonEscape	"\\N{\a\+\%(\s\a\+\)*}" contained
143syn match   pythonEscape	"\\$"
144
145" It is very important to understand all details before changing the
146" regular expressions below or their order.
147" The word boundaries are *not* the floating-point number boundaries
148" because of a possible leading or trailing decimal point.
149" The expressions below ensure that all valid number literals are
150" highlighted, and invalid number literals are not.  For example,
151"
152" - a decimal point in '4.' at the end of a line is highlighted,
153" - a second dot in 1.0.0 is not highlighted,
154" - 08 is not highlighted,
155" - 08e0 or 08j are highlighted,
156"
157" and so on, as specified in the 'Python Language Reference'.
158" https://docs.python.org/reference/lexical_analysis.html#numeric-literals
159if !exists("python_no_number_highlight")
160  " numbers (including longs and complex)
161  syn match   pythonNumber	"\<0[oO]\=\o\+[Ll]\=\>"
162  syn match   pythonNumber	"\<0[xX]\x\+[Ll]\=\>"
163  syn match   pythonNumber	"\<0[bB][01]\+[Ll]\=\>"
164  syn match   pythonNumber	"\<\%([1-9]\d*\|0\)[Ll]\=\>"
165  syn match   pythonNumber	"\<\d\+[jJ]\>"
166  syn match   pythonNumber	"\<\d\+[eE][+-]\=\d\+[jJ]\=\>"
167  syn match   pythonNumber
168	\ "\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@="
169  syn match   pythonNumber
170	\ "\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>"
171endif
172
173" Group the built-ins in the order in the 'Python Library Reference' for
174" easier comparison.
175" https://docs.python.org/library/constants.html
176" http://docs.python.org/library/functions.html
177" Python built-in functions are in alphabetical order.
178"
179" The list can be checked using:
180"
181" python3 -c 'import builtins, pprint; pprint.pprint(dir(builtins), compact=True)'
182"
183" The constants added by the `site` module are not listed below because they
184" should not be used in programs, only in interactive interpreter.
185" Similarly for some other attributes and functions `__`-enclosed from the
186" output of the above command.
187"
188if !exists("python_no_builtin_highlight")
189  " built-in constants
190  " 'False', 'True', and 'None' are also reserved words in Python 3
191  syn keyword pythonBuiltin	False True None
192  syn keyword pythonBuiltin	NotImplemented Ellipsis __debug__
193  " constants added by the `site` module
194  syn keyword pythonBuiltin	quit exit copyright credits license
195  " built-in functions
196  syn keyword pythonBuiltin	abs all any ascii bin bool breakpoint bytearray
197  syn keyword pythonBuiltin	bytes callable chr classmethod compile complex
198  syn keyword pythonBuiltin	delattr dict dir divmod enumerate eval exec
199  syn keyword pythonBuiltin	filter float format frozenset getattr globals
200  syn keyword pythonBuiltin	hasattr hash help hex id input int isinstance
201  syn keyword pythonBuiltin	issubclass iter len list locals map max
202  syn keyword pythonBuiltin	memoryview min next object oct open ord pow
203  syn keyword pythonBuiltin	print property range repr reversed round set
204  syn keyword pythonBuiltin	setattr slice sorted staticmethod str sum super
205  syn keyword pythonBuiltin	tuple type vars zip __import__
206  " avoid highlighting attributes as builtins
207  syn match   pythonAttribute	/\.\h\w*/hs=s+1
208	\ contains=ALLBUT,pythonBuiltin,pythonFunction,pythonAsync
209	\ transparent
210endif
211
212" From the 'Python Library Reference' class hierarchy at the bottom.
213" http://docs.python.org/library/exceptions.html
214if !exists("python_no_exception_highlight")
215  " builtin base exceptions (used mostly as base classes for other exceptions)
216  syn keyword pythonExceptions	BaseException Exception
217  syn keyword pythonExceptions	ArithmeticError BufferError LookupError
218  " builtin exceptions (actually raised)
219  syn keyword pythonExceptions	AssertionError AttributeError EOFError
220  syn keyword pythonExceptions	FloatingPointError GeneratorExit ImportError
221  syn keyword pythonExceptions	IndentationError IndexError KeyError
222  syn keyword pythonExceptions	KeyboardInterrupt MemoryError
223  syn keyword pythonExceptions	ModuleNotFoundError NameError
224  syn keyword pythonExceptions	NotImplementedError OSError OverflowError
225  syn keyword pythonExceptions	RecursionError ReferenceError RuntimeError
226  syn keyword pythonExceptions	StopAsyncIteration StopIteration SyntaxError
227  syn keyword pythonExceptions	SystemError SystemExit TabError TypeError
228  syn keyword pythonExceptions	UnboundLocalError UnicodeDecodeError
229  syn keyword pythonExceptions	UnicodeEncodeError UnicodeError
230  syn keyword pythonExceptions	UnicodeTranslateError ValueError
231  syn keyword pythonExceptions	ZeroDivisionError
232  " builtin exception aliases for OSError
233  syn keyword pythonExceptions	EnvironmentError IOError WindowsError
234  " builtin OS exceptions in Python 3
235  syn keyword pythonExceptions	BlockingIOError BrokenPipeError
236  syn keyword pythonExceptions	ChildProcessError ConnectionAbortedError
237  syn keyword pythonExceptions	ConnectionError ConnectionRefusedError
238  syn keyword pythonExceptions	ConnectionResetError FileExistsError
239  syn keyword pythonExceptions	FileNotFoundError InterruptedError
240  syn keyword pythonExceptions	IsADirectoryError NotADirectoryError
241  syn keyword pythonExceptions	PermissionError ProcessLookupError TimeoutError
242  " builtin warnings
243  syn keyword pythonExceptions	BytesWarning DeprecationWarning FutureWarning
244  syn keyword pythonExceptions	ImportWarning PendingDeprecationWarning
245  syn keyword pythonExceptions	ResourceWarning RuntimeWarning
246  syn keyword pythonExceptions	SyntaxWarning UnicodeWarning
247  syn keyword pythonExceptions	UserWarning Warning
248endif
249
250if exists("python_space_error_highlight")
251  " trailing whitespace
252  syn match   pythonSpaceError	display excludenl "\s\+$"
253  " mixed tabs and spaces
254  syn match   pythonSpaceError	display " \+\t"
255  syn match   pythonSpaceError	display "\t\+ "
256endif
257
258" Do not spell doctests inside strings.
259" Notice that the end of a string, either ''', or """, will end the contained
260" doctest too.  Thus, we do *not* need to have it as an end pattern.
261if !exists("python_no_doctest_highlight")
262  if !exists("python_no_doctest_code_highlight")
263    syn region pythonDoctest
264	  \ start="^\s*>>>\s" end="^\s*$"
265	  \ contained contains=ALLBUT,pythonDoctest,pythonFunction,@Spell
266    syn region pythonDoctestValue
267	  \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$"
268	  \ contained
269  else
270    syn region pythonDoctest
271	  \ start="^\s*>>>" end="^\s*$"
272	  \ contained contains=@NoSpell
273  endif
274endif
275
276" Sync at the beginning of class, function, or method definition.
277syn sync match pythonSync grouphere NONE "^\%(def\|class\)\s\+\h\w*\s*[(:]"
278
279" The default highlight links.  Can be overridden later.
280hi def link pythonStatement		Statement
281hi def link pythonConditional		Conditional
282hi def link pythonRepeat		Repeat
283hi def link pythonOperator		Operator
284hi def link pythonException		Exception
285hi def link pythonInclude		Include
286hi def link pythonAsync			Statement
287hi def link pythonDecorator		Define
288hi def link pythonDecoratorName		Function
289hi def link pythonFunction		Function
290hi def link pythonComment		Comment
291hi def link pythonTodo			Todo
292hi def link pythonString		String
293hi def link pythonRawString		String
294hi def link pythonQuotes		String
295hi def link pythonTripleQuotes		pythonQuotes
296hi def link pythonEscape		Special
297if !exists("python_no_number_highlight")
298  hi def link pythonNumber		Number
299endif
300if !exists("python_no_builtin_highlight")
301  hi def link pythonBuiltin		Function
302endif
303if !exists("python_no_exception_highlight")
304  hi def link pythonExceptions		Structure
305endif
306if exists("python_space_error_highlight")
307  hi def link pythonSpaceError		Error
308endif
309if !exists("python_no_doctest_highlight")
310  hi def link pythonDoctest		Special
311  hi def link pythonDoctestValue	Define
312endif
313
314let b:current_syntax = "python"
315
316let &cpo = s:cpo_save
317unlet s:cpo_save
318
319" vim:set sw=2 sts=2 ts=8 noet:
320