有谁知道一个好的Emacs模式来编辑JSON吗?我正在开发的一个应用程序使用基于JSON的通信协议,并且将数据缩进并突出显示语法将对我弄清楚它有很大帮助。
有谁知道一个好的Emacs模式来编辑JSON吗?我正在开发的一个应用程序使用基于JSON的通信协议,并且将数据缩进并突出显示语法将对我弄清楚它有很大帮助。
Answers:
(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内容。
"unicode_escape"
与json内容一起使用。使用ensure_ascii=False
代替。
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))
是一样的东西,但要短一些。
如果您想要轻量级的东西,请尝试我砍下的这个主要模式: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解决方案的评论,但似乎不允许这样做(没有“添加评论”链接))
json.el
爱德华·奥康纳(Edward O'Connor)撰写的内容自23.1(2008)起成为GNU Emacs的一部分。
尽管它不是语法突出显示工具,但它具有格式化JSON的有用功能:
M-x json-pretty-print-buffer RET
因此,如果您具有Emacs的最新版本,则不需要jq
或python -m json.tool
。
json-pretty-print-buffer
GNU Emacs 24.5.1中包含的内容时,我发现虽然可以很好地格式化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模式支持JSON
js3-mode: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的解决方法,以使其本身可以用作主要模式。除了简单地推导模式外,几乎不需要修改。Nowak实际需要做的唯一更改是能够将与文件无关或与名称不以结尾的文件相关联的缓冲区识别.json
为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
plus更好的选择,flymake-json
因为您不需要安装任何新的东西(js2-mode已经进行语法检查,不需要外部工具),并且因为此模式将继承您的js2-mode配置,而js-mode不会。
我也建议使用js2-mode。
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);