Выделите вызовы функций, но не первые в списке в Emacs

В режиме emacs lisp я хочу выделить все вызовы функций одним цветом, а все символы в кавычках - другим цветом. Например, в (foo 1 2 'bar), foo должен быть выделен цветом 1, а 'bar должен быть выделен цветом 2.

Я смог сделать это с помощью приведенного ниже кода, однако он также выделяет первый символ в списке, когда список цитируется. Например, в '(nil a b c), nil не должен быть выделен как вызов функции, и все элементы в этом списке должны быть выделены как символы в кавычках (цвет 2).

(defface font-lock-func-face 
    '((nil (:foreground "#6fc2ef"))
      (t (:bold t :italic t)))
  "Font Lock mode face used for function calls."
  :group 'font-lock-highlighting-faces)

(defface font-lock-quoted-face 
    '((nil (:foreground "#e1a3ee"))
      (t (:bold t :italic t)))
  "Font Lock mode face used for function calls."
  :group 'font-lock-highlighting-faces)

(font-lock-add-keywords 
 'emacs-lisp-mode
 '(("(\\s-*\\(\\_<\\(?:\\sw\\|\\s_\\)+\\)\\_>"
    1 'font-lock-func-face)))

(font-lock-add-keywords
 'emacs-lisp-mode
 '(("'[-a-zA-Z_][-a-zA-Z0-9_]*\\>" 0 'font-lock-quoted-face)))

Там также изображение того, что я смотрю здесь: http://imgur.com/Iluku05

1 ответ

Решение

Первая часть ответа: пакет lisp-extra-font-lock выделяет, среди прочего, выражения в кавычках.

Это также подчеркивает:

  • переменные в списках параметров функций и переменных, связанных let, pcase и т.д. Он различает нормальные локальные переменные и глобальные переменные, определяемые defvar используя разные цвета.
  • Выражения в кавычках (и отменяет выделение всех ,- а также ,@подвыражения)

Например: введите описание изображения здесь

Вторая часть ответа:

Если вы используете lisp-extra-font-lock В пакете ваше правило для подсвечивания функций работает так, как вы его опубликовали, если вы добавите его в качестве последнего правила после включения пакета. Таким образом, он не будет перезаписывать другие выделения:

(font-lock-add-keywords 
 'emacs-lisp-mode
 '(("(\\s-*\\(\\_<\\(?:\\sw\\|\\s_\\)+\\)\\_>"
    1 'font-lock-func-face))
 'append)    ;; <-- Add after all other rules
Другие вопросы по тегам