1071d4279SBram Moolenaar" Vim syntax file 2071d4279SBram Moolenaar" Language: Python 3541f92d6SBram Moolenaar" Maintainer: Zvezdan Petkovic <[email protected]> 4*9faec4e3SBram Moolenaar" Last Change: 2021 Feb 15 5541f92d6SBram Moolenaar" Credits: Neil Schemenauer <[email protected]> 65c73622aSBram Moolenaar" Dmitry Vasiliev 7071d4279SBram Moolenaar" 85c73622aSBram Moolenaar" This version is a major rewrite by Zvezdan Petkovic. 9071d4279SBram Moolenaar" 105c73622aSBram Moolenaar" - introduced highlighting of doctests 115c73622aSBram Moolenaar" - updated keywords, built-ins, and exceptions 125c73622aSBram Moolenaar" - corrected regular expressions for 13071d4279SBram Moolenaar" 145c73622aSBram Moolenaar" * functions 155c73622aSBram Moolenaar" * decorators 165c73622aSBram Moolenaar" * strings 175c73622aSBram Moolenaar" * escapes 185c73622aSBram Moolenaar" * numbers 195c73622aSBram Moolenaar" * space error 20071d4279SBram Moolenaar" 215c73622aSBram Moolenaar" - corrected synchronization 225c73622aSBram Moolenaar" - more highlighting is ON by default, except 235c73622aSBram Moolenaar" - space error highlighting is OFF by default 24071d4279SBram Moolenaar" 255c73622aSBram Moolenaar" Optional highlighting can be controlled using these variables. 26071d4279SBram Moolenaar" 275c73622aSBram Moolenaar" let python_no_builtin_highlight = 1 285c73622aSBram Moolenaar" let python_no_doctest_code_highlight = 1 295c73622aSBram Moolenaar" let python_no_doctest_highlight = 1 305c73622aSBram Moolenaar" let python_no_exception_highlight = 1 315c73622aSBram Moolenaar" let python_no_number_highlight = 1 325c73622aSBram Moolenaar" let python_space_error_highlight = 1 33071d4279SBram Moolenaar" 345c73622aSBram Moolenaar" All the options above can be switched on together. 35071d4279SBram Moolenaar" 36071d4279SBram Moolenaar" let python_highlight_all = 1 37071d4279SBram Moolenaar" 38071d4279SBram Moolenaar 3989bcfda6SBram Moolenaar" quit when a syntax file was already loaded. 4089bcfda6SBram Moolenaarif exists("b:current_syntax") 41071d4279SBram Moolenaar finish 42071d4279SBram Moolenaarendif 43071d4279SBram Moolenaar 4400659069SBram Moolenaar" We need nocompatible mode in order to continue lines with backslashes. 4500659069SBram Moolenaar" Original setting will be restored. 4600659069SBram Moolenaarlet s:cpo_save = &cpo 4700659069SBram Moolenaarset cpo&vim 4800659069SBram Moolenaar 49b4ada79aSBram Moolenaarif exists("python_no_doctest_highlight") 50b4ada79aSBram Moolenaar let python_no_doctest_code_highlight = 1 51b4ada79aSBram Moolenaarendif 52b4ada79aSBram Moolenaar 53b4ada79aSBram Moolenaarif exists("python_highlight_all") 54b4ada79aSBram Moolenaar if exists("python_no_builtin_highlight") 55b4ada79aSBram Moolenaar unlet python_no_builtin_highlight 56b4ada79aSBram Moolenaar endif 57b4ada79aSBram Moolenaar if exists("python_no_doctest_code_highlight") 58b4ada79aSBram Moolenaar unlet python_no_doctest_code_highlight 59b4ada79aSBram Moolenaar endif 60b4ada79aSBram Moolenaar if exists("python_no_doctest_highlight") 61b4ada79aSBram Moolenaar unlet python_no_doctest_highlight 62b4ada79aSBram Moolenaar endif 63b4ada79aSBram Moolenaar if exists("python_no_exception_highlight") 64b4ada79aSBram Moolenaar unlet python_no_exception_highlight 65b4ada79aSBram Moolenaar endif 66b4ada79aSBram Moolenaar if exists("python_no_number_highlight") 67b4ada79aSBram Moolenaar unlet python_no_number_highlight 68b4ada79aSBram Moolenaar endif 69b4ada79aSBram Moolenaar let python_space_error_highlight = 1 70b4ada79aSBram Moolenaarendif 71b4ada79aSBram Moolenaar 725c73622aSBram Moolenaar" Keep Python keywords in alphabetical order inside groups for easy 735c73622aSBram Moolenaar" comparison with the table in the 'Python Language Reference' 74*9faec4e3SBram Moolenaar" https://docs.python.org/reference/lexical_analysis.html#keywords. 755c73622aSBram Moolenaar" Groups are in the order presented in NAMING CONVENTIONS in syntax.txt. 765c73622aSBram Moolenaar" Exceptions come last at the end of each group (class and def below). 775c73622aSBram Moolenaar" 78*9faec4e3SBram Moolenaar" The list can be checked using: 795c73622aSBram Moolenaar" 80*9faec4e3SBram Moolenaar" python3 -c 'import keyword, pprint; pprint.pprint(keyword.kwlist, compact=True)' 815c73622aSBram Moolenaar" 826f1d9a09SBram Moolenaarsyn keyword pythonStatement False None True 83*9faec4e3SBram Moolenaarsyn keyword pythonStatement as assert break continue del global 84*9faec4e3SBram Moolenaarsyn keyword pythonStatement lambda nonlocal pass return with yield 855c73622aSBram Moolenaarsyn keyword pythonStatement class def nextgroup=pythonFunction skipwhite 865c73622aSBram Moolenaarsyn keyword pythonConditional elif else if 87071d4279SBram Moolenaarsyn keyword pythonRepeat for while 88071d4279SBram Moolenaarsyn keyword pythonOperator and in is not or 895c73622aSBram Moolenaarsyn keyword pythonException except finally raise try 905c73622aSBram Moolenaarsyn keyword pythonInclude from import 91ca63501fSBram Moolenaarsyn keyword pythonAsync async await 92071d4279SBram Moolenaar 93*9faec4e3SBram Moolenaar" Decorators 945c73622aSBram Moolenaar" A dot must be allowed because of @MyClass.myfunc decorators. 95b4ada79aSBram Moolenaarsyn match pythonDecorator "@" display contained 96b4ada79aSBram Moolenaarsyn match pythonDecoratorName "@\s*\h\%(\w\|\.\)*" display contains=pythonDecorator 97e4a3bcf2SBram Moolenaar 98b4ada79aSBram Moolenaar" Python 3.5 introduced the use of the same symbol for matrix multiplication: 99b4ada79aSBram Moolenaar" https://www.python.org/dev/peps/pep-0465/. We now have to exclude the 100b4ada79aSBram Moolenaar" symbol from highlighting when used in that context. 101b4ada79aSBram Moolenaar" Single line multiplication. 102b4ada79aSBram Moolenaarsyn match pythonMatrixMultiply 103b4ada79aSBram Moolenaar \ "\%(\w\|[])]\)\s*@" 104b4ada79aSBram Moolenaar \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue 105b4ada79aSBram Moolenaar \ transparent 106b4ada79aSBram Moolenaar" Multiplication continued on the next line after backslash. 107b4ada79aSBram Moolenaarsyn match pythonMatrixMultiply 108b4ada79aSBram Moolenaar \ "[^\\]\\\s*\n\%(\s*\.\.\.\s\)\=\s\+@" 109b4ada79aSBram Moolenaar \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue 110b4ada79aSBram Moolenaar \ transparent 111b4ada79aSBram Moolenaar" Multiplication in a parenthesized expression over multiple lines with @ at 112b4ada79aSBram Moolenaar" the start of each continued line; very similar to decorators and complex. 113b4ada79aSBram Moolenaarsyn match pythonMatrixMultiply 114b4ada79aSBram Moolenaar \ "^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*\n\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}\n\%(\s*\.\.\.\s\)\=\s\+@\)*" 115b4ada79aSBram Moolenaar \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue 116b4ada79aSBram Moolenaar \ transparent 117b4ada79aSBram Moolenaar 118b4ada79aSBram Moolenaarsyn match pythonFunction "\h\w*" display contained 1199c102387SBram Moolenaar 1205c73622aSBram Moolenaarsyn match pythonComment "#.*$" contains=pythonTodo,@Spell 1215c73622aSBram Moolenaarsyn keyword pythonTodo FIXME NOTE NOTES TODO XXX contained 1225c73622aSBram Moolenaar 1235c73622aSBram Moolenaar" Triple-quoted strings can contain doctests. 124541f92d6SBram Moolenaarsyn region pythonString matchgroup=pythonQuotes 1255c73622aSBram Moolenaar \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" 1265c73622aSBram Moolenaar \ contains=pythonEscape,@Spell 127541f92d6SBram Moolenaarsyn region pythonString matchgroup=pythonTripleQuotes 1285c73622aSBram Moolenaar \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend 1295c73622aSBram Moolenaar \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell 130541f92d6SBram Moolenaarsyn region pythonRawString matchgroup=pythonQuotes 1315c73622aSBram Moolenaar \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1" 1325c73622aSBram Moolenaar \ contains=@Spell 133541f92d6SBram Moolenaarsyn region pythonRawString matchgroup=pythonTripleQuotes 1345c73622aSBram Moolenaar \ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend 1355c73622aSBram Moolenaar \ contains=pythonSpaceError,pythonDoctest,@Spell 1365c73622aSBram Moolenaar 137071d4279SBram Moolenaarsyn match pythonEscape +\\[abfnrtv'"\\]+ contained 138071d4279SBram Moolenaarsyn match pythonEscape "\\\o\{1,3}" contained 139071d4279SBram Moolenaarsyn match pythonEscape "\\x\x\{2}" contained 1405c73622aSBram Moolenaarsyn match pythonEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained 1415c73622aSBram Moolenaar" Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/ 142541f92d6SBram Moolenaarsyn match pythonEscape "\\N{\a\+\%(\s\a\+\)*}" contained 143071d4279SBram Moolenaarsyn match pythonEscape "\\$" 144071d4279SBram Moolenaar 1455c73622aSBram Moolenaar" It is very important to understand all details before changing the 1465c73622aSBram Moolenaar" regular expressions below or their order. 1475c73622aSBram Moolenaar" The word boundaries are *not* the floating-point number boundaries 1485c73622aSBram Moolenaar" because of a possible leading or trailing decimal point. 1495c73622aSBram Moolenaar" The expressions below ensure that all valid number literals are 1505c73622aSBram Moolenaar" highlighted, and invalid number literals are not. For example, 1515c73622aSBram Moolenaar" 1525c73622aSBram Moolenaar" - a decimal point in '4.' at the end of a line is highlighted, 1535c73622aSBram Moolenaar" - a second dot in 1.0.0 is not highlighted, 1545c73622aSBram Moolenaar" - 08 is not highlighted, 1555c73622aSBram Moolenaar" - 08e0 or 08j are highlighted, 1565c73622aSBram Moolenaar" 1575c73622aSBram Moolenaar" and so on, as specified in the 'Python Language Reference'. 158*9faec4e3SBram Moolenaar" https://docs.python.org/reference/lexical_analysis.html#numeric-literals 1595c73622aSBram Moolenaarif !exists("python_no_number_highlight") 160071d4279SBram Moolenaar " numbers (including longs and complex) 1615c73622aSBram Moolenaar syn match pythonNumber "\<0[oO]\=\o\+[Ll]\=\>" 1625c73622aSBram Moolenaar syn match pythonNumber "\<0[xX]\x\+[Ll]\=\>" 1635c73622aSBram Moolenaar syn match pythonNumber "\<0[bB][01]\+[Ll]\=\>" 1645c73622aSBram Moolenaar syn match pythonNumber "\<\%([1-9]\d*\|0\)[Ll]\=\>" 1655c73622aSBram Moolenaar syn match pythonNumber "\<\d\+[jJ]\>" 1665c73622aSBram Moolenaar syn match pythonNumber "\<\d\+[eE][+-]\=\d\+[jJ]\=\>" 1675c73622aSBram Moolenaar syn match pythonNumber 1685c73622aSBram Moolenaar \ "\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@=" 1695c73622aSBram Moolenaar syn match pythonNumber 170f9132810SBram Moolenaar \ "\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>" 171071d4279SBram Moolenaarendif 172071d4279SBram Moolenaar 1735c73622aSBram Moolenaar" Group the built-ins in the order in the 'Python Library Reference' for 1745c73622aSBram Moolenaar" easier comparison. 175*9faec4e3SBram Moolenaar" https://docs.python.org/library/constants.html 176*9faec4e3SBram Moolenaar" http://docs.python.org/library/functions.html 1775c73622aSBram Moolenaar" Python built-in functions are in alphabetical order. 178*9faec4e3SBram Moolenaar" 179*9faec4e3SBram Moolenaar" The list can be checked using: 180*9faec4e3SBram Moolenaar" 181*9faec4e3SBram Moolenaar" python3 -c 'import builtins, pprint; pprint.pprint(dir(builtins), compact=True)' 182*9faec4e3SBram Moolenaar" 183*9faec4e3SBram Moolenaar" The constants added by the `site` module are not listed below because they 184*9faec4e3SBram Moolenaar" should not be used in programs, only in interactive interpreter. 185*9faec4e3SBram Moolenaar" Similarly for some other attributes and functions `__`-enclosed from the 186*9faec4e3SBram Moolenaar" output of the above command. 187*9faec4e3SBram Moolenaar" 1885c73622aSBram Moolenaarif !exists("python_no_builtin_highlight") 1895c73622aSBram Moolenaar " built-in constants 190f9132810SBram Moolenaar " 'False', 'True', and 'None' are also reserved words in Python 3 1915c73622aSBram Moolenaar syn keyword pythonBuiltin False True None 1925c73622aSBram Moolenaar syn keyword pythonBuiltin NotImplemented Ellipsis __debug__ 193*9faec4e3SBram Moolenaar " constants added by the `site` module 194*9faec4e3SBram Moolenaar syn keyword pythonBuiltin quit exit copyright credits license 1955c73622aSBram Moolenaar " built-in functions 196*9faec4e3SBram Moolenaar syn keyword pythonBuiltin abs all any ascii bin bool breakpoint bytearray 197*9faec4e3SBram Moolenaar syn keyword pythonBuiltin bytes callable chr classmethod compile complex 198*9faec4e3SBram Moolenaar syn keyword pythonBuiltin delattr dict dir divmod enumerate eval exec 199*9faec4e3SBram Moolenaar syn keyword pythonBuiltin filter float format frozenset getattr globals 200*9faec4e3SBram Moolenaar syn keyword pythonBuiltin hasattr hash help hex id input int isinstance 2015c73622aSBram Moolenaar syn keyword pythonBuiltin issubclass iter len list locals map max 202f9132810SBram Moolenaar syn keyword pythonBuiltin memoryview min next object oct open ord pow 203f9132810SBram Moolenaar syn keyword pythonBuiltin print property range repr reversed round set 204*9faec4e3SBram Moolenaar syn keyword pythonBuiltin setattr slice sorted staticmethod str sum super 205*9faec4e3SBram Moolenaar syn keyword pythonBuiltin tuple type vars zip __import__ 20677cdfd10SBram Moolenaar " avoid highlighting attributes as builtins 207b4ada79aSBram Moolenaar syn match pythonAttribute /\.\h\w*/hs=s+1 208b4ada79aSBram Moolenaar \ contains=ALLBUT,pythonBuiltin,pythonFunction,pythonAsync 209b4ada79aSBram Moolenaar \ transparent 210071d4279SBram Moolenaarendif 211071d4279SBram Moolenaar 2125c73622aSBram Moolenaar" From the 'Python Library Reference' class hierarchy at the bottom. 213*9faec4e3SBram Moolenaar" http://docs.python.org/library/exceptions.html 2145c73622aSBram Moolenaarif !exists("python_no_exception_highlight") 215f9132810SBram Moolenaar " builtin base exceptions (used mostly as base classes for other exceptions) 2165c73622aSBram Moolenaar syn keyword pythonExceptions BaseException Exception 217*9faec4e3SBram Moolenaar syn keyword pythonExceptions ArithmeticError BufferError LookupError 2185c73622aSBram Moolenaar " builtin exceptions (actually raised) 219*9faec4e3SBram Moolenaar syn keyword pythonExceptions AssertionError AttributeError EOFError 220*9faec4e3SBram Moolenaar syn keyword pythonExceptions FloatingPointError GeneratorExit ImportError 221*9faec4e3SBram Moolenaar syn keyword pythonExceptions IndentationError IndexError KeyError 222*9faec4e3SBram Moolenaar syn keyword pythonExceptions KeyboardInterrupt MemoryError 223*9faec4e3SBram Moolenaar syn keyword pythonExceptions ModuleNotFoundError NameError 224*9faec4e3SBram Moolenaar syn keyword pythonExceptions NotImplementedError OSError OverflowError 225*9faec4e3SBram Moolenaar syn keyword pythonExceptions RecursionError ReferenceError RuntimeError 226*9faec4e3SBram Moolenaar syn keyword pythonExceptions StopAsyncIteration StopIteration SyntaxError 2275c73622aSBram Moolenaar syn keyword pythonExceptions SystemError SystemExit TabError TypeError 228*9faec4e3SBram Moolenaar syn keyword pythonExceptions UnboundLocalError UnicodeDecodeError 229*9faec4e3SBram Moolenaar syn keyword pythonExceptions UnicodeEncodeError UnicodeError 230f9132810SBram Moolenaar syn keyword pythonExceptions UnicodeTranslateError ValueError 231f9132810SBram Moolenaar syn keyword pythonExceptions ZeroDivisionError 232*9faec4e3SBram Moolenaar " builtin exception aliases for OSError 233*9faec4e3SBram Moolenaar syn keyword pythonExceptions EnvironmentError IOError WindowsError 234f9132810SBram Moolenaar " builtin OS exceptions in Python 3 235f9132810SBram Moolenaar syn keyword pythonExceptions BlockingIOError BrokenPipeError 236f9132810SBram Moolenaar syn keyword pythonExceptions ChildProcessError ConnectionAbortedError 237f9132810SBram Moolenaar syn keyword pythonExceptions ConnectionError ConnectionRefusedError 238f9132810SBram Moolenaar syn keyword pythonExceptions ConnectionResetError FileExistsError 239f9132810SBram Moolenaar syn keyword pythonExceptions FileNotFoundError InterruptedError 240f9132810SBram Moolenaar syn keyword pythonExceptions IsADirectoryError NotADirectoryError 241*9faec4e3SBram Moolenaar syn keyword pythonExceptions PermissionError ProcessLookupError TimeoutError 2425c73622aSBram Moolenaar " builtin warnings 2435c73622aSBram Moolenaar syn keyword pythonExceptions BytesWarning DeprecationWarning FutureWarning 2445c73622aSBram Moolenaar syn keyword pythonExceptions ImportWarning PendingDeprecationWarning 245*9faec4e3SBram Moolenaar syn keyword pythonExceptions ResourceWarning RuntimeWarning 246*9faec4e3SBram Moolenaar syn keyword pythonExceptions SyntaxWarning UnicodeWarning 2475c73622aSBram Moolenaar syn keyword pythonExceptions UserWarning Warning 248071d4279SBram Moolenaarendif 249071d4279SBram Moolenaar 2505c73622aSBram Moolenaarif exists("python_space_error_highlight") 251071d4279SBram Moolenaar " trailing whitespace 2525c73622aSBram Moolenaar syn match pythonSpaceError display excludenl "\s\+$" 253071d4279SBram Moolenaar " mixed tabs and spaces 254071d4279SBram Moolenaar syn match pythonSpaceError display " \+\t" 255071d4279SBram Moolenaar syn match pythonSpaceError display "\t\+ " 256071d4279SBram Moolenaarendif 257071d4279SBram Moolenaar 2585c73622aSBram Moolenaar" Do not spell doctests inside strings. 2595c73622aSBram Moolenaar" Notice that the end of a string, either ''', or """, will end the contained 2605c73622aSBram Moolenaar" doctest too. Thus, we do *not* need to have it as an end pattern. 2615c73622aSBram Moolenaarif !exists("python_no_doctest_highlight") 26234700a6aSBram Moolenaar if !exists("python_no_doctest_code_highlight") 2635c73622aSBram Moolenaar syn region pythonDoctest 2645c73622aSBram Moolenaar \ start="^\s*>>>\s" end="^\s*$" 265b4ada79aSBram Moolenaar \ contained contains=ALLBUT,pythonDoctest,pythonFunction,@Spell 2665c73622aSBram Moolenaar syn region pythonDoctestValue 2675c73622aSBram Moolenaar \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$" 2685c73622aSBram Moolenaar \ contained 2695c73622aSBram Moolenaar else 2705c73622aSBram Moolenaar syn region pythonDoctest 2715c73622aSBram Moolenaar \ start="^\s*>>>" end="^\s*$" 2725c73622aSBram Moolenaar \ contained contains=@NoSpell 2735c73622aSBram Moolenaar endif 2745c73622aSBram Moolenaarendif 2755c73622aSBram Moolenaar 2765c73622aSBram Moolenaar" Sync at the beginning of class, function, or method definition. 277b4ada79aSBram Moolenaarsyn sync match pythonSync grouphere NONE "^\%(def\|class\)\s\+\h\w*\s*[(:]" 278071d4279SBram Moolenaar 2795c73622aSBram Moolenaar" The default highlight links. Can be overridden later. 280f37506f6SBram Moolenaarhi def link pythonStatement Statement 281f37506f6SBram Moolenaarhi def link pythonConditional Conditional 282f37506f6SBram Moolenaarhi def link pythonRepeat Repeat 283f37506f6SBram Moolenaarhi def link pythonOperator Operator 284f37506f6SBram Moolenaarhi def link pythonException Exception 285f37506f6SBram Moolenaarhi def link pythonInclude Include 286f37506f6SBram Moolenaarhi def link pythonAsync Statement 287f37506f6SBram Moolenaarhi def link pythonDecorator Define 288f37506f6SBram Moolenaarhi def link pythonDecoratorName Function 289f37506f6SBram Moolenaarhi def link pythonFunction Function 290f37506f6SBram Moolenaarhi def link pythonComment Comment 291f37506f6SBram Moolenaarhi def link pythonTodo Todo 292f37506f6SBram Moolenaarhi def link pythonString String 293f37506f6SBram Moolenaarhi def link pythonRawString String 294f37506f6SBram Moolenaarhi def link pythonQuotes String 295f37506f6SBram Moolenaarhi def link pythonTripleQuotes pythonQuotes 296f37506f6SBram Moolenaarhi def link pythonEscape Special 2975c73622aSBram Moolenaarif !exists("python_no_number_highlight") 298f37506f6SBram Moolenaar hi def link pythonNumber Number 299071d4279SBram Moolenaarendif 3005c73622aSBram Moolenaarif !exists("python_no_builtin_highlight") 301f37506f6SBram Moolenaar hi def link pythonBuiltin Function 302071d4279SBram Moolenaarendif 3035c73622aSBram Moolenaarif !exists("python_no_exception_highlight") 304f37506f6SBram Moolenaar hi def link pythonExceptions Structure 305071d4279SBram Moolenaarendif 3065c73622aSBram Moolenaarif exists("python_space_error_highlight") 307f37506f6SBram Moolenaar hi def link pythonSpaceError Error 308071d4279SBram Moolenaarendif 3095c73622aSBram Moolenaarif !exists("python_no_doctest_highlight") 310f37506f6SBram Moolenaar hi def link pythonDoctest Special 311f37506f6SBram Moolenaar hi def link pythonDoctestValue Define 3125c73622aSBram Moolenaarendif 313071d4279SBram Moolenaar 314071d4279SBram Moolenaarlet b:current_syntax = "python" 315071d4279SBram Moolenaar 31600659069SBram Moolenaarlet &cpo = s:cpo_save 31700659069SBram Moolenaarunlet s:cpo_save 31800659069SBram Moolenaar 3195c73622aSBram Moolenaar" vim:set sw=2 sts=2 ts=8 noet: 320