有人知道编辑 JSON 的良好 Emacs 模式吗?我正在开发的一个应用程序使用基于 JSON 的通信协议,并且将数据很好地缩进和语法高亮将在我弄清楚它的过程中帮助我很多。
为 Josh 的 json-mode +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 执行此操作的人,请参阅我的问题 here。结果是而不是使用:
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/
(setq auto-mode-alist (cons '("\\.json\\'" . js-mode) auto-mode-alist))
在我的 .emacs
(add-to-list 'auto-mode-alist '("\\.json$" . js-mode))
是一样的,但要短一些。
你试过 Steve Yegge 的 js2-mode for Emacs 吗?
如果你想要一些轻量级的东西,试试我一起破解的这个主要模式:https://github.com/joshwnj/json-mode
它实际上只不过是在 javascript-mode 之上的一些额外的语法突出显示,但就我的目的而言,我发现它工作得很好。
另一个常见的用例是自动格式化 JSON 文件(例如,如果它是空格压缩的并且您想要更多的可读性)。为此,我只是通过命令行脚本管道传输缓冲区:Cu M-|
我已经为 js2-mode 准备了一个解决方法,因此它可以解析 json 文件而不会出错。您可以在我的评论中找到它:http://code.google.com/p/js2-mode/issues/detail?id=50#c7
(我想将其作为 JF Sebastian 解决方案的评论发布,但似乎我不允许这样做(没有“添加评论”链接))
Edward O'Connor 的 json.el
自 23.1 (2008) 起成为 GNU Emacs 的一部分。
虽然它不是语法荧光笔,但它有一个有用的功能来格式化 JSON:
M-x json-pretty-print-buffer RET
因此,如果您有最新版本的 Emacs,则不需要 jq
或 python -m json.tool
。
json-pretty-print-buffer
,我发现虽然它很好地格式化了我的 JSON,但它也反转了它的内容。幸运的是,我还发现在我的 JSON 上再次运行它会将其恢复到原来的顺序。
由于 JSON 是 YAML 的子集,因此 yaml-mode
也可以工作(不过我不知道它与 js-mode
和 json-mode
相比如何)。
安装(从 emacs):M-x 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))
espresso-mode 支持 JSON
js3 模式:https://github.com/thomblake/js3-mode
js3-mode 是改进的 js2-mode
这个包可以通过 package-list-packages 命令安装
我也会支持 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 的 workaround 进行了扩展,使其可以作为主要模式使用。除了简单地导出模式之外,几乎不需要修改; Nowak 的工作真正需要的唯一改变是能够将不与文件关联的缓冲区或与名称不以 .json
结尾的文件关联的缓冲区识别为 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-mode,这可能是比 js-mode
加 flymake-json
更好的选择,因为您不需要安装任何新的东西(js2-mode 已经进行语法检查,不需要外部工具),并且因为这种模式将继承您的 js2-mode 配置,而 js-mode 不会。
我也会推荐 js2-mode。
JSON 代表 JavaScript 对象表示法。它不是另一种语言,甚至不是像 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);
不定期副业成功案例分享
"unicode_escape"
与 json 内容一起使用。 Useensure_ascii=False
instead.