Мне нужно добавить подсветку синтаксиса Haskell для Emacs.Я не могу создать регулярное выражение для выделения определений функций, потому что регулярные выражения Emacs Lisp не поддерживают просмотр вперед (? =) И просмотр назад (? <=).В руководстве <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Search_002dbased-Fontification.html#Search_002dbased-Fontification" rel="nofollow noreferrer"> Elisp я прочитал, что поиск по ключевым словам может быть реализован по функциям.Эта функция не должна возвращать nil
и должна устанавливать match-beginning
и match-end
.
Я создал функцию, которая находит определения функций Haskell, но подсветка синтаксиса не работает.
(defun get-cur-character (pos)
(aref (buffer-substring (1- pos) pos) 0))
(defun find-equal-character (pos)
(let ((curchar ?0)
(result nil)
(max-pos (point-max)))
(while (and (not (equal curchar ?\n)) (< pos max-pos))
(setq curchar (get-cur-character pos))
(setq pos (1+ pos))
(if (equal curchar ?=)
(progn
(setq result t)
(setq curchar ?\n))))
result))
(defun highlight-haskell-function (limit)
(save-excursion
(if (not (null (re-search-forward "^\\([a-z]+\\w*\\)" limit t)))
(find-equal-character (match-end 0))
(nil))))
(provide 'haskell-mode)
(font-lock-add-keywords 'haskell-mode '((highlight-haskell-function . 'font-lock-keyword-face)))
Описание функций:
get-cur-character
- возвращать символ за позицией. find-equal-character
- найти символ = от позиции до ближайшего \n
символа и вернуть t или ноль. highlight-haskell-function
- найти слова, которые начинаются со строчной буквы, затем вызвать find-equal-символ с позицией искомого слова и вернуть t или nil.