Как не выделить значения в комментариях в Emacs? - PullRequest
3 голосов
/ 11 марта 2020

Я хочу выделить значения true и false в некоторых файлах конфигурации. Я сделал это следующим образом:

(defun my/highlight-in-properties-files ()
  "Highlight regexps in PROPERTIES files."
  (when (string-match-p ".properties" (file-name-nondirectory buffer-file-name))
    (highlight-regexp "true" 'hi-green)
    (highlight-regexp "false" 'hi-pink)))

Но он также выделил эти значения в комментариях:

enter image description here

Есть ли способ исключить эти выделения?

UPDATE - highlight-regexp является псевдонимом для 'hi-lock-face-buffer' в 'hi-lock.el'. И string-match-p - это скомпилированная функция Lisp в 'subr.el'.

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Вы можете просто добавить регулярные выражения через font-lock-add-keywords, который уже будет учитывать синтаксис комментариев в буфере, например.

(defun my-font-lock-additions ()
  (require 'hi-lock)                    ; fonts
  (font-lock-add-keywords
   nil
   '(("\\btrue\\b"  . 'hi-green)
     ("\\bfalse\\b" . 'hi-pink)))
  (font-lock-flush))

И вызвать (font-lock-refresh-defaults), чтобы вернуться к настройкам OG.

Придерживаясь чисто регулярного выражения с highlight-regexp, в нечетных случаях, несомненно, возникнут некоторые ошибки, но я думаю, что просто настройка вашего регулярного выражения для проверки префикса комментария также, вероятно, будет работать достаточно хорошо,

(defun my/highlight-in-properties-files ()
  "Highlight regexps in PROPERTIES files."
  (when (string-match-p ".properties" (file-name-nondirectory buffer-file-name))
    (comment-normalize-vars)            ; ensure comment variables are setup
    (let ((cmt-re (format "^[^%s]*" (regexp-quote (string-trim comment-start)))))
      (highlight-regexp (format "%s\\(\\_<true\\_>\\)" cmt-re) 'hi-green 1)
      (highlight-regexp (format "%s\\(\\_<false\\_>\\)" cmt-re) 'hi-pink 1))))
1 голос
/ 16 марта 2020

Можно было бы просто добавить $ в конце вашего регулярного выражения, чтобы оно не совпадало с комментариями, так как истина / ложь всегда в конце, тогда как комментарии в комментариях всегда находятся в середине предложения.

(defun my/highlight-in-properties-files ()
  "Highlight regexps in PROPERTIES files."
  (when (string-match-p ".properties" (file-name-nondirectory buffer-file-name))
    (highlight-regexp "true$" 'hi-green)
    (highlight-regexp "false$" 'hi-pink)))
...