ChatGPT解决这个技术问题 Extra ChatGPT

Emacs 模式编辑 JSON

有人知道编辑 JSON 的良好 Emacs 模式吗?我正在开发的一个应用程序使用基于 JSON 的通信协议,并且将数据很好地缩进和语法高亮将在我弄清楚它的过程中帮助我很多。

请参阅 emacs.stackexchange.com/questions/24855/… 我使用 js2-mode 验证 JSON

b
bignose

为 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 内容。


fwiw,我分叉了 Josh 的 json 模式,并在 github.com/chad3814/json-mode 处添加了 jstevenco 的附加功能
我已在 github.com/joshwnj/json-mode/issues/5 请求修复非 ASCII 日期
最新版本的 json-mode 现已修复 utf-8 问题:请参阅 github.com/joshwnj/json-mode/issues/5
这一切都可以在 melpa 上安装最新的 json-mode package。干得好伙计们。
不要将 "unicode_escape" 与 json 内容一起使用。 Use ensure_ascii=False instead.
S
Steve

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)) 是一样的,但要短一些。
j
jfs

你试过 Steve Yegge 的 js2-mode for Emacs 吗?


但是,js2-mode 并不真正支持 JSON。 code.google.com/p/js2-mode/issues/detail?id=50
@Török Gábor:你知道更好的选择吗?
J
Josh

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

它实际上只不过是在 javascript-mode 之上的一些额外的语法突出显示,但就我的目的而言,我发现它工作得很好。

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


fwiw,我分叉了这个 repo 并添加了 jstevenco 的 beautify-json 函数,它位于 github.com/chad3814/json-mode - 还发送了一个拉取请求。
FWIW Josh 接受了 Chad 的拉取请求以包括 jstevenco 的添加(得到所有这些?),因此在撰写本文时 Josh's json-mode repo on github 是 json-mode 的最新源。
请应用非 ASCII 修复。
这是一个错误还是我做错了什么? emacs.stackexchange.com/q/17319/4003(我在 .emacs 中加载 json-mode)
M
Mariusz Nowak

我已经为 js2-mode 准备了一个解决方法,因此它可以解析 json 文件而不会出错。您可以在我的评论中找到它:http://code.google.com/p/js2-mode/issues/detail?id=50#c7

(我想将其作为 JF Sebastian 解决方案的评论发布,但似乎我不允许这样做(没有“添加评论”链接))


D
DavidRR

Edward O'Connor 的 json.el 自 23.1 (2008) 起成为 GNU Emacs 的一部分。

虽然它不是语法荧光笔,但它有一个有用的功能来格式化 JSON:

M-x json-pretty-print-buffer RET

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


使用 GNU Emacs 24.5.1 中包含的 json-pretty-print-buffer,我发现虽然它很好地格式化了我的 JSON,但它也反转了它的内容。幸运的是,我还发现在我的 JSON 上再次运行它会将其恢复到原来的顺序。
E
Eric O Lebigot

由于 JSON 是 YAML 的子集,因此 yaml-mode 也可以工作(不过我不知道它与 js-modejson-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


我只能让 espresso-mode 使用合法的 Javascript 语法。例如,JSON 表达式不会正确缩进。
Espresso 已从 23.2 版开始并入 GNU Emacs,并已重命名为 js-mode。 espresso-mode 将不再在 Emacs 之外维护。
G
Gang Chen

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

js3-mode 是改进的 js2-mode

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


d
djb

我也会支持 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))
  )
)

C
Community

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


p
p4bl0

我也会推荐 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);

确切地说,您提供的示例不是 JSON,而是 JavaScript 对象文字,它相似但不同。
另一种像 YAML 或 XML 这样的数据容器语言实际上就是 JSON,而 JSON 不允许使用函数。