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