Emacs模式编辑JSON


Answers:



34

乔希的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内容。


FWIW,我forked'd Josh的JSON模式,并加入jstevenco的除了它在github.com/chad3814/json-mode
乍得


json-mode的最新版本现已修复utf-8问题:请参见github.com/joshwnj/json-mode/issues/5
Jarl

1
所有这些都可以在melpa上安装最新的json-mode软件包。干得好。
TooTone 2015年

不要"unicode_escape"与json内容一起使用。使用ensure_ascii=False代替。
jfs

29

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

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

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


6
真好!我放(setq auto-mode-alist (cons '("\\.json\\'" . js-mode) auto-mode-alist))了我的.emacs
Marvin 2012年

(add-to-list 'auto-mode-alist '("\\.json$" . js-mode))是一样的东西,但要短一些。
ksrb

15

如果您想要轻量级的东西,请尝试我砍下的这个主要模式:https : //github.com/joshwnj/json-mode

实际上,它只不过是在javascript-mode之上突出显示了一些额外的语法,但是出于我的目的,我发现它可以很好地工作。

另一个常见的用例是自动格式化JSON文件(例如,如果它是空白压缩的,并且您希望提高可读性)。为此,我只是通过命令行脚本传递缓冲区:Cu M- |


2
首先,我分叉了此仓库,并添加了jstevenco的beautify-json函数,它位于github.com/chad3814/json-mode-还发送了请求请求。
2012年

FWIW Josh接受了Chad的pull请求,其中包括jstevenco的添加项(是否全部?),因此在撰写本文时,Josh在github上的json-mode存储库是json-mode的最新资源。
史蒂文·柯林斯

请应用非ASCII修复程序。
Jarl 2012年

这是一个错误还是我做错了什么?emacs.stackexchange.com/q/17319/4003(我在.emacs中加载json-mode)
Marcus Junius Brutus


5

json.el 爱德华·奥康纳(Edward O'Connor)撰写的内容自23.1(2008)起成为GNU Emacs的一部分。

尽管它不是语法突出显示工具,但它具有格式化JSON的有用功能:

M-x json-pretty-print-buffer RET

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


1
使用json-pretty-print-bufferGNU Emacs 24.5.1中包含的内容时,我发现虽然可以很好地格式化JSON,但它也可以反转其内容。幸运的是,我还发现在JSON上第二次运行它可以将其恢复为原始顺序。
DavidRR

3

由于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))

0

espresso模式支持JSON


2
我只能将espresso模式用于合法的Javascript语法。例如,JSON表达式无法正确缩进。
ESV 2010年

从23.2版本开始,Espresso已合并到GNU Emacs中,并已重命名为js-mode。espresso模式将不再在Emacs适当的范围之外维护。
Jeff Bauer 2014年


0

我还将支持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))
  )
)

0

我已经扩展了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-modeplus更好的选择,flymake-json因为您不需要安装任何新的东西(js2-mode已经进行语法检查,不需要外部工具),并且因为此模式将继承您的js2-mode配置,而js-mode不会。


-7

我也建议使用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);

10
确切地说,您提供的示例不是JSON,而是JavaScript对象文字,这是相似的但有所不同。
viam0Zah

6
作为数据容器(如YAML或XML)的另一种语言实际上就是JSON,实际上,JSON不允许使用功能。
Kragen Javier Sitaker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.