@@ -120,6 +120,12 @@ double quotes on the third column."
120
120
:safe #'booleanp
121
121
:package-version '(clojure-ts-mode . " 0.2.3" ))
122
122
123
+ (defcustom clojure-ts-use-regex-parser t
124
+ " When non-nil, use separate grammar to highlight regex syntax."
125
+ :type 'boolean
126
+ :safe #'booleanp
127
+ :package-version '(clojure-ts-mode . " 0.4" ))
128
+
123
129
(defcustom clojure-ts-auto-remap t
124
130
" When non-nil, redirect all `clojure-mode' buffers to `clojure-ts-mode' ."
125
131
:safe #'booleanp
@@ -342,17 +348,37 @@ if a third argument (the value) is provided.
342
348
:* )
343
349
(:match , clojure-ts--interface-def-symbol-regexp @_def_symbol))))
344
350
345
- (defvar clojure-ts--treesit-range-settings
346
- (treesit-range-rules
347
- :embed 'markdown-inline
348
- :host 'clojure
349
- :local t
350
- (clojure-ts--docstring-query '@capture )))
351
+ (defun clojure-ts--treesit-range-settings (use-markdown-inline use-regex )
352
+ " Return value for `treesit-range-settings' for `clojure-ts-mode' .
351
353
352
- (defun clojure-ts--font-lock-settings (markdown-available )
354
+ When USE-MARKDOWN-INLINE is non-nil, include range settings for
355
+ markdown-inline parser.
356
+
357
+ When USE-REGEX is non-nil, include range settings for regex parser."
358
+ (append
359
+ (when use-markdown-inline
360
+ (treesit-range-rules
361
+ :embed 'markdown-inline
362
+ :host 'clojure
363
+ :offset '(1 . -1 )
364
+ :local t
365
+ (clojure-ts--docstring-query '@capture )))
366
+ (when use-regex
367
+ (treesit-range-rules
368
+ :embed 'regex
369
+ :host 'clojure
370
+ :offset '(2 . -1 )
371
+ :local t
372
+ '((regex_lit) @capture)))))
373
+
374
+ (defun clojure-ts--font-lock-settings (markdown-available regex-available )
353
375
" Return font lock settings suitable for use in `treesit-font-lock-settings' .
376
+
354
377
When MARKDOWN-AVAILABLE is non-nil, includes rules for highlighting docstrings
355
- with the markdown-inline grammar."
378
+ with the markdown-inline grammar.
379
+
380
+ When REGEX-AVAILABLE is non-nil, includes rules for highlighting regex
381
+ literals with regex grammar."
356
382
(append
357
383
(treesit-font-lock-rules
358
384
:feature 'string
@@ -525,6 +551,44 @@ with the markdown-inline grammar."
525
551
(inline_link (link_destination) @font-lock-constant-face)
526
552
(shortcut_link (link_text) @link)])))
527
553
554
+ (when regex-available
555
+ ; ; Queries are adapted from
556
+ ; ; https://github.com/tree-sitter/tree-sitter-regex/blob/v0.24.3/queries/highlights.scm.
557
+ (treesit-font-lock-rules
558
+ :feature 'regex
559
+ :language 'regex
560
+ :override t
561
+ '(([" ("
562
+ " )"
563
+ " (?"
564
+ " (?:"
565
+ " (?<"
566
+ " (?P<"
567
+ " (?P="
568
+ " >"
569
+ " ["
570
+ " ]"
571
+ " {"
572
+ " }"
573
+ " [:"
574
+ " :]" ] @font-lock-regexp-grouping-construct)
575
+ ([" *"
576
+ " +"
577
+ " ?"
578
+ " |"
579
+ " ="
580
+ " !" ] @font-lock-property-name-face)
581
+ ((group_name) @font-lock-variable-name-face)
582
+ ((count_quantifier
583
+ [(decimal_digits) @font-lock-number-face
584
+ " ," @font-lock-delimiter-face]))
585
+ ((flags) @font-lock-constant-face)
586
+ ((character_class
587
+ [" ^" @font-lock-escape-face
588
+ (class_range " -" @font-lock-escape-face)]))
589
+ ((identity_escape) @font-lock-builtin-face)
590
+ ([(start_assertion) (end_assertion)] @font-lock-constant-face))))
591
+
528
592
(treesit-font-lock-rules
529
593
:feature 'quote
530
594
:language 'clojure
@@ -1315,7 +1379,9 @@ If JUSTIFY is non-nil, justify as well as fill the paragraph."
1315
1379
" v0.0.13" )
1316
1380
(markdown-inline " https://github.com/MDeiml/tree-sitter-markdown"
1317
1381
" v0.4.1"
1318
- " tree-sitter-markdown-inline/src" ))
1382
+ " tree-sitter-markdown-inline/src" )
1383
+ (regex " https://github.com/tree-sitter/tree-sitter-regex"
1384
+ " v0.24.3" ))
1319
1385
" Intended to be used as the value for `treesit-language-source-alist' ." )
1320
1386
1321
1387
(defun clojure-ts--ensure-grammars ()
@@ -1344,19 +1410,20 @@ function can also be used to upgrade the grammars if they are outdated."
1344
1410
(let ((treesit-language-source-alist clojure-ts-grammar-recipes))
1345
1411
(treesit-install-language-grammar grammar)))))
1346
1412
1347
- (defun clojure-ts-mode-variables (&optional markdown-available )
1413
+ (defun clojure-ts-mode-variables (&optional markdown-available regex-available )
1348
1414
" Initialize buffer-local variables for `clojure-ts-mode' .
1349
- See `clojure-ts--font-lock-settings' for usage of MARKDOWN-AVAILABLE."
1415
+ See `clojure-ts--font-lock-settings' for usage of MARKDOWN-AVAILABLE and
1416
+ REGEX-AVAILABLE."
1350
1417
(setq-local comment-add 1 )
1351
1418
(setq-local comment-start " ;" )
1352
1419
1353
1420
(setq-local treesit-font-lock-settings
1354
- (clojure-ts--font-lock-settings markdown-available))
1421
+ (clojure-ts--font-lock-settings markdown-available regex-available ))
1355
1422
(setq-local treesit-font-lock-feature-list
1356
1423
'((comment definition variable)
1357
1424
(keyword string char symbol builtin type)
1358
- (constant number quote metadata doc)
1359
- (bracket deref function regex tagged-literals)))
1425
+ (constant number quote metadata doc regex )
1426
+ (bracket deref function tagged-literals)))
1360
1427
1361
1428
(setq-local treesit-defun-prefer-top-level t )
1362
1429
(setq-local treesit-defun-tactic 'top-level )
@@ -1389,13 +1456,16 @@ See `clojure-ts--font-lock-settings' for usage of MARKDOWN-AVAILABLE."
1389
1456
:syntax-table clojure-ts-mode-syntax-table
1390
1457
(clojure-ts--ensure-grammars)
1391
1458
(let ((use-markdown-inline (and clojure-ts-use-markdown-inline
1392
- (treesit-ready-p 'markdown-inline t ))))
1393
- (when use-markdown-inline
1394
- (setq-local treesit-range-settings clojure-ts--treesit-range-settings))
1459
+ (treesit-ready-p 'markdown-inline t )))
1460
+ (use-regex (and clojure-ts-use-regex-parser
1461
+ (treesit-ready-p 'regex t ))))
1462
+ (setq-local treesit-range-settings
1463
+ (clojure-ts--treesit-range-settings use-markdown-inline
1464
+ use-regex))
1395
1465
1396
1466
(when (treesit-ready-p 'clojure )
1397
1467
(treesit-parser-create 'clojure )
1398
- (clojure-ts-mode-variables use-markdown-inline)
1468
+ (clojure-ts-mode-variables use-markdown-inline use-regex )
1399
1469
1400
1470
(when clojure-ts--debug
1401
1471
(setq-local treesit--indent-verbose t )
0 commit comments