branch: elpa/systemd commit b0c1d64d62d9209d45fff813a35f917badc9f051 Author: Mark Oteiza <mvote...@udel.edu> Commit: Mark Oteiza <mvote...@udel.edu>
add multi-line comment highlighting between font-lock-keywords, the elisp manual, examples in the emacs source (sh-mode is one) and the webernets, it is rather difficult to find a way to properly deal with multi-line construct syntax highlighting. this is a way leveraging anchored matching and jit-lock. --- systemd.el | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/systemd.el b/systemd.el index 49cd290..5708ea3 100644 --- a/systemd.el +++ b/systemd.el @@ -24,7 +24,7 @@ ;; Major mode for editing systemd units. -;; Similar to `conf-mode' but with added highlighting; e.g. for +;; Similar to `conf-mode' but with enhanced highlighting; e.g. for ;; specifiers and booleans. Employs strict regex for whitespace. ;; Features a facility for browsing documentation: use C-c C-o to open ;; links to documentation in a unit (cf. systemctl help). @@ -258,8 +258,27 @@ See `font-lock-keywords' and (info \"(elisp) Search-based Fontification\")." (`candidates (all-completions arg (systemd-completion-table nil))) (`post-completion (if (not (systemd-buffer-section-p)) (insert "="))))) +(defun systemd-construct-start-p () + "Return non-nil if the current line is the first in a multi-line construct." + (let ((flag t)) + (save-excursion + (while (and (zerop (forward-line -1)) + (eq ?\\ (char-before (line-end-position))) + (skip-chars-forward " \t") + (setq flag (memq (following-char) '(?# ?\;)))))) + flag)) + +(defun systemd-comment-matcher (limit) + "Matcher for comments. +Only matches comments on lines passing `systemd-construct-start-p'." + (let ((re "^[ \t]*?\\([#;]\\)\\(.*\\)$") + match) + (while (and (setq match (re-search-forward re limit t)) + (not (systemd-construct-start-p)))) + match)) + (defconst systemd-font-lock-keywords-1 - `(("^[[:space:]]*?\\([#;]\\)\\(.*\\)$" + `((systemd-comment-matcher (1 'font-lock-comment-delimiter-face) (2 'font-lock-comment-face)) ;; sections @@ -354,6 +373,7 @@ Key bindings: (conf-mode-initialize systemd-comment-start) (add-hook 'company-backends #'systemd-company-backend) (add-hook 'completion-at-point-functions #'systemd-complete-at-point nil t) + (setq-local jit-lock-contextually t) (setq font-lock-defaults '((systemd-font-lock-keywords systemd-font-lock-keywords-1