I'm trying to implement here doc syntax highlighting. I've reviewed the implementations in shell-script-mode and hcl-mode but I don't really understand what is happening. I've read the documentation for syntax-propertize-function (
) but that didn't help me understand what's going on.
(defun hcl--syntax-propertize-heredoc (end)
(let ((ppss (syntax-ppss)))
(when (eq t (nth 3 ppss))
(let ((key (get-text-property (nth 8 ppss) 'hcl-here-doc-marker))
(case-fold-search nil))
(when (re-search-forward
(concat "^\\(?:[ \t]*\\)" (regexp-quote key) "\\(\n\\)")
end 'move)
(let ((eol (match-beginning 1)))
(put-text-property eol (1+ eol)
'syntax-table (string-to-syntax "|"))))))))
(defun hcl--font-lock-open-heredoc (start string eol)
(unless (or (memq (char-before start) '(?< ?>))
(save-excursion
(goto-char start)
(hcl--in-string-or-comment-p)))
(let ((str (replace-regexp-in-string "['\"]" "" string)))
(put-text-property eol (1+ eol) 'hcl-here-doc-marker str)
(prog1 (string-to-syntax "|")
(goto-char (+ 2 start))))))
(defun hcl--syntax-propertize-function (start end)
(goto-char start)
(hcl--syntax-propertize-heredoc end)
(funcall
(syntax-propertize-rules
(hcl--here-doc-beg-re
(2 (hcl--font-lock-open-heredoc
(match-beginning 0) (match-string 1) (match-beginning 2))))
("\\s|" (0 (prog1 nil (hcl--syntax-propertize-heredoc end)))))