Как написать функцию в Emacs Lisp для подсветки синтаксиса? - PullRequest
0 голосов
/ 21 мая 2018

Мне нужно добавить подсветку синтаксиса 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.
...