]> git.eshelyaron.com Git - emacs.git/commitdiff
Add separate tiny major mode for JSON
authorDmitry Gutov <dgutov@yandex.ru>
Tue, 9 Aug 2022 01:00:08 +0000 (04:00 +0300)
committerDmitry Gutov <dgutov@yandex.ru>
Tue, 9 Aug 2022 01:44:01 +0000 (04:44 +0300)
* lisp/progmodes/js.el (js-json-mode): New major mode.

* lisp/files.el (auto-mode-alist): Use it for JSON (bug#56682).

* lisp/progmodes/js.el (js--class-decl-matcher):
Skip work if there are no frameworks enabled.

lisp/files.el
lisp/progmodes/js.el

index e258bf7bbedb1bbd393b087bad072f10a0047ee3..05a924a363d907d0970a0d4e2c9e74c571885d72 100644 (file)
@@ -2950,7 +2950,7 @@ ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\|RAR\\|CBR\\|7Z\\|SQUASHFS\\)\\'" .
      ("\\.js[mx]?\\'" . javascript-mode)
      ;; https://en.wikipedia.org/wiki/.har
      ("\\.har\\'" . javascript-mode)
-     ("\\.json\\'" . javascript-mode)
+     ("\\.json\\'" . js-json-mode)
      ("\\.[ds]?va?h?\\'" . verilog-mode)
      ("\\.by\\'" . bovine-grammar-mode)
      ("\\.wy\\'" . wisent-grammar-mode)
index eb2a1e4fccc709df572a42bd1a899af7c98c1d37..2eefcf44dcf2da745b37510828df9050ea46d3f1 100644 (file)
@@ -1830,22 +1830,23 @@ context."
 (defun js--class-decl-matcher (limit)
   "Font lock function used by `js-mode'.
 This performs fontification according to `js--class-styles'."
-  (cl-loop initially (js--ensure-cache limit)
-           while (re-search-forward js--quick-match-re limit t)
-           for orig-end = (match-end 0)
-           do (goto-char (match-beginning 0))
-           if (cl-loop for style in js--class-styles
-                       for decl-re = (plist-get style :class-decl)
-                       if (and (memq (plist-get style :framework)
-                                     js-enabled-frameworks)
-                               (memq (js-syntactic-context)
-                                     (plist-get style :contexts))
-                               decl-re
-                               (looking-at decl-re))
-                       do (goto-char (match-end 0))
-                       and return t)
-           return t
-           else do (goto-char orig-end)))
+  (when js-enabled-frameworks
+    (cl-loop initially (js--ensure-cache limit)
+             while (re-search-forward js--quick-match-re limit t)
+             for orig-end = (match-end 0)
+             do (goto-char (match-beginning 0))
+             if (cl-loop for style in js--class-styles
+                         for decl-re = (plist-get style :class-decl)
+                         if (and (memq (plist-get style :framework)
+                                       js-enabled-frameworks)
+                                 (memq (js-syntactic-context)
+                                       (plist-get style :contexts))
+                                 decl-re
+                                 (looking-at decl-re))
+                         do (goto-char (match-end 0))
+                         and return t)
+             return t
+             else do (goto-char orig-end))))
 
 (defconst js--font-lock-keywords
   '(js--font-lock-keywords-3 js--font-lock-keywords-1
@@ -3490,6 +3491,12 @@ This function is intended for use in `after-change-functions'."
   ;;(syntax-propertize (point-max))
   )
 
+;;;###autoload
+(define-derived-mode js-json-mode js-mode "JSON"
+  ;; JSON files can be big.  Speed up syntax-ppss.
+  (setq-local syntax-propertize-function nil)
+  (setq-local js-enabled-frameworks nil))
+
 ;; Since we made JSX support available and automatically-enabled in
 ;; the base `js-mode' (for ease of use), now `js-jsx-mode' simply
 ;; serves as one other interface to unconditionally enable JSX in