Gibt es eine eindeutige SMIE-Dokumentation?

18

Ich habe viele, viele Stunden damit verbracht, zu versuchen, dass irgendeine Art von SMIE-Einrückungsregel / Grammatik / Sache funktioniert.

Gibt es Beispiele für einen SMIE-basierten Small-, Toy- oder Skeleton-Modus, in dem dokumentiert wird, wie er tatsächlich funktioniert, oder eine Diskussion darüber, wie er verwendet wird? Etwas, das beispielsweise einen Ausdruck als Zeichenfolge definiert, die mit einem Semikolon endet, und einen Block als Ausdrücke zwischen eckigen Klammern und sonst nichts. Wirklich ganz einfach?

Spezielle Fragen: Bei Verwendung von smie-config-show-indent erhalte ich 90% der Zeit die Antwort ': list-intro "" -> nil'. Worauf basiert List-Intro bei der Definition eines Ausdrucks oder einer Liste von Ausdrücken? Warum steht dort nichts und die folgenden Zeilen werden immer noch eingerückt? Wie ändere ich es?

Zweitens: Gibt es eine Beziehung zwischen meiner Grammatik und meinen Smie-Regeln? Ich nehme an, dass dies der Fall ist, weil beide in das Smie-Setup übernommen wurden, aber ich finde keine Möglichkeit zu sagen: "Wenn Sie einen 'Block' sehen, rücken Sie den Inhalt ein", zum Beispiel basierend auf einer Grammatik, die einen Block identifiziert .

Drittens scheinen in SMIE viele Regeln "eingebrannt" zu sein. Durch einfaches Anklicken werden beispielsweise Klammern, Klammern und Klammern allgemein behandelt. Gibt es eine Möglichkeit, diese Regeln zu sehen oder zu ändern? Oder ist es so, dass die Syntaxtabelle all dies tut und SMIE buchstäblich gar nichts tut (was ich zu vermuten beginne)?

Beim Versuch, SMIE zu debuggen, versuche ich schließlich, einen "Editier-, Auswertungsmodus-Puffer", einen Testzyklus für Beispielcode in einem anderen Puffer, MX <my mode>, durchzuführen der vorherige Zyklus. Wie kann ich sicher sein, dass der abgeleitete Definitionsmodus von einem leeren Blatt ausgeht? Ich habe (kill-all-local-variables) da drin, aber es scheint nicht genug zu sein und am Ende muss ich Emacs schließen.

Ich poste keine Beispiele für das, was ich habe, weil ich nichts habe, was auch nur vage funktioniert, abgesehen von Hervorheben (mit Font-Lock-Standardeinstellungen, also ist es vermutlich nicht einmal wirklich SMIE). Ich brauche ein paar richtige kleine Schritte.

Nagora
quelle
1
Bitten Sie den SMIE-Autor um Dokumentation?
Drew
4
@drew Er hat öffentlich erklärt, dass er kein guter Dokumentator ist (und nachdem ich seine Dokumentation gelesen habe, kann ich nicht argumentieren), so scheint es sinnlos.
Nagora
1
Ja, ich weiß. Er hat sogar gesagt, dass Code als doc ausreichen sollte. Oh, habe ich nach meinem Vorschlag vergessen, ein " ;-) " zu setzen ? ;-)
Drew
1
Ich habe mir das vor einiger Zeit angeschaut und festgestellt, dass lisp/progmodes/sh-script.eles smie.elziemlich umfangreich zu sein scheint . Sie scheinen auch ihre Verwendung zu dokumentieren, vielleicht ist das ein etwas besseres Beispiel?
Xaldew
2
Sowohl der SML-Modus als auch der Modula2-Modus verwenden SMIE. IIRC SMIE wurde ursprünglich aus dem SML-Modus extrahiert. Ich muss zugeben, ich fand das auch besonders schwierig.
Ocodo

Antworten:

1

Sie könnten mit so etwas beginnen

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

  ...
  (smie-setup foo-smie-grammar #'ignore)
  ...
Stefan
quelle