@@ -155,95 +155,35 @@ Only intended for use at development time.")
155
155
(eval-and-compile
156
156
(concat " ^"
157
157
(regexp-opt
158
- '(" do"
159
- " if"
160
- " let*"
161
- " var"
162
- " fn"
163
- " fn*"
164
- " loop*"
165
- " recur"
166
- " throw"
167
- " try"
168
- " catch"
169
- " finally"
170
- " set!"
171
- " new"
172
- " ."
173
- " monitor-enter"
174
- " monitor-exit"
158
+ '(" do" " if" " let*" " var"
159
+ " fn" " fn*" " loop*" " recur"
160
+ " throw" " try" " catch" " finally"
161
+ " set!" " new"
162
+ " monitor-enter" " monitor-exit"
175
163
" quote"
176
164
177
- " ->"
178
- " ->>"
179
- " .."
180
- " amap"
181
- " and"
182
- " areduce"
183
- " as->"
184
- " assert"
185
- " binding"
186
- " bound-fn"
187
- " case"
188
- " comment"
189
- " cond"
190
- " cond->"
191
- " cond->>"
192
- " condp"
193
- " declare"
194
- " delay"
195
- " doall"
196
- " dorun"
197
- " doseq"
198
- " dosync"
199
- " dotimes"
200
- " doto"
201
- " extend-protocol"
202
- " extend-type"
203
- " for"
204
- " future"
205
- " gen-class"
206
- " gen-interface"
207
- " if-let"
208
- " if-not"
209
- " if-some"
210
- " import"
211
- " in-ns"
212
- " io!"
213
- " lazy-cat"
214
- " lazy-seq"
215
- " let"
216
- " letfn"
217
- " locking"
218
- " loop"
219
- " memfn"
220
- " ns"
221
- " or"
222
- " proxy"
223
- " proxy-super"
224
- " pvalues"
225
- " refer-clojure"
226
- " reify"
227
- " some->"
228
- " some->>"
229
- " sync"
230
- " time"
231
- " vswap!"
232
- " when"
233
- " when-first"
234
- " when-let"
235
- " when-not"
236
- " when-some"
237
- " while"
238
- " with-bindings"
239
- " with-in-str"
240
- " with-loading-context"
241
- " with-local-vars"
242
- " with-open"
243
- " with-out-str"
244
- " with-precision"
245
- " with-redefs"
246
- " with-redefs-fn" ))
165
+ " ->" " ->>" " .." " ."
166
+ " amap" " and" " areduce" " as->" " assert"
167
+ " binding" " bound-fn"
168
+ " case" " comment" " cond" " cond->" " cond->>" " condp"
169
+ " declare" " def" " definline" " definterface" " defmacro" " defmethod"
170
+ " defmulti" " defn" " defn-" " defonce" " defprotocol" " defrecord"
171
+ " defstruct" " deftype"
172
+ " delay" " doall" " dorun" " doseq" " dosync" " dotimes" " doto"
173
+ " extend-protocol" " extend-type"
174
+ " for" " future"
175
+ " gen-class" " gen-interface"
176
+ " if-let" " if-not" " if-some" " import" " in-ns" " io!"
177
+ " lazy-cat" " lazy-seq" " let" " letfn" " locking" " loop"
178
+ " memfn" " ns" " or"
179
+ " proxy" " proxy-super" " pvalues"
180
+ " refer-clojure" " reify"
181
+ " some->" " some->>" " sync"
182
+ " time" " vswap!"
183
+ " when" " when-first" " when-let" " when-not" " when-some" " while"
184
+ " with-bindings" " with-in-str" " with-loading-context"
185
+ " with-local-vars" " with-open" " with-out-str" " with-precision"
186
+ " with-redefs" " with-redefs-fn" ))
247
187
" $" )))
248
188
249
189
(defface clojure-ts-keyword-face
@@ -268,13 +208,9 @@ Only intended for use at development time.")
268
208
(rx line-start (or " def" " defonce" ) line-end))
269
209
270
210
(defconst clojure-ts--type-keyword-regexp
271
- (rx line-start (or " defprotocol"
272
- " defmulti"
273
- " deftype"
274
- " defrecord"
275
- " definterface"
276
- " defmethod"
277
- " defstruct" )
211
+ (rx line-start
212
+ (or " defprotocol" " defmulti" " deftype" " defrecord"
213
+ " definterface" " defmethod" " defstruct" )
278
214
line-end))
279
215
280
216
(defun clojure-ts--font-lock-settings ()
@@ -283,7 +219,7 @@ Only intended for use at development time.")
283
219
:feature 'string
284
220
:language 'clojure
285
221
'((str_lit) @font-lock-string-face
286
- (regex_lit) @font-lock-string -face)
222
+ (regex_lit) @font-lock-regexp -face)
287
223
288
224
:feature 'regex
289
225
:language 'clojure
@@ -317,6 +253,13 @@ Only intended for use at development time.")
317
253
((sym_name) @font-lock-builtin-face
318
254
(:match , clojure-ts--builtin-dynamic-var-regexp @font-lock-builtin-face)))
319
255
256
+ ; ; Any function calls, not built-ins.
257
+ ; ; This can give false positives (macros, quoted lists, namespace imports)
258
+ ; ; but is a level 4 feature and never enabled by default.
259
+ :feature 'function
260
+ :language 'clojure
261
+ '((list_lit :anchor (sym_lit (sym_name) @font-lock-function-call-face)))
262
+
320
263
:feature 'symbol
321
264
:language 'clojure
322
265
'((sym_ns) @font-lock-type-face)
@@ -327,34 +270,42 @@ Only intended for use at development time.")
327
270
; ; No wonder the tree-sitter-clojure grammar only touches syntax, and not semantics
328
271
:feature 'definition ; ; defn and defn like macros
329
272
:language 'clojure
330
- `(((list_lit :anchor (sym_lit (sym_name) @font-lock-keyword-face )
273
+ `(((list_lit :anchor (sym_lit (sym_name) @def )
331
274
:anchor (sym_lit (sym_name) @font-lock-function-name-face))
332
- (:match , clojure-ts--definition-keyword-regexp
333
- @font-lock-keyword-face))
275
+ (:match , clojure-ts--definition-keyword-regexp @def))
334
276
((anon_fn_lit
335
277
marker: " #" @font-lock-property-face)))
336
278
337
279
:feature 'variable ; ; def, defonce
338
280
:language 'clojure
339
- `(((list_lit :anchor (sym_lit (sym_name) @font-lock-keyword-face )
281
+ `(((list_lit :anchor (sym_lit (sym_name) @def )
340
282
:anchor (sym_lit (sym_name) @font-lock-variable-name-face))
341
- (:match , clojure-ts--variable-keyword-regexp @font-lock-keyword-face )))
283
+ (:match , clojure-ts--variable-keyword-regexp @def )))
342
284
343
- :feature 'type ; ; deftype, defmulti, defprotocol, etc
285
+ ; ; Can we support declarations in the namespace form?
286
+ :feature 'type
344
287
:language 'clojure
345
- `(((list_lit :anchor (sym_lit (sym_name) @font-lock-keyword-face)
288
+ `(; ; Type Declarations
289
+ ((list_lit :anchor (sym_lit (sym_name) @def)
346
290
:anchor (sym_lit (sym_name) @font-lock-type-face))
347
- (:match , clojure-ts--type-keyword-regexp @font-lock-keyword-face)))
291
+ (:match , clojure-ts--type-keyword-regexp @def))
292
+ ; ; Type Hints
293
+ (meta_lit
294
+ marker: " ^" @font-lock-operator-face
295
+ value: (sym_lit (sym_name) @font-lock-type-face))
296
+ (old_meta_lit
297
+ marker: " #^" @font-lock-operator-face
298
+ value: (sym_lit (sym_name) @font-lock-type-face)))
348
299
349
300
:feature 'metadata
350
301
:language 'clojure
351
302
:override t
352
- `((meta_lit marker: " ^ " @font-lock-property-face)
353
- (meta_lit value: (kwd_lit) @font-lock-property -face) ; ; metadata
354
- (meta_lit value: (sym_lit (sym_name ) @font-lock-type- face)) ; ; typehint
355
- (old_meta_lit marker: " #^ " @font-lock-property-face)
356
- (old_meta_lit value: (kwd_lit) @font-lock-property -face) ; ; metadata
357
- (old_meta_lit value: (sym_lit (sym_name ) @font-lock-type- face))) ; ; typehint
303
+ `((meta_lit
304
+ marker: " ^ " @font-lock-operator -face
305
+ value: (kwd_lit (kwd_name ) @font-lock-property-name- face))
306
+ (old_meta_lit
307
+ marker: " #^ " @font-lock-operator -face
308
+ value: (kwd_lit (kwd_name ) @font-lock-property-name- face)))
358
309
359
310
:feature 'tagged-literals
360
311
:language 'clojure
@@ -364,6 +315,7 @@ Only intended for use at development time.")
364
315
365
316
; ; TODO, also account for `def'
366
317
; ; Figure out how to highlight symbols in docstrings.
318
+ ; ; Might require a markdown grammar
367
319
:feature 'doc
368
320
:language 'clojure
369
321
:override t
@@ -633,9 +585,10 @@ See `clojure-ts--standard-definition-node-name' for the implementation used.")
633
585
treesit-defun-name-function #'clojure-ts--standard-definition-node-name
634
586
treesit-simple-imenu-settings clojure-ts--imenu-settings
635
587
treesit-font-lock-feature-list
636
- '((comment string char number)
637
- (keyword constant symbol bracket builtin)
638
- (deref quote metadata definition variable type doc regex tagged-literals)))
588
+ '((comment definition variable)
589
+ (keyword string char symbol builtin type)
590
+ (constant number quote metadata)
591
+ (bracket deref function regex tagged-literals)))
639
592
(when (boundp 'treesit-thing-settings ) ; ; Emacs 30+
640
593
(setq-local treesit-thing-settings clojure-ts--thing-settings))
641
594
(when clojure-ts--debug
0 commit comments