Встала задача написать подсветку синтаксиса 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)))
Описания функций:
- get-cur-character выдаёт символ по позиции.
- find-equal-character ищет символ равно, начиная с позиции, переданной ей и заканчивая символом переноса строки.
- highlight-haskell-function - ищет слова, стоящие в начале строки и начинающиеся с маленькой буквы. Потом передаёт наёденную позицию в find-equal-character и возвращает либо t либо nil.
В результате действий этих функций match-beginning и match-end, полученные в результате re-search-forward, не меняются.