Как вы наверняка знаете, языком программирования Emacs является Elisp. Его поддержка в стандартной поставке Emacs достаточно хороша. Но вот чего мне действительно не хватает – это качественной подсветки символов (идентификаторов), в том числе определяемых мной. Ну что же, давайте ее добавим.
В этом нам поможет Font Lock mode. Основной способ поиска кода для подсветки в Font Lock mode – это регулярные выражения, но увы, они нам не подходят, так как нам нужен способ выделить символы исходя из их семантики. На этот случай Font Lock mode предоставляет возможность использовать вместо регулярного выражения особого вида функцию, которая сама осуществит поиск кода для подсветки.
На такую функцию накладывается несколько ограничений:
Она должна принимать в качестве аргумента лимит поиска – точку до которой будет производиться поиск (начиная с текущей точки).
В случае успешного поиска функция должна:
вернуть не-nil значение;
передвинуть текущую точку на позицию после найденной части кода;
(defunhighlight-emacs-lisp--matched-symbol()"Возвращает найденный символ (идентификатор)"(intern-soft(buffer-substring(match-beginning0)(match-end0))))(defunhighlight-emacs-lisp--macro-symbol-p(symbol)"Проверка на то, что с символом связан макрос"(eq'macro(car-safe(symbol-functionsymbol))))(defunhighlight-emacs-lisp-macro(limit)"Поиск имен макросов"(loop;; Находим все символы (идентификаторы)(unless(re-search-forward"[^() \"\t\n',@]+"limitt)(returnnil))(let((candidate(highlight-emacs-lisp--matched-symbol)))(when(highlight-emacs-lisp--macro-symbol-pcandidate)(returnt)))))(font-lock-add-keywords'emacs-lisp-mode'((highlight-emacs-lisp-macro.'font-lock-keyword-face)))
Отлично, теперь обобщим этот метод для функций и глобальных переменных, плюс добавим подсветку в IELM: