blob: 1951680a62208cbc0646405f4cdcfd9428204cc4 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: Python
Bram Moolenaar541f92d2015-06-19 13:27:23 +02003" Maintainer: Zvezdan Petkovic <zpetkovic@acm.org>
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +02004" Last Change: 2016 Aug 14
Bram Moolenaar541f92d2015-06-19 13:27:23 +02005" Credits: Neil Schemenauer <nas@python.ca>
Bram Moolenaar5c736222010-01-06 20:54:52 +01006" Dmitry Vasiliev
Bram Moolenaar071d4272004-06-13 20:20:40 +00007"
Bram Moolenaar5c736222010-01-06 20:54:52 +01008" This version is a major rewrite by Zvezdan Petkovic.
Bram Moolenaar071d4272004-06-13 20:20:40 +00009"
Bram Moolenaar5c736222010-01-06 20:54:52 +010010" - introduced highlighting of doctests
11" - updated keywords, built-ins, and exceptions
12" - corrected regular expressions for
Bram Moolenaar071d4272004-06-13 20:20:40 +000013"
Bram Moolenaar5c736222010-01-06 20:54:52 +010014" * functions
15" * decorators
16" * strings
17" * escapes
18" * numbers
19" * space error
Bram Moolenaar071d4272004-06-13 20:20:40 +000020"
Bram Moolenaar5c736222010-01-06 20:54:52 +010021" - corrected synchronization
22" - more highlighting is ON by default, except
23" - space error highlighting is OFF by default
Bram Moolenaar071d4272004-06-13 20:20:40 +000024"
Bram Moolenaar5c736222010-01-06 20:54:52 +010025" Optional highlighting can be controlled using these variables.
Bram Moolenaar071d4272004-06-13 20:20:40 +000026"
Bram Moolenaar5c736222010-01-06 20:54:52 +010027" 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
Bram Moolenaar071d4272004-06-13 20:20:40 +000033"
Bram Moolenaar5c736222010-01-06 20:54:52 +010034" All the options above can be switched on together.
Bram Moolenaar071d4272004-06-13 20:20:40 +000035"
Bram Moolenaar5c736222010-01-06 20:54:52 +010036" let python_highlight_all = 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000037"
38
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020039" quit when a syntax file was already loaded.
40if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000041 finish
42endif
43
Bram Moolenaar00659062010-09-21 22:34:02 +020044" 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
Bram Moolenaar5c736222010-01-06 20:54:52 +010049" Keep Python keywords in alphabetical order inside groups for easy
50" comparison with the table in the 'Python Language Reference'
Bram Moolenaarf9132812015-07-21 19:19:13 +020051" https://docs.python.org/2/reference/lexical_analysis.html#keywords,
52" https://docs.python.org/3/reference/lexical_analysis.html#keywords.
Bram Moolenaar5c736222010-01-06 20:54:52 +010053" 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"
Bram Moolenaarf9132812015-07-21 19:19:13 +020059" 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,
Bram Moolenaar5c736222010-01-06 20:54:52 +010061" the last definition takes precedence.
62"
Bram Moolenaarf9132812015-07-21 19:19:13 +020063" - '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
Bram Moolenaar5c736222010-01-06 20:54:52 +010066" built-in below.
Bram Moolenaarf9132812015-07-21 19:19:13 +020067" - '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)
Bram Moolenaarca635012015-09-25 20:34:21 +020070" - async and await were added in Python 3.5 and are soft keywords.
Bram Moolenaar5c736222010-01-06 20:54:52 +010071"
Bram Moolenaar6f1d9a02016-07-24 14:12:38 +020072syn keyword pythonStatement False None True
Bram Moolenaar5c736222010-01-06 20:54:52 +010073syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +000077syn keyword pythonRepeat for while
Bram Moolenaar071d4272004-06-13 20:20:40 +000078syn keyword pythonOperator and in is not or
Bram Moolenaar5c736222010-01-06 20:54:52 +010079syn keyword pythonException except finally raise try
80syn keyword pythonInclude from import
Bram Moolenaarca635012015-09-25 20:34:21 +020081syn keyword pythonAsync async await
Bram Moolenaar071d4272004-06-13 20:20:40 +000082
Bram Moolenaar9c102382006-05-03 21:26:49 +000083" Decorators (new in Python 2.4)
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +020084" 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*\n\s*\%(\.\.\.\s\+\)\=\%(@\s*\h\|\%(def\|class\)\s\+\)\)\@="
92 \ display nextgroup=pythonDecoratorName skipwhite
93
Bram Moolenaar5c736222010-01-06 20:54:52 +010094" A dot must be allowed because of @MyClass.myfunc decorators.
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +020095" 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*\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.
Bram Moolenaar5c736222010-01-06 20:54:52 +0100105syn match pythonFunction
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200106 \ "\%(\%(^\s*\)\%(\%(>>>\|\.\.\.\)\s\+\)\=\%(def\|class\)\s\+\)\@<=\h\w*"
107 \ contained
Bram Moolenaar9c102382006-05-03 21:26:49 +0000108
Bram Moolenaar5c736222010-01-06 20:54:52 +0100109syn match pythonComment "#.*$" contains=pythonTodo,@Spell
110syn keyword pythonTodo FIXME NOTE NOTES TODO XXX contained
111
112" Triple-quoted strings can contain doctests.
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200113syn region pythonString matchgroup=pythonQuotes
Bram Moolenaar5c736222010-01-06 20:54:52 +0100114 \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
115 \ contains=pythonEscape,@Spell
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200116syn region pythonString matchgroup=pythonTripleQuotes
Bram Moolenaar5c736222010-01-06 20:54:52 +0100117 \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend
118 \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200119syn region pythonRawString matchgroup=pythonQuotes
Bram Moolenaar5c736222010-01-06 20:54:52 +0100120 \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
121 \ contains=@Spell
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200122syn region pythonRawString matchgroup=pythonTripleQuotes
Bram Moolenaar5c736222010-01-06 20:54:52 +0100123 \ 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/
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200131syn match pythonEscape "\\N{\a\+\%(\s\a\+\)*}" contained
Bram Moolenaar5c736222010-01-06 20:54:52 +0100132syn match pythonEscape "\\$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000133
134if exists("python_highlight_all")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100135 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000151endif
152
Bram Moolenaar5c736222010-01-06 20:54:52 +0100153" 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'.
Bram Moolenaarf9132812015-07-21 19:19:13 +0200166" https://docs.python.org/2/reference/lexical_analysis.html#numeric-literals
167" https://docs.python.org/3/reference/lexical_analysis.html#numeric-literals
Bram Moolenaar5c736222010-01-06 20:54:52 +0100168if !exists("python_no_number_highlight")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000169 " numbers (including longs and complex)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100170 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
Bram Moolenaarf9132812015-07-21 19:19:13 +0200179 \ "\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000180endif
181
Bram Moolenaar5c736222010-01-06 20:54:52 +0100182" Group the built-ins in the order in the 'Python Library Reference' for
183" easier comparison.
Bram Moolenaarf9132812015-07-21 19:19:13 +0200184" 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
Bram Moolenaar5c736222010-01-06 20:54:52 +0100190" Python built-in functions are in alphabetical order.
191if !exists("python_no_builtin_highlight")
192 " built-in constants
Bram Moolenaarf9132812015-07-21 19:19:13 +0200193 " 'False', 'True', and 'None' are also reserved words in Python 3
Bram Moolenaar5c736222010-01-06 20:54:52 +0100194 syn keyword pythonBuiltin False True None
195 syn keyword pythonBuiltin NotImplemented Ellipsis __debug__
196 " built-in functions
Bram Moolenaarf9132812015-07-21 19:19:13 +0200197 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
Bram Moolenaar5c736222010-01-06 20:54:52 +0100200 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
Bram Moolenaarf9132812015-07-21 19:19:13 +0200203 syn keyword pythonBuiltin memoryview min next object oct open ord pow
204 syn keyword pythonBuiltin print property range repr reversed round set
Bram Moolenaar5c736222010-01-06 20:54:52 +0100205 syn keyword pythonBuiltin setattr slice sorted staticmethod str
206 syn keyword pythonBuiltin sum super tuple type vars zip __import__
Bram Moolenaarf9132812015-07-21 19:19:13 +0200207 " Python 2 only
208 syn keyword pythonBuiltin basestring cmp execfile file
Bram Moolenaar5c736222010-01-06 20:54:52 +0100209 syn keyword pythonBuiltin long raw_input reduce reload unichr
210 syn keyword pythonBuiltin unicode xrange
Bram Moolenaarf9132812015-07-21 19:19:13 +0200211 " Python 3 only
212 syn keyword pythonBuiltin ascii bytes exec
213 " non-essential built-in functions; Python 2 only
Bram Moolenaar5c736222010-01-06 20:54:52 +0100214 syn keyword pythonBuiltin apply buffer coerce intern
Bram Moolenaar77cdfd12016-03-12 12:57:59 +0100215 " avoid highlighting attributes as builtins
216 syn match pythonAttribute /\.\h\w*/hs=s+1 contains=ALLBUT,pythonBuiltin transparent
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217endif
218
Bram Moolenaar5c736222010-01-06 20:54:52 +0100219" From the 'Python Library Reference' class hierarchy at the bottom.
Bram Moolenaarf9132812015-07-21 19:19:13 +0200220" http://docs.python.org/2/library/exceptions.html
221" http://docs.python.org/3/library/exceptions.html
Bram Moolenaar5c736222010-01-06 20:54:52 +0100222if !exists("python_no_exception_highlight")
Bram Moolenaarf9132812015-07-21 19:19:13 +0200223 " builtin base exceptions (used mostly as base classes for other exceptions)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100224 syn keyword pythonExceptions BaseException Exception
Bram Moolenaarf9132812015-07-21 19:19:13 +0200225 syn keyword pythonExceptions ArithmeticError BufferError
Bram Moolenaar5c736222010-01-06 20:54:52 +0100226 syn keyword pythonExceptions LookupError
Bram Moolenaarf9132812015-07-21 19:19:13 +0200227 " builtin base exceptions removed in Python 3
228 syn keyword pythonExceptions EnvironmentError StandardError
Bram Moolenaar5c736222010-01-06 20:54:52 +0100229 " builtin exceptions (actually raised)
Bram Moolenaarf9132812015-07-21 19:19:13 +0200230 syn keyword pythonExceptions AssertionError AttributeError
Bram Moolenaar5c736222010-01-06 20:54:52 +0100231 syn keyword pythonExceptions EOFError FloatingPointError GeneratorExit
Bram Moolenaarf9132812015-07-21 19:19:13 +0200232 syn keyword pythonExceptions ImportError IndentationError
Bram Moolenaar5c736222010-01-06 20:54:52 +0100233 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
Bram Moolenaarf9132812015-07-21 19:19:13 +0200240 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
Bram Moolenaarca635012015-09-25 20:34:21 +0200250 syn keyword pythonExceptions RecursionError StopAsyncIteration
Bram Moolenaarf9132812015-07-21 19:19:13 +0200251 syn keyword pythonExceptions TimeoutError
252 " builtin exceptions deprecated/removed in Python 3
253 syn keyword pythonExceptions IOError VMSError WindowsError
Bram Moolenaar5c736222010-01-06 20:54:52 +0100254 " 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
Bram Moolenaarf9132812015-07-21 19:19:13 +0200259 " builtin warnings in Python 3
260 syn keyword pythonExceptions ResourceWarning
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261endif
262
Bram Moolenaar5c736222010-01-06 20:54:52 +0100263if exists("python_space_error_highlight")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000264 " trailing whitespace
Bram Moolenaar5c736222010-01-06 20:54:52 +0100265 syn match pythonSpaceError display excludenl "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000266 " mixed tabs and spaces
Bram Moolenaar5c736222010-01-06 20:54:52 +0100267 syn match pythonSpaceError display " \+\t"
268 syn match pythonSpaceError display "\t\+ "
Bram Moolenaar071d4272004-06-13 20:20:40 +0000269endif
270
Bram Moolenaar5c736222010-01-06 20:54:52 +0100271" 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")
Bram Moolenaar34700a62013-03-07 13:20:54 +0100275 if !exists("python_no_doctest_code_highlight")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100276 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*("
Bram Moolenaar071d4272004-06-13 20:20:40 +0000291
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200292command -nargs=+ HiLink hi def link <args>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000293
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200294" The default highlight links. Can be overridden later.
295HiLink pythonStatement Statement
296HiLink pythonConditional Conditional
297HiLink pythonRepeat Repeat
298HiLink pythonOperator Operator
299HiLink pythonException Exception
300HiLink pythonInclude Include
301HiLink pythonAsync Statement
302HiLink pythonDecorator Define
303HiLink pythonDecoratorName Function
304HiLink pythonFunction Function
305HiLink pythonComment Comment
306HiLink pythonTodo Todo
307HiLink pythonString String
308HiLink pythonRawString String
309HiLink pythonQuotes String
310HiLink pythonTripleQuotes pythonQuotes
311HiLink pythonEscape Special
312if !exists("python_no_number_highlight")
313 HiLink pythonNumber Number
Bram Moolenaar071d4272004-06-13 20:20:40 +0000314endif
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200315if !exists("python_no_builtin_highlight")
316 HiLink pythonBuiltin Function
317endif
318if !exists("python_no_exception_highlight")
319 HiLink pythonExceptions Structure
320endif
321if exists("python_space_error_highlight")
322 HiLink pythonSpaceError Error
323endif
324if !exists("python_no_doctest_highlight")
325 HiLink pythonDoctest Special
326 HiLink pythonDoctestValue Define
327endif
328
329delcommand HiLink
Bram Moolenaar071d4272004-06-13 20:20:40 +0000330
331let b:current_syntax = "python"
332
Bram Moolenaar00659062010-09-21 22:34:02 +0200333let &cpo = s:cpo_save
334unlet s:cpo_save
335
Bram Moolenaar5c736222010-01-06 20:54:52 +0100336" vim:set sw=2 sts=2 ts=8 noet: