mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-03 10:31:37 -08:00
Backported triple quote syntax from Emacs 24
This commit is contained in:
parent
33d0aec16e
commit
ecf24fd762
1 changed files with 25 additions and 39 deletions
|
|
@ -395,26 +395,15 @@
|
|||
(set-match-data nil)))))
|
||||
(1 font-lock-variable-name-face nil nil))))
|
||||
|
||||
;; Fixme: Is there a better way?
|
||||
(defconst python-font-lock-syntactic-keywords
|
||||
;; Make outer chars of matching triple-quote sequences into generic
|
||||
;; string delimiters. Fixme: Is there a better way?
|
||||
;; First avoid a sequence preceded by an odd number of backslashes.
|
||||
`((,(rx (not (any ?\\))
|
||||
?\\ (* (and ?\\ ?\\))
|
||||
(group (syntax string-quote))
|
||||
(backref 1)
|
||||
(group (backref 1)))
|
||||
(2 ,(string-to-syntax "\""))) ; dummy
|
||||
(,(rx (group (optional (any "uUrR"))) ; prefix gets syntax property
|
||||
(optional (any "rR")) ; possible second prefix
|
||||
(group (syntax string-quote)) ; maybe gets property
|
||||
(backref 2) ; per first quote
|
||||
(group (backref 2))) ; maybe gets property
|
||||
(1 (python-quote-syntax 1))
|
||||
(2 (python-quote-syntax 2))
|
||||
(3 (python-quote-syntax 3))))
|
||||
"Make outer chars of triple-quote strings into generic string delimiters.")
|
||||
`((,(concat "\\(?:\\([RUru]\\)[Rr]?\\|^\\|[^\\]\\(?:\\\\.\\)*\\)" ;Prefix.
|
||||
"\\(?:\\('\\)'\\('\\)\\|\\(?2:\"\\)\"\\(?3:\"\\)\\)")
|
||||
(3 (python-quote-syntax)))))
|
||||
|
||||
(defun python-quote-syntax (n)
|
||||
(defun python-quote-syntax ()
|
||||
"Put `syntax-table' property correctly on triple quote.
|
||||
Used for syntactic keywords. N is the match number (1, 2 or 3)."
|
||||
;; Given a triple quote, we have to check the context to know
|
||||
|
|
@ -432,28 +421,25 @@ Used for syntactic keywords. N is the match number (1, 2 or 3)."
|
|||
;; x '"""' x """ \"""" x
|
||||
(save-excursion
|
||||
(goto-char (match-beginning 0))
|
||||
(cond
|
||||
;; Consider property for the last char if in a fenced string.
|
||||
((= n 3)
|
||||
(let* ((font-lock-syntactic-keywords nil)
|
||||
(syntax (syntax-ppss)))
|
||||
(when (eq t (nth 3 syntax)) ; after unclosed fence
|
||||
(goto-char (nth 8 syntax)) ; fence position
|
||||
(skip-chars-forward "uUrR") ; skip any prefix
|
||||
;; Is it a matching sequence?
|
||||
(if (eq (char-after) (char-after (match-beginning 2)))
|
||||
(eval-when-compile (string-to-syntax "|"))))))
|
||||
;; Consider property for initial char, accounting for prefixes.
|
||||
((or (and (= n 2) ; leading quote (not prefix)
|
||||
(= (match-beginning 1) (match-end 1))) ; prefix is null
|
||||
(and (= n 1) ; prefix
|
||||
(/= (match-beginning 1) (match-end 1)))) ; non-empty
|
||||
(let ((font-lock-syntactic-keywords nil))
|
||||
(unless (eq 'string (syntax-ppss-context (syntax-ppss)))
|
||||
(eval-when-compile (string-to-syntax "|")))))
|
||||
;; Otherwise (we're in a non-matching string) the property is
|
||||
;; nil, which is OK.
|
||||
)))
|
||||
(let ((syntax (save-match-data (syntax-ppss))))
|
||||
(cond
|
||||
((eq t (nth 3 syntax)) ; after unclosed fence
|
||||
;; Consider property for the last char if in a fenced string.
|
||||
(goto-char (nth 8 syntax)) ; fence position
|
||||
(skip-chars-forward "uUrR") ; skip any prefix
|
||||
;; Is it a matching sequence?
|
||||
(if (eq (char-after) (char-after (match-beginning 2)))
|
||||
(put-text-property (match-beginning 3) (match-end 3)
|
||||
'syntax-table (string-to-syntax "|"))))
|
||||
((match-end 1)
|
||||
;; Consider property for initial char, accounting for prefixes.
|
||||
(put-text-property (match-beginning 1) (match-end 1)
|
||||
'syntax-table (string-to-syntax "|")))
|
||||
(t
|
||||
;; Consider property for initial char, accounting for prefixes.
|
||||
(put-text-property (match-beginning 2) (match-end 2)
|
||||
'syntax-table (string-to-syntax "|"))))
|
||||
)))
|
||||
|
||||
(defvar python-mode-syntax-table
|
||||
(let ((table (make-syntax-table)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue