(defface polite-removed-face '((t :foreground "red" :weight bold)) "Face for removed parts of PO messages.") (defvar polite-removed-face 'polite-removed-face) (defface polite-added-face '((t :foreground "blue" :weight bold)) "Face for added parts of PO messages.") (defvar polite-added-face 'polite-added-face) (defface polite-changed-face '((t :foreground "darkgreen")) "Face for entire diff comments of PO messages.") (defvar polite-changed-face 'polite-changed-face) (defun find-removed-parts (p-max) ;; If in a diff-comment, return all removed parts (if (and (re-search-forward "^\\#\\!" p-max t) (re-search-forward "\\(\\[-.*?-\\]\\)" p-max t 2)) t nil)) (defun find-added-parts (p-max) ;; If in a diff-comment, return all removed parts (if (and (re-search-forward "^\\#\\!" p-max t) (re-search-forward "\\({\\+.*?\\+}\\)" p-max t 2)) t nil)) ;; Font lock based highlighting code. (defconst polite-font-lock-keywords '( ;; ("^\\(msgid \\|msgstr \\)?\"\\|\"$" . font-lock-keyword-face) ;; (regexp-opt ;; '("msgid " "msgid_plural " "msgstr " "msgstr[0] " "msgstr[1] ")) ("\ ^\\(\\(msg\\(id\\(_plural\\)?\\|str\\(\\[[0-9]\\]\\)?\\)?\\) \\)?\"\\|\"$" . font-lock-keyword-face) ;;("\\\\.\\|%\\*?[-.0-9ul]*[a-zA-Z]" . font-lock-variable-name-face) ("\\\\.\\|%\\*?[-.0-9ul]*[a-zA-Z]" . font-lock-variable-name-face) ("^# .*\\|^#[:,!]?" . font-lock-comment-face) ("^#\\.\\(.*\\)" 1 font-lock-reference-face) ("^#! .*" 0 polite-changed-face t) ("^#: .*" 0 font-lock-reference-face t) ("^#!\\(.*\\)" 1 font-lock-comment-face) ("\\(\\[-.*?-\\]\\)" 1 polite-removed-face t) ("\\({\\+.*?\\+}\\)" 1 polite-added-face t) ;; The following line does not work, and I wonder why. ("^#,\\(.*\\)" 0 font-lock-preprocessor-face t) ) "Additional expressions to highlight in PO mode.") (defun polite-mode () "Major mode providing just syntax highlighting of PO files." (interactive) (kill-all-local-variables) (setq major-mode 'polite-mode mode-name "POlite") (set (make-local-variable 'font-lock-defaults) '(polite-font-lock-keywords t)) (run-hooks 'polite-mode-hook))