编辑 JSON 的 Emacs 模式

有人知道编辑 JSON 的好的 Emacs 模式吗?我正在开发的一个应用程序使用了一个基于 JSON 的通信协议,如果能够很好地缩进数据并突出显示语法,将会对我解决这个问题有很大的帮助。

30496 次浏览

你试过 Steve Yegge 的 用于 Emacs 的 js2-mode吗?

我还建议使用 js2-mode。

JSON 代表 JSON。它不是另一种语言,甚至不是 yaml 或 xml 那样的数据容器。如果 JSON 对象中没有函数(或者在本例中我们应该说方法) ,那么可以将 JSON 用作数据容器,但它不是 JSON 的主要目标: -)

var myJSObject = {
attr: {foo: "bar", baz: ["quux", "truc", "pouet"]},
fooAlert: function (num) {
alert(this.attr.foo+' '+num);
}
};
myJSObject.fooAlert(42);

浓缩模式支持 JSON

我已经为 Js2-mode准备了一个解决方案,这样它就可以在没有错误的情况下解析 json 文件。 你可以在我的评论中找到它: < a href = “ http://code.google.com/p/js2-mode/questions/Details? id = 50 # c7”rel = “ nofollow norefrer”> http://code.google.com/p/js2-mode/issues/detail?id=50#c7

(我想把它作为 J.F。塞巴斯蒂安的解决方案的评论贴出来,但似乎我不能这样做(没有“添加评论”链接))

如果你想要一些轻量级的东西,可以试试这个主模式: https://github.com/joshwnj/json-mode

它实际上不过是 javascript 模式之上的一些额外语法突显,但就我的目的而言,我发现它工作得非常好。

另一个常见的用例是自动格式化 JSON 文件(例如,如果它是空格压缩的,并且您希望获得更高的可读性)。要做到这一点,我只需通过一个命令行脚本: C-u M-| 管道缓冲区

Josh 的 Json 风格 + 1对我来说很好,我加了

(defun beautify-json ()
(interactive)
(let ((b (if mark-active (min (point) (mark)) (point-min)))
(e (if mark-active (max (point) (mark)) (point-max))))
(shell-command-on-region b e
"python -m json.tool" (current-buffer) t)))

还有

(define-key json-mode-map (kbd "C-c C-f") 'beautify-json)

到 json-mode. el,使 shell 命令的调用更加容易。

更新: 对于那些需要/希望使用 unicode 做这件事的人,请参阅我的问题 给你。其结果是:

python -m json.tool

你会想要使用

python -c 'import sys,json; data=json.loads(sys.stdin.read()); print json.dumps(data,sort_keys=True,indent=4).decode("unicode_escape").encode("utf8","replace")'

这既美化了 JSON,也保留了原始的 Unicode 内容。

Js-mode 支持 json 文件的语法突显和缩进。

这是从 Emacs 23.2开始的,当 espresso-mode 被合并到 Emacs 中并重命名为 js-mode。

看看这个: Http://www.nongnu.org/espresso/

Js3-mode: https://github.com/thomblake/js3-mode

Js3-mode 是一种改进的 js2-mode

这个包可以通过 package-list-package 命令安装

因为 JSON 是 YAML 的一个子集,所以 yaml-mode也可以工作(尽管我不知道它与 js-modejson-mode相比如何)。

安装(来自 emacs) : M-x package-install yaml-mode

~/.emacs.d/init.elyaml-mode与 YAML 和 JSON 文件的关联:

(add-to-list 'auto-mode-alist '("\\.yaml$" . yaml-mode))
(add-to-list 'auto-mode-alist '("\\.json$" . yaml-mode))

我还将推荐 Josh 的 json-mode,但是也推荐将 Flymake-json 作为一个补充,它有助于突出语法错误。

我不喜欢使用 python -mjson.tool,因为它在 JSON 对象中重新排序项。 我发现 (prog-indent-sexp)的工作正好缩进,并使用 jsonlint 而不是 python -mjson.tool工程漂亮的打印/重新格式化在 beautify-json

(eval-after-load "json-mode"
'(progn
(require 'flymake-json)
;; flymake-cursor displays error in minibuffer message area instead of requiring hover
(require 'flymake-cursor)


(add-hook 'json-mode-hook 'flymake-json-load)
(define-key json-mode-map "\C-c\C-n" (function flymake-goto-next-error))
)
)

我已经扩展了 Mariusz Nowak 的 解决办法,使它作为一个主要的模式在它自己的权利。除了简单地派生模式之外,几乎不需要做什么修改; Nowak 的工作实际上需要的唯一改变是能够识别与文件无关的缓冲区,或者与名称不以 .json结尾的文件有关的 JSON,我们使用一个 buffer-local 变量来实现这一点。

以下是增强型变通方案:

(make-variable-buffer-local 'js2-parse-as-json)


(defadvice js2-reparse (before json)
(setq js2-buffer-file-name buffer-file-name))
(ad-activate 'js2-reparse)


(defadvice js2-parse-statement (around json)
(if (and (= tt js2-LC)
js2-buffer-file-name
(or js2-parse-as-json
(string-equal (substring js2-buffer-file-name -5) ".json"))
(eq (+ (save-excursion
(goto-char (point-min))
(back-to-indentation)
(while (eolp)
(next-line)
(back-to-indentation))
(point)) 1) js2-ts-cursor))
(setq ad-return-value (js2-parse-assign-expr))
ad-do-it))
(ad-activate 'js2-parse-statement)


(define-derived-mode json-mode js2-mode "JSON"
"Major mode for editing JSON data."
:group 'json
(setq js2-parse-as-json t)
(js2-reparse t))


(add-to-list 'auto-mode-alist '("\\.json$" . json-mode))

如果您已经使用了 js2-mode,那么这可能是一个比 js-modeflymake-json更好的选择,因为您不需要安装任何新的东西(js2-mode 已经做了语法检查,不需要外部工具) ,而且因为这种模式将继承您的 js2-mode 配置,而 js-mode 不会。

爱德华 · 奥康纳的 json.el从23.1(2008)开始就是 GNU Emacs 的一部分。

虽然它不是语法高亮显示器,但它有一个格式化 JSON 的有用功能:

M-x json-pretty-print-buffer RET

因此,如果您有 Emacs 的最新版本,则不需要 jqpython -m json.tool