我想用elisp代码在YAML中读取配置。搜索但未在elisp中找到现成的解析器。我错过了一些有用的东西吗?
答案 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
。
答案 1 :(得分:5)
三年后,我们dynamic modules,emacs-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-文件