Skip to content

Commit f87df24

Browse files
committed
Highlight regular expressions with tree-sitter-regex grammar
This grammar is bundled in nixos by default and seems good enough for java regular expressions (the grammar probably supports more features than java, idk). Should address issue #11
1 parent d698528 commit f87df24

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

clojure-ts-mode.el

+36-1
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,35 @@ Only intended for use at development time.")
287287

288288
:feature 'regex
289289
:language 'clojure
290-
:override t
291290
'((regex_lit marker: _ @font-lock-property-face))
292291

292+
;; https://github.com/tree-sitter/tree-sitter-regex/blob/master/grammar.js
293+
:feature 'regex
294+
:language 'regex
295+
:override t
296+
'(;; Capturing Groups
297+
((anonymous_capturing_group (["(" ")"]) @font-lock-regexp-grouping-construct))
298+
((non_capturing_group (["(?:" ")"]) @font-lock-regexp-grouping-construct))
299+
((lookahead_assertion (["(?" "=" "!" ")"]) @font-lock-regexp-grouping-construct))
300+
((named_capturing_group (["(?<" ">" ")"]) @font-lock-regexp-grouping-construct))
301+
((group_name) @font-lock-variable-name-face)
302+
;; Character classes
303+
((character_class (["[" "]"]) @font-lock-bracket-face))
304+
((character_class "^" @font-lock-negation-char-face))
305+
((class_range "-" @font-lock-punctuation-face))
306+
;; Quantifiers
307+
([(zero_or_more) (one_or_more) (optional)]) @font-lock-operator-face
308+
((count_quantifier (["{" "}"]) @font-lock-bracket-face))
309+
((count_quantifier "," @font-lock-punctuation-face))
310+
((count_quantifier (decimal_digits) @font-lock-number-face))
311+
;;; Escaping
312+
([(start_assertion) (any_character) (end_assertion)]) @font-lock-operator-face
313+
([(decimal_escape)
314+
(identity_escape)
315+
(character_class_escape)]) @font-lock-regexp-grouping-backslash
316+
((pattern_character) @font-lock-regexp-face)
317+
([(control_escape) (boundary_assertion)] @font-lock-builtin-face))
318+
293319
:feature 'number
294320
:language 'clojure
295321
'((num_lit) @font-lock-number-face)
@@ -597,6 +623,12 @@ See `clojure-ts--standard-definition-node-name' for the implementation used.")
597623
(interactive)
598624
(message "clojure-ts-mode (version %s)" clojure-ts-mode-version))
599625

626+
(defvar clojure-ts--treesit-range-settings
627+
(treesit-range-rules
628+
:embed 'regex
629+
:host 'clojure
630+
'((regex_lit) @capture)))
631+
600632
;;;###autoload
601633
(define-derived-mode clojure-ts-mode prog-mode "Clojure[TS]"
602634
"Major mode for editing Clojure code.
@@ -607,6 +639,9 @@ See `clojure-ts--standard-definition-node-name' for the implementation used.")
607639
(treesit-install-language-grammar 'clojure))
608640
(setq-local comment-start ";")
609641
(when (treesit-ready-p 'clojure)
642+
(when (treesit-ready-p 'regex 'message)
643+
(treesit-parser-create 'regex)
644+
(setq-local treesit-range-settings clojure-ts--treesit-range-settings))
610645
(treesit-parser-create 'clojure)
611646
(setq-local treesit-font-lock-settings (clojure-ts--font-lock-settings)
612647
treesit-defun-prefer-top-level t

test/test.clj

+1-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ Etiam commodo nulla id risus convallis pharetra. Integer dapibus, eros vitae veh
264264
(println "Hello, World!"))
265265

266266
(binding [*out* nil]
267-
#"regex string"
267+
#"^(?<lookup>abc)[0-9]\b$"
268268
(def #^Typehint x 1)
269269
(def #^:metadata x 1)
270270
(def ^Typehint x 2)

0 commit comments

Comments
 (0)