10

I am using python-mode which colors the parameters.

When I concatinate strings the variable color is represented as different:

On the other hand, if I use fstring, the variable is not represented as different color:

str

Please note that, if I enter non-existing variable, python-mode detects it:

enter image description here

[Q] Is there any way to give a color to variables inside a fstring under python-mode?

1 Answer 1

11

I think this will do it for Emacs versions < 27.1

(require 'python)

(setq python-font-lock-keywords
      (append python-font-lock-keywords
          '(;; this is the full string.
        ;; group 1 is the quote type and a closing quote is matched
        ;; group 2 is the string part
        ("f\\(['\"]\\{1,3\\}\\)\\(.+?\\)\\1"
         ;; these are the {keywords}
         ("{[^}]*?}"
          ;; Pre-match form
          (progn (goto-char (match-beginning 0)) (match-end 0))
          ;; Post-match form
          (goto-char (match-end 0))
          ;; face for this match
          (0 font-lock-variable-name-face t))))))

For later versions replace python-font-lock-keywords with python-font-lock-keywords-maximum-decoration.

I think this works on all strings now, including multiline ones (that seems to be a tricky one in general though). I left the {} in the highlight, they get replaced and that made sense to me.

Here is what it looks like for me: enter image description here

font lock is hard!

The two other posts I looked at related to this are:

  1. Repeated regex capture for font-lock

  2. Python mode - custom syntax highlighting.

22
  • 1
    I think with the new version you can get rid of the font-lock-keywords-only setting, then this works for everything but mulitline f-strings. see teh new picture above. Jan 30, 2020 at 12:39
  • 1
    That probably is invalid. You can't use the same kind of quotes for the dictionary key here. Try f'received {jobInfo["received"]}' instead. Jan 31, 2020 at 12:23
  • 1
    I asked it at emacs.stackexchange.com/questions/55586/… Feb 17, 2020 at 13:35
  • 1
    There are some interesting approaches and explanations in the answers to the new question. I have updated this answer so it works with \n in it, but there may be a more robust answer that leverages syntax described at emacs.stackexchange.com/questions/55586/…. It will take some work to make that also do what is done here though. Feb 17, 2020 at 22:04
  • 1
    In GNU Emacs 27.1 seems like it does not work :-(
    – alper
    Sep 22, 2020 at 18:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.