@@ -69,8 +69,7 @@ Return the new `auto-mode-alist' entry"
69
69
" .bowerrc"
70
70
" composer.lock"
71
71
)
72
- " List of filename as string to pass for the JSON entry of
73
- `auto-mode-alist' .
72
+ " List of filename as string to pass for the JSON entry of `auto-mode-alist' .
74
73
75
74
Note however that custom `json-mode' entries in `auto-mode-alist'
76
75
won’t be affected."
@@ -108,39 +107,61 @@ This function calls `json-mode--update-auto-mode' to change the
108
107
(defconst json-mode-number-re (rx (group (one-or-more digit)
109
108
(optional ?\. (one-or-more digit)))))
110
109
(defconst json-mode-keyword-re (rx (group (or " true" " false" " null" ))))
111
- (defconst json-mode-line-comments-re
112
- (rx (and bol (0+ space) (group (and " //" (*? nonl) eol)))))
113
- (defconst json-mode-block-comments-re
114
- (rx (group (and " /*" (*? anything) " */" ))))
115
110
116
111
(defconst json-font-lock-keywords-1
117
112
(list
118
- (list json-mode-quoted-key-re 1 font-lock-keyword-face )
119
- (list json-mode-quoted-string-re 1 font-lock-string-face )
120
- (list json-mode-keyword-re 1 font-lock-constant-face )
121
- (list json-mode-number-re 1 font-lock-constant-face )
122
- )
123
- " Level one font lock for `json-mode' ." )
124
-
125
- (defconst jsonc-font-lock-keywords-1
126
- (list
127
- (list json-mode-line-comments-re 1 font-lock-comment-face )
128
- (list json-mode-block-comments-re 1 font-lock-comment-face )
129
- (list json-mode-quoted-key-re 1 font-lock-keyword-face )
130
- (list json-mode-quoted-string-re 1 font-lock-string-face )
131
113
(list json-mode-keyword-re 1 font-lock-constant-face )
132
114
(list json-mode-number-re 1 font-lock-constant-face ))
133
- " Level one font lock for `jsonc-mode' ." )
115
+ " Level one font lock." )
116
+
117
+ (defvar json-mode-syntax-table
118
+ (let ((st (make-syntax-table )))
119
+ ; ; Objects
120
+ (modify-syntax-entry ?\{ " (}" st)
121
+ (modify-syntax-entry ?\} " ){" st)
122
+ ; ; Arrays
123
+ (modify-syntax-entry ?\[ " (]" st)
124
+ (modify-syntax-entry ?\] " )[" st)
125
+ ; ; Strings
126
+ (modify-syntax-entry ?\" " \" " st)
127
+ st))
128
+
129
+ (defvar jsonc-mode-syntax-table
130
+ (let ((st (copy-syntax-table json-mode-syntax-table)))
131
+ ; ; Comments
132
+ (modify-syntax-entry ?/ " ! 124" st)
133
+ (modify-syntax-entry ?\n " >" st)
134
+ (modify-syntax-entry ?* " ! 23b" st)
135
+ st))
136
+
137
+ (defun json-mode--syntactic-face (state )
138
+ " Return syntactic face function for the position represented by STATE.
139
+ STATE is a `parse-partial-sexp' state, and the returned function is the
140
+ json font lock syntactic face function."
141
+ (cond
142
+ ((nth 3 state)
143
+ ; ; This might be a string or a name
144
+ (let ((startpos (nth 8 state)))
145
+ (save-excursion
146
+ (goto-char startpos)
147
+ (if (looking-at-p json-mode-quoted-key-re)
148
+ font-lock-keyword-face
149
+ font-lock-string-face ))))
150
+ ((nth 4 state) font-lock-comment-face )))
134
151
135
152
;;;### autoload
136
153
(define-derived-mode json-mode javascript-mode " JSON"
137
154
" Major mode for editing JSON files"
138
- (set (make-local-variable 'font-lock-defaults ) '(json-font-lock-keywords-1 t )))
155
+ :syntax-table json-mode-syntax-table
156
+ (set (make-local-variable 'font-lock-defaults )
157
+ '(json-font-lock-keywords-1
158
+ nil nil nil nil
159
+ (font-lock-syntactic-face-function . json-mode--syntactic-face))))
139
160
140
161
;;;### autoload
141
162
(define-derived-mode jsonc-mode json-mode " JSONC"
142
163
" Major mode for editing JSON files with comments"
143
- ( set ( make-local-variable 'font-lock-defaults ) '( jsonc-font-lock-keywords-1 t )) )
164
+ :syntax-table jsonc-mode-syntax-table )
144
165
145
166
; ; Well formatted JSON files almost always begin with “{” or “[”.
146
167
;;;### autoload
0 commit comments