Есть ли документация SMIE, которая понятна?

18

Я потратил много-много часов, пытаясь заставить работать любое правило / грамматику / отступы SMIE.

Есть ли примеры маленького, игрушечного или скелетного режима на основе SMIE с документацией о том, как он на самом деле работает, или какие-либо дискуссии о том, как его использовать? Что-то, что, скажем, определяет выражение как строку токенов, заканчивающуюся точкой с запятой, а блок - как некоторые выражения в скобках и ничего больше. Действительно, действительно просто?

Конкретные вопросы: при использовании smie-config-show-indent в 90% случаев я получаю ответ ': list-intro "" -> nil'. На чем основано определение list-int для выражения или списка выражений? Почему он говорит ноль и все еще делает отступ в следующих строках? Как я могу изменить это?

Во-вторых: есть ли связь между моей грамматикой и моими смайликами? Я предполагаю, что это происходит потому, что они оба передаются в smie-setup, но я не могу найти никакого способа сказать «когда вы видите« блок », сделайте отступ содержимого», например, на основе грамматики, которая идентифицирует блок ,

В-третьих, у SMIE, похоже, много правил, «запеченных». Например, простое включение дает общую обработку скобок, скобок и скобок. Есть ли способ увидеть эти правила или изменить их? Или это то, что синтаксическая таблица делает все это, а SMIE буквально ничего не делает (что я начинаю подозревать).

Наконец, при попытке отладки SMIE я пытаюсь выполнить буфер «edit, eval mode», перейти к примеру кода в другом буфере, цикл MX <my mode>, test », но кажется, что при каждом обходе не удаляются правила из предыдущий цикл. Как я могу быть уверен, что define-производный-режим начинается с чистого листа? У меня там есть (kill-all-local-variable), но этого недостаточно, и мне приходится закрывать emacs.

Я не публикую никаких примеров того, что у меня есть, потому что у меня нет ничего, что даже расплывчато работает, кроме выделения (используя font-lock-defaults, так что это даже не SMIE, я думаю). Мне нужны настоящие детские шаги.

нагора
источник
1
Попробуйте спросить у автора SMIE документацию?
Дрю
4
@drew Он публично заявил, что он не является хорошим документалистом (и, прочитав его документацию, я не могу спорить), так что это кажется бессмысленным.
Нагора,
1
Да, я знаю. Он даже сказал, что код должен быть достаточным как документ. О, я забыл поставить " ;-) " после моего предложения? ;-)
Дрю
1
Я посмотрел на это некоторое время назад и заметил, что, lisp/progmodes/sh-script.elкажется, использовать smie.elдовольно широко. Они также, кажется, документируют свое использование, так что, может быть, это может быть несколько лучшим примером?
Xaldew
2
Режим SML и режим Modula2 используют SMIE. Изначально IIRC SMIE был извлечен из режима SML. Должен признаться, я тоже нашел это особенно трудным.
ocodo

Ответы:

1

Режим, в котором интенсивно используется SMIE: https://github.com/elixir-lang/emacs-elixir Не уверен, что он действительно работает, хотя - см. Список ошибок, связанных с отступом.

Андреас Рёлер
источник
1

Вы могли бы начать с чего-то вроде

(defconst foo-smie-grammar
    (smie-prec2->grammar
     (smie-bnf->prec2
      '((exp ("begin" insts "end"))
        (insts (exp) (insts ";" insts))))))

  ...
  (smie-setup foo-smie-grammar #'ignore)
  ...
Стефан
источник