2012-04-10 4 views
8

Ich möchte config in YAML mit elisp code lesen. Gesucht, aber in elisp wurde kein gebrauchsfertiger Parser gefunden. Habe ich etwas Nützliches verpasst?Was ist der beste YAML-Parser in elisp?

+0

Ich kenne die Antwort nicht, aber wenn es keine gibt, dann kann man einen anderen Parser aufrufen, um den yaml zu lesen und eine textliche Lisp-Darstellung ausgeben lassen, die man mit 'read' lesen kann. – Tom

+0

Danke! Es ist eine gute Idee. Vielleicht kann ich 'pymacs' versuchen. – Vivodo

+0

Ich bin mir nicht sicher, was du meinst - es gibt einen Yaml-Modus hier: https://github.com/yoshiki/yaml-mode - aber du willst einen Parser den yaml lesen und was damit machen? –

Antwort

1

Sechs Monate später scheint es, dass die Antwort "es gibt keinen festen leicht verfügbaren elisp YAML Parser."

Wenn Sie wirklich ein YAML-Dokument in elisp lesen und es in etwas verwandeln wollen, mit dem elisp interagieren kann, müssen Sie einige knifflige Arbeit einlegen. Die EmacsWiki YAML page hat nicht viel für Sie, und die kanonische YAML mode hat Syntaxhinweise, aber keine tatsächlichen Parser. Glücklicherweise hat jemand implemented a YAML-parsing web-app, der YAML nimmt und JSON oder Python ausgibt - du könntest versuchen, einen Blick unter die Haube davon zu werfen - oder es verwenden, um irgendeinen YAML-Parser zu prüfen, den du selbst schreiben kannst.

Viel Glück.

+0

Addendum: Siehe [diese SO-Antwort] (http://Stackoverflow.com/a/2231327/244494) für einige Erste-Start-Code beim Schreiben der eigenen rekursiven Abstieg Parser in elisp. –

+2

http://edward.oconnor.cx/2006/03/json.el könnte auch nützlich für Vergleiche und Ideen sein. Offensichtlich ist YAML nicht JSON, aber sie haben sicherlich einige Ähnlichkeiten. – tripleee

3

Und einige Monate später: ich es wollte, also hier, wie es aus Python mit etwas Hilfe zu tun:

(defun yaml-parse() 
    "yaml to json to a hashmap of current buffer, with python. 

    There is no yaml parser in elisp. 
    You need pyYaml and some yaml datatypes like dates are not supported by json." 
    (interactive) 
    (let ((json-object-type 'hash-table)) 
    (setq myyaml (json-read-from-string (shell-command-to-string (concat "python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)' < " (buffer-file-name)))))) 
    ;; code here 
) 

Es stellt sich die yaml des aktuellen Puffers in einen elisp hashmap, mit Hilfe von json.el .

Sie benötigen Python pyampl: pip install PyYaml.

json.el: http://edward.oconnor.cx/2006/03/json.el

+0

Ich meine auf einer Ebene, das ist ein Hack, der mich zusammenzucken lässt, aber auf einer anderen kann ich mich nicht dazu bringen, nicht respektlos zu sein "das Werkzeug, das ich brauche existiert nicht, also werde ich es selbst schreiben." Upvoted. –

0

Drei Jahre später haben wir dynamic modules und emacs-libyaml sieht ziemlich interessant. Es verwendet das dynamische Modulsystem, um die C-Bindungen von libyaml in Elisp verfügbar zu machen. Ich würde erwarten, dass die Leistung fantastisch ist, obwohl ich es nicht getestet habe.