diff options
| author | Laurence Warne <laurencewarne@gmail.com> | 2022-09-06 12:28:12 +0200 |
|---|---|---|
| committer | Lars Ingebrigtsen <larsi@gnus.org> | 2022-09-06 12:54:42 +0200 |
| commit | 969983ea1fe4ecca6c714c84b033fa5d0195b753 (patch) | |
| tree | aead65f51af6b2c219ca69f71abc55dd6b04f69f /lisp/progmodes/python.el | |
| parent | 91423627b40fd7a0d2342dc7a419ba8e3bd35fc0 (diff) | |
Apply syntax highlighting for all python f-strings
* lisp/progmodes/python.el (python--f-string-p)
(python--font-lock-f-strings): Edit functions to use a regular
expression matching all f-strings (bug#56757).
Diffstat (limited to 'lisp/progmodes/python.el')
| -rw-r--r-- | lisp/progmodes/python.el | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 147c5f248d2..3247d7ad507 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -546,11 +546,22 @@ The type returned can be `comment', `string' or `paren'." font-lock-string-face) font-lock-comment-face)) +(defconst python--f-string-start-regexp + (rx bow + (or "f" "F" "fr" "Fr" "fR" "FR" "rf" "rF" "Rf" "RF") + (or "\"" "\"\"\"" "'" "'''")) + "A regular expression matching the beginning of an f-string. + +See URL `https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals'.") + (defun python--f-string-p (ppss) "Return non-nil if the pos where PPSS was found is inside an f-string." (and (nth 3 ppss) - (let ((spos (1- (nth 8 ppss)))) - (and (memq (char-after spos) '(?f ?F)) + (let* ((spos (1- (nth 8 ppss))) + (before-quote + (buffer-substring-no-properties (max (- spos 4) (point-min)) + (min (+ spos 2) (point-max))))) + (and (string-match-p python--f-string-start-regexp before-quote) (or (< (point-min) spos) (not (memq (char-syntax (char-before spos)) '(?w ?_)))))))) @@ -569,7 +580,7 @@ the {...} holes that appear within f-strings." (while (progn (while (and (not (python--f-string-p ppss)) - (re-search-forward "\\<f['\"]" limit 'move)) + (re-search-forward python--f-string-start-regexp limit 'move)) (setq ppss (syntax-ppss))) (< (point) limit)) (cl-assert (python--f-string-p ppss)) |
