Emacs основной режим для изумруда. Правильная подсветка

Короче:

Я студент, и на одном из моих курсов мы должны использовать / изучать изумрудный язык программирования. После быстрого поиска в Google я обнаружил, что кто-то уже написал мажорный режим для него. Ссылка на скрипт

Проблема: после первой строки комментария "%..." подсветка синтаксиса прекращается. Таким образом, все последующие строки не имеют подсветки синтаксиса. Что очень раздражает.

Изумруд не имеет многострочных комментариев. Только одна строка комментариев является частью синтаксиса языка. Комментарий в одну строку начинается с "%" и заканчивается концом строки.

Я полный новичок во всем мажорном режиме, пишу скрипты на lisp для emacs... и т.д.

Вопрос: Может ли кто-нибудь помочь мне понять, что именно не так с подсветкой синтаксиса? Почему он останавливается после первого однострочного комментария? И как это исправить?

Другой быстрый вопрос: как заставить emacs выделить ключевые слова на других языках? Например, объект, экспорт, операция, функция... и т. Д.?

Заранее спасибо:)

Редактировать: Вот простая программа-тест hello world для демонстрации подсветки синтаксиса:

%this object pronts a hello message on screen
const hello <- object hello
  var n : integer <-  0

  operation gs[] -> [ret: integer]
    n <- n + 1
    ret <- n
    return
  end gs

  % a comment
  % second comment
  % third comment
  initially
    stdout.putstring["Hello World!\n"]
  end initially
end hello

1 ответ

Решение

Первый вопрос: вы можете пошагово использовать ключевые слова для блокировки шрифтов, используя пакет https://github.com/Lindydancer/font-lock-studio. Проблема может быть либо в одном из ключевых слов font-lock, либо в таблице синтаксиса (которая используется для выделения комментариев и строк). Если после начала font-lock-studio (т. е. до того, как будут применены любые ключевые слова для блокировки шрифтов), подсветка неверна, тогда проблема в синтаксической таблице.

Второй вопрос: можно позвонить font-lock-add-keywords в основном режиме хук, чтобы добавить новые ключевые слова font-lock. Смотрите переменную font-lock-keywords для описания в формате. Тем не менее, описание несколько загадочное, поэтому я также рекомендую вам поискать в сети хорошие примеры.

Обновление: после установки emerald-mode Я мог бы повторить проблемы, которые вы видели. Основная причина заключается в том, что этот режим реализует основные функции Emacs несовместимым способом (тот, который предоставляется в Emacs, принимает до трех аргументов). Если вы удалите следующую функцию и перезапустите Emacs, блокировка шрифтов будет работать.

(defun looking-back (regexp)
  "Simulates a looking-at, but works backwards"
  (and (save-excursion
     (re-search-backward regexp (min (point-min) (- (point) 100)) t))
       (= (point) (match-end 0))))

Обратите внимание, что я не мог найти это без font-lock-studioТак как обычный font-lock молча игнорирует ошибки, тогда как font-lock-studio входит в отладчик LISP (если debug-on-error не ноль).

Обновление 2: кажется, что emerald-mode определяет набор ключевых слов font-lock, но никогда не добавляет их. Если вы добавите следующие строки в ваш файл инициализации, похоже, он будет работать:

(defun my-emeral-mode-hook ()
  (setq font-lock-defaults '(emerald-font-lock-keywords nil t))
  (font-lock-mode 1))
(add-hook 'emerald-mode-hook 'my-emeral-mode-hook)

Я заметил, что emerald-mode остро нуждается в удалении. Например, основной режим не вызывает kill-all-local-variablesЭто означает, что он сохраняет все локальные переменные из предыдущего основного режима. (Еще лучшим решением было бы использовать define-derived-mode вместо определения режима с использованием простого defun.) Это устанавливает font-lock-keywords-case-fold-search в качестве глобальной переменной, а не через font-lock-defaults и т.п.

Другие вопросы по тегам