Tôi đang cố gắng viết một chế độ chính làm nổi bật các chuỗi ba trích dẫn. Đây là một ví dụ có thể tái tạo tối thiểu:
(defconst demo-triple-quoted-string-regex
(rx "\"\"\""
;; After the delimiter, we're a sequence of
;; non-backslashes or blackslashes paired with something.
(*? (or (not (any "\\"))
(seq "\\" anything)))
"\"\"\""))
(defun demo-stringify-triple-quote ()
"Put `syntax-table' property on triple-quoted strings."
(let* ((string-literal (match-string 0))
(string-start-pos (- (point) (length string-literal)))
(string-end-pos (point)))
(unless (nth 4 (syntax-ppss)) ;; not inside comment
(put-text-property string-start-pos string-end-pos
'syntax-table (string-to-syntax "|")))))
(defconst demo-syntax-propertize-function
(syntax-propertize-rules
(demo-triple-quoted-string-regex
(0 (ignore (demo-stringify-triple-quote))))))
(define-derived-mode demo-mode prog-mode "Demo"
"Major mode showing stack overflow question."
(set (make-local-variable 'font-lock-defaults) '(()))
(set (make-local-variable 'syntax-propertize-function)
demo-syntax-propertize-function))
Tuy nhiên, điều này dẫn đến hành vi thực sự kỳ quái khi sửa đổi bộ đệm. Đây là nội dung bộ đệm của tôi:
dodgy when we put a newline after babel
"""
a
"
babel
"""
x = 1
M-x demo-mode
làm nổi bật chính xác:
nhưng nhấn enter đột nhiên cho ra điều này:
Tôi đang làm gì sai?
Tôi không có giải pháp nhưng tôi nhận thấy vấn đề tương tự với việc tiếp tục in nghiêng và in đậm trên các dòng kết thúc ở chế độ org.
—
Người dùng Emacs
Vấn đề đầu tiên là bạn đặt cú pháp trên tất cả các ký tự của chuỗi, trong khi nó chỉ nên được thực hiện cho các ký tự hàng rào đầu tiên và cuối cùng. Bạn có thể xác minh rằng Emacs coi mọi cặp chuỗi được cho là của bạn là một chuỗi sex, tức là một chuỗi, thông qua
—
trị
forward-sexp
.
Vấn đề thứ hai là bạn không thể thực sự khớp chuỗi theo cách bạn tưởng tượng. Điều này sẽ chỉ hoạt động, nếu tìm kiếm được đảm bảo bắt đầu bên ngoài bất kỳ chuỗi nào đã có trong bộ đệm. Sau khi tất cả các cặp bạn khớp: Một bộ ba bắt đầu một chuỗi khi và chỉ khi nó đi trước một số chẵn ba lần khác. May mắn
—
trị
syntax-ppss
theo dõi điều này. Hãy xem làm thế nào nó được thực hiện trong python.el
.
@politza Tôi rất kinh ngạc về kỹ năng elisp của bạn! Cám ơn rất nhiều :). Sửa chữa của bạn là đủ để tôi làm cho mã của tôi hoạt động (xem câu trả lời bên dưới), vì vậy bây giờ tôi có thể sửa lỗi chế độ julia đưa tôi vào vấn đề này.
—
Wilfred Hughes