branch: elpa/clojure-ts-mode
commit 82c4b33ea7f40f3251b577bf83b0827a7314dba3
Author: Roman Rudakov <rruda...@fastmail.com>
Commit: Bozhidar Batsov <bozhi...@batsov.dev>

    [#15] Introduce clojure-ts-extra-def-forms customization
---
 CHANGELOG.md                           |  9 +++++----
 README.md                              | 31 +++++++++++++++++++++++++++++++
 clojure-ts-mode.el                     | 21 +++++++++++++++++++++
 test/clojure-ts-mode-font-lock-test.el | 19 +++++++++++++++++++
 4 files changed, 76 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 85455994d2..2045f19363 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,11 +11,12 @@
 - [#99](https://github.com/clojure-emacs/clojure-ts-mode/pull/99): Fix bug in 
`clojure-ts-align` when nested form has extra spaces.
 - [#99](https://github.com/clojure-emacs/clojure-ts-mode/pull/99): Fix bug in 
`clojure-ts-unwind` when there is only one expression after
   threading symbol.
-- Introduce `clojure-ts-jank-use-cpp-parser` customization which allows
+- [#103](https://github.com/clojure-emacs/clojure-ts-mode/issues/103): 
Introduce `clojure-ts-jank-use-cpp-parser` customization which allows
   highlighting C++ syntax in Jank `native/raw` forms.
-- Introduce `clojure-ts-clojurescript-use-js-parser` customization which allows
-  highlighting JS syntax in ClojureScript `js*` forms.
-
+- [#103](https://github.com/clojure-emacs/clojure-ts-mode/issues/103): 
Introduce `clojure-ts-clojurescript-use-js-parser` customization which
+  allows highlighting JS syntax in ClojureScript `js*` forms.
+- Introduce the `clojure-ts-extra-def-forms` customization option to specify
+  additional `defn`-like forms that should be fontified.
 
 ## 0.4.0 (2025-05-15)
 
diff --git a/README.md b/README.md
index f165b7c22f..d52ba1cf69 100644
--- a/README.md
+++ b/README.md
@@ -318,6 +318,37 @@ highlighted like regular Clojure code.
 > section](https://www.gnu.org/software/emacs/manual/html_node/emacs/Parser_002dbased-Font-Lock.html)
 > of the Emacs manual for more details.
 
+#### Extending font-lock rules
+
+In `clojure-ts-mode` it is possible to specify additional defn-like forms that
+should be fontified.  For example to highlight the following form from Hiccup
+library as a function definition:
+
+```clojure
+(defelem file-upload
+  "Creates a file upload input."
+  [name]
+  (input-field "file" name nil))
+```
+
+You can add `defelem` to `clojure-ts-extra-def-forms` list like this:
+
+```emacs-lisp
+(add-to-list 'clojure-ts-extra-def-forms "defelem")
+```
+
+or set this variable using `setopt`:
+
+```emacs-lisp
+(setopt clojure-ts-extra-def-forms '("defelem"))
+```
+
+This setting will highlight `defelem` symbol, function name and the docstring.
+
+**NOTE**: Setting `clojure-ts-extra-def-forms` won't change the indentation 
rule for
+these forms.  For indentation rules you should use
+`clojure-ts-semantic-indent-rules` variable (see [semantic 
indentation](#customizing-semantic-indentation) section).
+
 ### Highlight markdown syntax in docstrings
 
 By default Markdown syntax is highlighted in the docstrings using
diff --git a/clojure-ts-mode.el b/clojure-ts-mode.el
index 4b645829b7..c41f7f3e64 100644
--- a/clojure-ts-mode.el
+++ b/clojure-ts-mode.el
@@ -260,6 +260,12 @@ values like this:
   :safe #'booleanp
   :type 'boolean)
 
+(defcustom clojure-ts-extra-def-forms nil
+  "List of forms that should be fontified the same way as defn."
+  :package-version '(clojure-ts-mode . "0.5")
+  :safe #'listp
+  :type '(repeat string))
+
 (defvar clojure-ts-mode-remappings
   '((clojure-mode . clojure-ts-mode)
     (clojurescript-mode . clojure-ts-clojurescript-mode)
@@ -468,6 +474,15 @@ if a third argument (the value) is provided.
                :anchor (str_lit (str_content) ,capture-symbol) 
@font-lock-doc-face)
      (:match ,clojure-ts-function-docstring-symbols
              @_def_symbol))
+    ((list_lit :anchor [(comment) (meta_lit) (old_meta_lit)] :*
+               :anchor (sym_lit) @_def_symbol
+               :anchor [(comment) (meta_lit) (old_meta_lit)] :*
+               ;; Function_name
+               :anchor (sym_lit)
+               :anchor [(comment) (meta_lit) (old_meta_lit)] :*
+               :anchor (str_lit (str_content) ,capture-symbol) 
@font-lock-doc-face)
+     (:match ,(clojure-ts-symbol-regexp clojure-ts-extra-def-forms)
+             @_def_symbol))
     ;; Captures docstrings in defprotcol, definterface
     ((list_lit :anchor [(comment) (meta_lit) (old_meta_lit)] :*
                :anchor (sym_lit) @_def_symbol
@@ -630,6 +645,12 @@ literals with regex grammar."
                         "defonce")
                        eol))
                @font-lock-keyword-face))
+      ((list_lit :anchor [(comment) (meta_lit) (old_meta_lit)] :*
+                 :anchor (sym_lit (sym_name) @font-lock-keyword-face)
+                 :anchor [(comment) (meta_lit) (old_meta_lit)] :*
+                 :anchor (sym_lit (sym_name) @font-lock-function-name-face))
+       (:match ,(clojure-ts-symbol-regexp clojure-ts-extra-def-forms)
+               @font-lock-keyword-face))
       ((anon_fn_lit
         marker: "#" @font-lock-property-face))
       ;; Methods implementation
diff --git a/test/clojure-ts-mode-font-lock-test.el 
b/test/clojure-ts-mode-font-lock-test.el
index 1fa9ed1493..4770ccf37e 100644
--- a/test/clojure-ts-mode-font-lock-test.el
+++ b/test/clojure-ts-mode-font-lock-test.el
@@ -230,3 +230,22 @@ DESCRIPTION is the description of the spec."
     (set-parameter [m ^PreparedStatement s i]
       (.setObject s i (->pgobject m))))"
      (81 93 font-lock-function-name-face))))
+
+;;;; Extra def forms
+
+(describe "clojure-ts-extra-def-forms"
+  (it "should respect the value of clojure-ts-extra-def-forms"
+    (with-clojure-ts-buffer "(defelem file-upload
+  \"Creates a file upload input.\"
+  [name]
+  (input-field \"file\" name nil))"
+      (setopt clojure-ts-extra-def-forms '("defelem"))
+      (clojure-ts-mode)
+      (font-lock-ensure)
+      (goto-char (point-min))
+      (expect (get-text-property 2 'face)
+              :to-equal 'font-lock-keyword-face)
+      (expect (get-text-property 10 'face)
+              :to-equal 'font-lock-function-name-face)
+      (expect (get-text-property 25 'face)
+              :to-equal 'font-lock-doc-face))))

Reply via email to