From d2080e4183e462331bdb90476395d1ad003de7bb Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Tue, 9 Aug 2022 04:00:08 +0300 Subject: [PATCH] Add separate tiny major mode for JSON * 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 | 2 +- lisp/progmodes/js.el | 39 +++++++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/lisp/files.el b/lisp/files.el index e258bf7bbed..05a924a363d 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -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) diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index eb2a1e4fccc..2eefcf44dcf 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -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 -- 2.39.2