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