vim-python/python-syntax

Missing the f-prefix on an f-string is hard to notice

Lilja opened this issue · 5 comments

Lilja commented

As python 3.6 gave us f-strings it's I've been using them more over the ol' .format() syntax.

Sadly, the syntax is highlighting strings that have curly braces but have neither f-string prefix or .format suffix.

IMG

The third statement ("{hello}") shouldn't show the curly brace because that is not doing anything fancy with the string. It's just a string.

This might lead me as a developer to miss putting the f-prefix before a string, as the curly braces are giving an indication that they are treated as some sort of templates.

Any thoughts on this?

nfnty commented

I've had the same issue from time to time, so this would be a nice improvement. PR is welcome.

Since I never use "...".format the following hack has been helpful to me (after/syntax/python.vim):

syn match pythonStrFormatNotFString "{\%(\%([^[: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
hi pythonStrFormatNotFString ctermbg=88 ctermfg=225 guibg=#870000 guifg=#ffd7ff

syn match pythonStrFormatRawString "{\%(\%([^[: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=pythonRawString
hi pythonStrFormatRawString ctermbg=94 ctermfg=229 guibg=#875f00 guifg=#ffffaf

It's just copying the original pythonStrFormat and changing the containedIn field.

image

is this solved or being worked on?

Lilja commented

I would consider looking at nvim that has treesitter integration natively. It doesn't have this issue.

Related: #95