有没有人知道一个好的 Emacs 模式来编辑 JSON?我正在开发的应用使用基于 JSON 的通信协议,将数据进行美观缩进并进行语法高亮处理将有助于我更好地理解它。
+1表示支持Josh的json-mode -- 对我来说很有效。我添加了
(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)
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内容。
ensure_ascii=False
代替。 - jfsjs-mode支持JSON文件的语法高亮和缩进。
自Emacs 23.2起,espresso-mode被并入Emacs并改名为js-mode。
.emacs
文件中加入了(setq auto-mode-alist (cons '("\\.json\\'" . js-mode) auto-mode-alist))
。 - Marvin(add-to-list 'auto-mode-alist '("\\.json$" . js-mode))
是同样的意思,但稍微更短些。 - ksrb你尝试过Steve Yegge的Emacs的js2-mode吗?
json.el
是Edward O'Connor开发的一个自GNU Emacs 23.1(2008年)起就成为其一部分的工具。
虽然它不是一个语法高亮器,但它有一个有用的功能可以对JSON进行格式化:
M-x json-pretty-print-buffer RET
json-pretty-print-buffer
,我发现它可以很好地格式化我的JSON,但它也会颠倒其内容。幸运的是,我还发现在我的JSON上第二次运行它可以将其恢复到原始顺序。 - DavidRR由于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))
我对Mariusz Nowak的解决方法进行了扩展,使其可以作为自己的主要模式使用。除了简单地派生模式之外,几乎不需要进行任何修改;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))
我也赞同Josh的json-mode,并推荐作为补充使用flymake-json。它有助于突出语法错误。
我不喜欢使用python -mjson.tool
,因为它会重新排列JSON对象中的项目。
我发现(prog-indent-sexp)
可以很好地重新缩进,并且在beautify-json
中使用jsonlint
而不是python -mjson.tool
适用于漂亮的打印/重新格式化。
(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))
)
)
js3-mode:https://github.com/thomblake/js3-mode
js3-mode 是 js2-mode 的改进版
可以通过 package-list-packages 命令安装此软件包