Как создать функцию на emacs lisp для подсветки синтаксиса?

Встала задача написать подсветку синтаксиса haskell в Emacs. Проблема заключается в том, что в регулярных выражения Emacs Lisp не поддерживается просмотр вперёд и назад (?=) и (?<=). На сайте gnu прочитал, что можно создать функцию для поиска слов, которые будут подсвечены. Функция принимает предел поиска, она должна возвращать не nil и устанавливать match-beginning и match-end.
Написанная функция была протестирована, она работает, но подсветка синтаксиса - нет.
(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)))


Описания функций:
  1. get-cur-character выдаёт символ по позиции.
  2. find-equal-character ищет символ равно, начиная с позиции, переданной ей и заканчивая символом переноса строки.
  3. highlight-haskell-function - ищет слова, стоящие в начале строки и начинающиеся с маленькой буквы. Потом передаёт наёденную позицию в find-equal-character и возвращает либо t либо nil.


В результате действий этих функций match-beginning и match-end, полученные в результате re-search-forward, не меняются.
  • Вопрос задан
  • 265 просмотров
Пригласить эксперта
Ответы на вопрос 1
easimonenko
@easimonenko
Любитель
Мне кажется `font-lock-add-keywords` используется неверно, судя по описанию вот здесь https://www.emacswiki.org/emacs/FontLockKeywords
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы