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))))