elisp中最好的YAML解析器是什么?

时间:2012-04-10 17:09:36

标签: emacs elisp yaml

我想用elisp代码在YAML中读取配置。搜索但未在elisp中找到现成的解析器。我错过了一些有用的东西吗?

6 个答案:

答案 0 :(得分:5)

几个月后:我想要它,所以这里是如何在python的帮助下做到这一点:

   (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
  )

json.el的帮助下,它将当前缓冲区的yaml转换为elisp hashmap。

你需要python的pyyaml:pip install PyYaml

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

答案 1 :(得分:5)

三年后,我们dynamic modulesemacs-libyaml看起来非常有趣。它使用动态模块系统在Elisp中公开libyaml的C绑定。虽然我没有对它进行测试,但我希望它的性能非常棒。

答案 2 :(得分:4)

六个月后,似乎答案是“没有固定的易于使用的elisp YAML解析器。”

如果您真的想在elisp中阅读YAML文档并将其转换为elisp可以与之交互的内容,那么您将不得不进行一些粗略的工作。 EmacsWiki YAML page对你来说没什么用,规范YAML mode有语法提示,但没有实际的解析器。幸运的是有人implemented a YAML-parsing web-app接受YAML并输出JSON或Python - 您可以尝试查看它的内幕并使用它来检查您自己编写的任何YAML解析器。

祝你好运。

答案 3 :(得分:1)

三年后,我很高兴地说现在有一个用 Elisp 编写的 YAML 解析器:https://melpa.org/#/yaml

它的 API 类似于 json-parse-string 的 API,您可以指定它的对象和列表类型。下面是它的用法示例:

(yaml-parse-string "
-
  \"flow in block\"
- >
 Block scalar
- !!map # Block collection
  foo : bar" :object-type 'alist)
;; => ["flow in block" "Block scalar\n" (("foo" . "bar"))]

答案 4 :(得分:0)

六年后,我们有了yaml-mode!可从MELPA存储库安装: M-x package-install RET yaml-mode

答案 5 :(得分:0)

要使用python改善Ehvince答案,这是一种更通用的方式,可以解析字符串,缓冲区和文件:

(defun yaml-parse (string)
  "yaml STRING to json to a hashmap of current buffer, with python."
  (interactive)
  (with-temp-buffer
    (insert string)
    (when (zerop (call-process-region (point-min) (point-max) "python" t t nil "-c" "import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout)"))
      (goto-char (point-min))
      (json-read))))

(defun yaml-parse-buffer (&optional buffer)
  "Parse yaml BUFFER."
  (with-current-buffer (or buffer (current-buffer))
    (yaml-parse (buffer-substring-no-properties (point-min) (point-max)))))

(defun yaml-parse-file (file)
  "Parse yaml FILE."
  (with-temp-buffer
    (insert-file-contents-literally file)
    (yaml-parse (buffer-substring-no-properties (point-min) (point-max)))))

您可以使用json- *变量来控制类型映射。

编辑:添加了yaml-parse-文件