|
@@ -186,6 +186,8 @@ else
|
186
|
186
|
syn match pythonStatement "\<async\s\+for\>" display
|
187
|
187
|
endif
|
188
|
188
|
|
|
189
|
+syn cluster pythonExpression contains=pythonStatement,pythonRepeat,pythonConditional,pythonOperator,pythonNumber,pythonHexNumber,pythonOctNumber,pythonBinNumber,pythonFloat,pythonString,pythonBytes,pythonBoolean,pythonBuiltinObj,pythonBuiltinFunc
|
|
190
|
+
|
189
|
191
|
"
|
190
|
192
|
" Decorators (new in Python 2.4)
|
191
|
193
|
"
|
|
@@ -276,6 +278,11 @@ else
|
276
|
278
|
syn region pythonString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell
|
277
|
279
|
syn region pythonString start=+"""+ end=+"""+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest2,pythonSpaceError,@Spell
|
278
|
280
|
syn region pythonString start=+'''+ end=+'''+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest,pythonSpaceError,@Spell
|
|
281
|
+
|
|
282
|
+ syn region pythonFString start=+[fF]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell
|
|
283
|
+ syn region pythonFString start=+[fF]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell
|
|
284
|
+ syn region pythonFString start=+[fF]"""+ end=+"""+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest2,pythonSpaceError,@Spell
|
|
285
|
+ syn region pythonFString start=+[fF]'''+ end=+'''+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest,pythonSpaceError,@Spell
|
279
|
286
|
endif
|
280
|
287
|
|
281
|
288
|
if s:Python2Syntax()
|
|
@@ -326,8 +333,9 @@ if s:Enabled("g:python_highlight_string_format")
|
326
|
333
|
syn match pythonStrFormat "{{\|}}" contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString
|
327
|
334
|
syn match pythonStrFormat "{\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)\=\%(\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\[\%(\d\+\|[^!:\}]\+\)\]\)*\%(![rsa]\)\=\%(:\%({\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)}\|\%([^}]\=[<>=^]\)\=[ +-]\=#\=0\=\d*,\=\%(\.\d\+\)\=[bcdeEfFgGnosxX%]\=\)\=\)\=}" contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString
|
328
|
335
|
else
|
329
|
|
- syn match pythonStrFormat "{{\|}}" contained containedin=pythonString,pythonRawString
|
330
|
|
- syn match pythonStrFormat "{\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)\=\%(\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\[\%(\d\+\|[^!:\}]\+\)\]\)*\%(![rsa]\)\=\%(:\%({\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)}\|\%([^}]\=[<>=^]\)\=[ +-]\=#\=0\=\d*,\=\%(\.\d\+\)\=[bcdeEfFgGnosxX%]\=\)\=\)\=}" contained containedin=pythonString,pythonRawString
|
|
336
|
+ syn match pythonStrFormat "{{\|}}" contained containedin=pythonString,pythonRawString,pythonFString
|
|
337
|
+ syn match pythonStrFormat "{\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)\=\%(\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\[\%(\d\+\|[^!:\}]\+\)\]\)*\%(![rsa]\)\=\%(:\%({\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)}\|\%([^}]\=[<>=^]\)\=[ +-]\=#\=0\=\d*,\=\%(\.\d\+\)\=[bcdeEfFgGnosxX%]\=\)\=\)\=}" contained containedin=pythonString,pythonRawString
|
|
338
|
+ syn region pythonStrInterpRegion start="{"he=e+1,rs=e+1 end="\%(![rsa]\)\=\%(:\%({\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)}\|\%([^}]\=[<>=^]\)\=[ +-]\=#\=0\=\d*,\=\%(\.\d\+\)\=[bcdeEfFgGnosxX%]\=\)\=\)\=}"hs=s-1,re=s-1 extend contained containedin=pythonFString contains=pythonStrInterpRegion,@pythonExpression
|
331
|
339
|
endif
|
332
|
340
|
endif
|
333
|
341
|
|
|
@@ -370,28 +378,34 @@ if s:Python2Syntax()
|
370
|
378
|
|
371
|
379
|
syn match pythonOctError "\<0[oO]\=\o*[8-9]\d*[lL]\=\>" display
|
372
|
380
|
syn match pythonBinError "\<0[bB][01]*[2-9]\d*[lL]\=\>" display
|
|
381
|
+
|
|
382
|
+ syn match pythonFloat "\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>" display
|
|
383
|
+ syn match pythonFloat "\<\d\+[eE][+-]\=\d\+[jJ]\=\>" display
|
|
384
|
+ syn match pythonFloat "\<\d\+\.\d*\%([eE][+-]\=\d\+\)\=[jJ]\=" display
|
373
|
385
|
else
|
374
|
386
|
syn match pythonHexError "\<0[xX]\x*[g-zG-Z]\x*\>" display
|
375
|
387
|
syn match pythonOctError "\<0[oO]\=\o*\D\+\d*\>" display
|
376
|
388
|
syn match pythonBinError "\<0[bB][01]*\D\+\d*\>" display
|
377
|
389
|
|
378
|
|
- syn match pythonHexNumber "\<0[xX]\x\+\>" display
|
379
|
|
- syn match pythonOctNumber "\<0[oO]\o\+\>" display
|
380
|
|
- syn match pythonBinNumber "\<0[bB][01]\+\>" display
|
|
390
|
+ syn match pythonHexNumber "\<0[xX][_0-9a-fA-F]*\x\>" display
|
|
391
|
+ syn match pythonOctNumber "\<0[oO][_0-7]*\o\>" display
|
|
392
|
+ syn match pythonBinNumber "\<0[bB][_01]*[01]\>" display
|
381
|
393
|
|
382
|
|
- syn match pythonNumberError "\<\d\+\D\>" display
|
383
|
|
- syn match pythonNumberError "\<0\d\+\>" display
|
|
394
|
+ syn match pythonNumberError "\<\d[_0-9]*\D\>" display
|
|
395
|
+ syn match pythonNumberError "\<0[_0-9]\+\>" display
|
|
396
|
+ syn match pythonNumberError "\<\%(_[_0-9]\+\|[_0-9]\+_\)\>" display
|
384
|
397
|
syn match pythonNumber "\<\d\>" display
|
385
|
|
- syn match pythonNumber "\<[1-9]\d\+\>" display
|
386
|
|
- syn match pythonNumber "\<\d\+[jJ]\>" display
|
|
398
|
+ syn match pythonNumber "\<[1-9][_0-9]*\d\>" display
|
|
399
|
+ syn match pythonNumber "\<\d[jJ]\>" display
|
|
400
|
+ syn match pythonNumber "\<[1-9][_0-9]*\d[jJ]\>" display
|
387
|
401
|
|
388
|
402
|
syn match pythonOctError "\<0[oO]\=\o*[8-9]\d*\>" display
|
389
|
403
|
syn match pythonBinError "\<0[bB][01]*[2-9]\d*\>" display
|
390
|
|
-endif
|
391
|
404
|
|
392
|
|
-syn match pythonFloat "\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>" display
|
393
|
|
-syn match pythonFloat "\<\d\+[eE][+-]\=\d\+[jJ]\=\>" display
|
394
|
|
-syn match pythonFloat "\<\d\+\.\d*\%([eE][+-]\=\d\+\)\=[jJ]\=" display
|
|
405
|
+ syn match pythonFloat "\.\d\%([_0-9]*\d\)\=\%([eE][+-]\=\d\%([_0-9]*\d\)\=\)\=[jJ]\=\>" display
|
|
406
|
+ syn match pythonFloat "\<\d\%([_0-9]*\d\)\=[eE][+-]\=\d\%([_0-9]*\d\)\=[jJ]\=\>" display
|
|
407
|
+ syn match pythonFloat "\<\d\%([_0-9]*\d\)\=\.\d\%([_0-9]*\d\)\=\%([eE][+-]\=\d\%([_0-9]*\d\)\=\)\=[jJ]\=" display
|
|
408
|
+endif
|
395
|
409
|
|
396
|
410
|
"
|
397
|
411
|
" Builtin objects and types
|
|
@@ -536,6 +550,8 @@ if version >= 508 || !exists("did_python_syn_inits")
|
536
|
550
|
HiLink pythonBytesError Error
|
537
|
551
|
HiLink pythonBytesEscape Special
|
538
|
552
|
HiLink pythonBytesEscapeError Error
|
|
553
|
+ HiLink pythonFString String
|
|
554
|
+ HiLink pythonStrInterpRegion Special
|
539
|
555
|
endif
|
540
|
556
|
|
541
|
557
|
HiLink pythonStrFormatting Special
|