|
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 "\<\d[_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
|
@@ -540,6 +554,8 @@ if version >= 508 || !exists("did_python_syn_inits")
|
540 | 554 | HiLink pythonBytesError Error
|
541 | 555 | HiLink pythonBytesEscape Special
|
542 | 556 | HiLink pythonBytesEscapeError Error
|
| 557 | + HiLink pythonFString String |
| 558 | + HiLink pythonStrInterpRegion Special |
543 | 559 | endif
|
544 | 560 |
|
545 | 561 | HiLink pythonStrFormatting Special
|
|
0 commit comments