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
и т.п.