@@ -121,6 +121,12 @@ double quotes on the third column."
121
121
:safe #'booleanp
122
122
:package-version '(clojure-ts-mode . " 0.2.3" ))
123
123
124
+ (defcustom clojure-ts-use-regex-parser t
125
+ " When non-nil, use separate grammar to highlight regex syntax."
126
+ :type 'boolean
127
+ :safe #'booleanp
128
+ :package-version '(clojure-ts-mode . " 0.4" ))
129
+
124
130
(defcustom clojure-ts-auto-remap t
125
131
" When non-nil, redirect all `clojure-mode' buffers to `clojure-ts-mode' ."
126
132
:safe #'booleanp
@@ -407,17 +413,37 @@ if a third argument (the value) is provided.
407
413
:* )
408
414
(:match , clojure-ts--interface-def-symbol-regexp @_def_symbol))))
409
415
410
- (defvar clojure-ts--treesit-range-settings
411
- (treesit-range-rules
412
- :embed 'markdown-inline
413
- :host 'clojure
414
- :local t
415
- (clojure-ts--docstring-query '@capture )))
416
+ (defun clojure-ts--treesit-range-settings (use-markdown-inline use-regex )
417
+ " Return value for `treesit-range-settings' for `clojure-ts-mode' .
416
418
417
- (defun clojure-ts--font-lock-settings (markdown-available )
419
+ When USE-MARKDOWN-INLINE is non-nil, include range settings for
420
+ markdown-inline parser.
421
+
422
+ When USE-REGEX is non-nil, include range settings for regex parser."
423
+ (append
424
+ (when use-markdown-inline
425
+ (treesit-range-rules
426
+ :embed 'markdown-inline
427
+ :host 'clojure
428
+ :offset '(1 . -1 )
429
+ :local t
430
+ (clojure-ts--docstring-query '@capture )))
431
+ (when use-regex
432
+ (treesit-range-rules
433
+ :embed 'regex
434
+ :host 'clojure
435
+ :offset '(2 . -1 )
436
+ :local t
437
+ '((regex_lit) @capture)))))
438
+
439
+ (defun clojure-ts--font-lock-settings (markdown-available regex-available )
418
440
" Return font lock settings suitable for use in `treesit-font-lock-settings' .
441
+
419
442
When MARKDOWN-AVAILABLE is non-nil, includes rules for highlighting docstrings
420
- with the markdown-inline grammar."
443
+ with the markdown-inline grammar.
444
+
445
+ When REGEX-AVAILABLE is non-nil, includes rules for highlighting regex
446
+ literals with regex grammar."
421
447
(append
422
448
(treesit-font-lock-rules
423
449
:feature 'string
@@ -590,6 +616,44 @@ with the markdown-inline grammar."
590
616
(inline_link (link_destination) @font-lock-constant-face)
591
617
(shortcut_link (link_text) @link)])))
592
618
619
+ (when regex-available
620
+ ; ; Queries are adapted from
621
+ ; ; https://github.com/tree-sitter/tree-sitter-regex/blob/v0.24.3/queries/highlights.scm.
622
+ (treesit-font-lock-rules
623
+ :feature 'regex
624
+ :language 'regex
625
+ :override t
626
+ '(([" ("
627
+ " )"
628
+ " (?"
629
+ " (?:"
630
+ " (?<"
631
+ " (?P<"
632
+ " (?P="
633
+ " >"
634
+ " ["
635
+ " ]"
636
+ " {"
637
+ " }"
638
+ " [:"
639
+ " :]" ] @font-lock-regexp-grouping-construct)
640
+ ([" *"
641
+ " +"
642
+ " ?"
643
+ " |"
644
+ " ="
645
+ " !" ] @font-lock-property-name-face)
646
+ ((group_name) @font-lock-variable-name-face)
647
+ ((count_quantifier
648
+ [(decimal_digits) @font-lock-number-face
649
+ " ," @font-lock-delimiter-face]))
650
+ ((flags) @font-lock-constant-face)
651
+ ((character_class
652
+ [" ^" @font-lock-escape-face
653
+ (class_range " -" @font-lock-escape-face)]))
654
+ ((identity_escape) @font-lock-builtin-face)
655
+ ([(start_assertion) (end_assertion)] @font-lock-constant-face))))
656
+
593
657
(treesit-font-lock-rules
594
658
:feature 'quote
595
659
:language 'clojure
@@ -1555,7 +1619,9 @@ between BEG and END."
1555
1619
" v0.0.13" )
1556
1620
(markdown-inline " https://github.com/MDeiml/tree-sitter-markdown"
1557
1621
" v0.4.1"
1558
- " tree-sitter-markdown-inline/src" ))
1622
+ " tree-sitter-markdown-inline/src" )
1623
+ (regex " https://github.com/tree-sitter/tree-sitter-regex"
1624
+ " v0.24.3" ))
1559
1625
" Intended to be used as the value for `treesit-language-source-alist' ." )
1560
1626
1561
1627
(defun clojure-ts--ensure-grammars ()
@@ -1584,20 +1650,22 @@ function can also be used to upgrade the grammars if they are outdated."
1584
1650
(let ((treesit-language-source-alist clojure-ts-grammar-recipes))
1585
1651
(treesit-install-language-grammar grammar)))))
1586
1652
1587
- (defun clojure-ts-mode-variables (&optional markdown-available )
1653
+ (defun clojure-ts-mode-variables (&optional markdown-available regex-available )
1588
1654
" Initialize buffer-local variables for `clojure-ts-mode' .
1589
- See `clojure-ts--font-lock-settings' for usage of MARKDOWN-AVAILABLE."
1655
+
1656
+ See `clojure-ts--font-lock-settings' for usage of MARKDOWN-AVAILABLE and
1657
+ REGEX-AVAILABLE."
1590
1658
(setq-local indent-tabs-mode nil )
1591
1659
(setq-local comment-add 1 )
1592
1660
(setq-local comment-start " ;" )
1593
1661
1594
1662
(setq-local treesit-font-lock-settings
1595
- (clojure-ts--font-lock-settings markdown-available))
1663
+ (clojure-ts--font-lock-settings markdown-available regex-available ))
1596
1664
(setq-local treesit-font-lock-feature-list
1597
1665
'((comment definition variable)
1598
1666
(keyword string char symbol builtin type)
1599
- (constant number quote metadata doc)
1600
- (bracket deref function regex tagged-literals)))
1667
+ (constant number quote metadata doc regex )
1668
+ (bracket deref function tagged-literals)))
1601
1669
1602
1670
(setq-local treesit-defun-prefer-top-level t )
1603
1671
(setq-local treesit-defun-tactic 'top-level )
@@ -1630,13 +1698,16 @@ See `clojure-ts--font-lock-settings' for usage of MARKDOWN-AVAILABLE."
1630
1698
:syntax-table clojure-ts-mode-syntax-table
1631
1699
(clojure-ts--ensure-grammars)
1632
1700
(let ((use-markdown-inline (and clojure-ts-use-markdown-inline
1633
- (treesit-ready-p 'markdown-inline t ))))
1634
- (when use-markdown-inline
1635
- (setq-local treesit-range-settings clojure-ts--treesit-range-settings))
1701
+ (treesit-ready-p 'markdown-inline t )))
1702
+ (use-regex (and clojure-ts-use-regex-parser
1703
+ (treesit-ready-p 'regex t ))))
1704
+ (setq-local treesit-range-settings
1705
+ (clojure-ts--treesit-range-settings use-markdown-inline
1706
+ use-regex))
1636
1707
1637
1708
(when (treesit-ready-p 'clojure )
1638
1709
(treesit-parser-create 'clojure )
1639
- (clojure-ts-mode-variables use-markdown-inline)
1710
+ (clojure-ts-mode-variables use-markdown-inline use-regex )
1640
1711
1641
1712
(when clojure-ts--debug
1642
1713
(setq-local treesit--indent-verbose t )
0 commit comments