Emacs模式来编辑JSON

有没有人知道一个好的Emacs模式来编辑JSON? 我正在使用的应用程序使用基于JSON的通信协议,使数据很好地缩进和语法突出显示将帮助我解决这个问题。

你有没有试过Steve Yegge的Emacs的js2模式 ?

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 be "python -mjson.tool" (current-buffer) t))) 

 (define-key json-mode-map (kbd "Cc Cf") 'beautify-json) 

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

更新:对于那些需要/希望与unicode这样做,请看我的问题在这里 。 结果是,而不是使用:

 python -mjson.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模式支持json文件的语法高亮和缩进。

这是Emacs 23.2 ,当咖啡模式被合并到Emacs中,并被重命名为js模式。

检查一下: http : //www.nongnu.org/espresso/

如果你想轻量级的尝试这个主要模式,我一起砍: https : //github.com/joshwnj/json-mode

实际上,这只不过是在JavaScript模式之上的一些额外的语法突出显示,但为了我的目的,我发现它工作得很好。

另一个常见的用例是自动格式化一个JSON文件(例如,如果它是空白压缩的,你想要更多的可读性)。 要做到这一点,我只是通过命令行脚本pipe道缓冲区:Cu M- |

我准备了一个js2模式的解决方法,所以它parsingjson文件没有错误。 你可以在我的评论中find它: http : //code.google.com/p/js2-mode/issues/detail?id=50#c7

(我想把它作为JF塞巴斯蒂安解决scheme的评论,但似乎我不允许这样做(没有“添加评论”链接))

由于JSON是YAML的一个子集,因此yaml-mode可以工作(虽然我不知道它与js-modejson-mode比较)。

安装(从emacs): Mx package-install yaml-mode

yaml-mode与YAML和JSON文件在~/.emacs.d/init.el

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

JSON由咖啡模式支持

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

js3模式是一个改进的js2模式

这个软件包可以通过package-list-packages命令来安装

我也将第二乔希的json模式,但也推荐flymake-json作为补充。 它有助于突出语法错误。

我不喜欢使用python -mjson.tool因为它重新sortingJSON对象中的项目。 我发现(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 "\Cc\Cn" (function flymake-goto-next-error)) ) ) 

我已经扩展了Mariusz Nowak的解决方法 ,使其成为主要模式。 除了简单的推导模式之外,还需要很less的修改; Nowak的工作实际上唯一需要的是能够识别不与文件关联的缓冲区,或者与不以.json结尾的文件相关联的缓冲区局部variables来实现的JSON。

以下是增强的解决方法:

 (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模式,这可能是比js-modeflymake-json更好的select,因为你不需要安装任何新东西(js2模式已经做了语法检查,不需要外部工具),并且因为这个模式会inheritance你的js2模式configuration,而js模式不会。

Edward O'Connor的json.el是自23.1(2008)以来的GNU Emacs的一部分。

虽然它不是语法突出显示,但它具有有用的functionMx json-pretty-print-buffer RET 。 所以不需要jqpython -m json.tool

我也会推荐js2模式。

JSON代表JavaScript Object Notation。 这不是另一种语言,它甚至不是像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);