branch: elpa/typst-ts-mode
commit 755615407a2da40ee486876484e19c99a7723ac0
Author: Meow King <[email protected]>
Commit: Meow King <[email protected]>
feat: add more predefined embedding language settings
---
justfile | 1 +
typst-ts-embedding-lang-settings.el | 179 +++++++++++++++++++++++++-----------
typst-ts-mode.el | 9 +-
3 files changed, 131 insertions(+), 58 deletions(-)
diff --git a/justfile b/justfile
index 16cd0d90d2..637dff6d97 100644
--- a/justfile
+++ b/justfile
@@ -1,4 +1,5 @@
els-settings-test:
emacs --batch -l ./typst-ts-embedding-lang-settings.el \
-l ~/.emacs.d/.local/elpaca/repos/emacs-kotlin-ts-mode/kotlin-ts-mode.el \
+ -l ~/.emacs.d/.local/elpaca/repos/mermaid-ts-mode/mermaid-ts-mode.el \
--eval "(typst-ts-embedding-lang-settings-test)"
diff --git a/typst-ts-embedding-lang-settings.el
b/typst-ts-embedding-lang-settings.el
index 3a1097c8b2..b69d2ff3e1 100644
--- a/typst-ts-embedding-lang-settings.el
+++ b/typst-ts-embedding-lang-settings.el
@@ -37,9 +37,10 @@ error occurs."
:type 'boolean
:group 'typst-ts)
-(defcustom typst-ts-highlight-raw-block-langs-not-in-settings nil
+(defcustom typst-ts-highlight-raw-block-langs-not-in-predefined-settings t
"Whether to highlight raw block of language that is not in settings.
-The cost for setting up these languages is usually higher than those
+i.e. not in `typst-ts-embedding-lang-settings'.
+The cost for setting up other languages is usually higher than those
languages in settings."
:type 'boolean
:group 'typst-ts)
@@ -468,15 +469,15 @@ languages in settings."
( keyword string type directives)
( constant escape-sequence expression literal property)
( function bracket delimiter error))))
- (clojure . (:feature
- cmake-ts-mode
- :font-lock cmake-ts-mode--font-lock-settings
- :indentation cmake-ts-mode--indent-rules
- :ts-feature-list
- '((comment)
- (keyword string)
- (builtin constant escape-sequence function number variable)
- (bracket error misc-punctuation))))
+ (cmake . (:feature
+ cmake-ts-mode
+ :font-lock cmake-ts-mode--font-lock-settings
+ :indentation cmake-ts-mode--indent-rules
+ :ts-feature-list
+ '((comment)
+ (keyword string)
+ (builtin constant escape-sequence function number variable)
+ (bracket error misc-punctuation))))
(cpp . (:feature
c-ts-mode
:font-lock (c-ts-mode--font-lock-settings 'cpp)
@@ -574,6 +575,16 @@ languages in settings."
'((comment number string definition)
(keyword builtin type constant variable)
(escape-sequence function property))))
+ (lua . (:feature
+ lua-ts-mode
+ :font-lock lua-ts--font-lock-settings
+ :indentation lua-ts--simple-indent-rules
+ :ts-feature-list
+ '((comment definition)
+ (keyword string)
+ (assignment builtin constant number)
+ (bracket delimiter escape function
+ operator property punctuation variable))))
(python . (:feature
python
:font-lock python--treesit-settings
@@ -584,6 +595,18 @@ languages in settings."
( assignment builtin constant decorator
escape-sequence number string-interpolation )
( bracket delimiter function operator variable property ))))
+ (ruby . (:feature
+ ruby-ts-mode
+ :font-lock (ruby-ts--font-lock-settings 'ruby)
+ :indentation (ruby-ts--indent-rules)
+ :ts-feature-list
+ '(( comment method-definition parameter-definition)
+ ( keyword regexp string type)
+ ( builtin-variable builtin-constant builtin-function
+ delimiter escape-sequence
+ constant global instance
+ interpolation literal symbol assignment)
+ ( bracket error function operator punctuation))))
(rust . (:feature
rust-ts-mode
:font-lock rust-ts-mode--font-lock-settings
@@ -593,18 +616,61 @@ languages in settings."
( keyword string)
( assignment attribute builtin constant escape-sequence
number type)
- ( bracket delimiter error function operator property
variable)))))
+ ( bracket delimiter error function operator property
variable))))
+ (toml . (:feature
+ toml-ts-mode
+ :font-lock toml-ts-mode--font-lock-settings
+ :indentation toml-ts-mode--indent-rules
+ :ts-feature-list
+ '((comment)
+ (constant number pair string)
+ (escape-sequence)
+ (delimiter error))))
+ (tsx . (:feature
+ typescript-ts-mode
+ :font-lock (typescript-ts-mode--font-lock-settings 'tsx)
+ :indentation (typescript-ts-mode--indent-rules 'tsx)
+ :ts-feature-list
+ '((comment declaration)
+ (keyword string escape-sequence)
+ (constant expression identifier jsx number pattern property)
+ (function bracket delimiter))))
+ (typescript . (:feature
+ typescript-ts-mode
+ :font-lock (typescript-ts-mode--font-lock-settings
'typescript)
+ :indentation (typescript-ts-mode--indent-rules 'typescript)
+ :ts-feature-list
+ '((comment declaration)
+ (keyword string escape-sequence)
+ (constant expression identifier number pattern property)
+ (operator function bracket delimiter))))
+ (yaml . (:feature
+ yaml-ts-mode
+ :font-lock yaml-ts-mode--font-lock-settings
+ :indentation nil
+ :ts-feature-list
+ '((comment)
+ (string type)
+ (constant escape-sequence number property)
+ (bracket delimiter error misc-punctuation))))
+ (mermaid . (:feature
+ mermaid-ts-mode
+ :font-lock mermaid-ts--treesit-font-lock-rules
+ :indentation mermaid-ts--indent-rules
+ :ts-feature-list
+ '((comments)
+ (constants keywords text links)
+ (nodes)))))
"Settings for raw block languages.")
-;; from vimscript-ts-mode (https://github.com/nverno/vimscript-ts-mode)
(defun typst-ts-els--merge-features (a b)
"Merge `treesit-font-lock-feature-list's A with B."
(when (not (and a b))
(error "One of the treesit font lock feature list is nil when merge!"))
- (cl-loop for x in a
- for y in b
- collect (seq-uniq (append x y))))
+ (cl-loop for i to 3 ; [0, 3]
+ collect
+ (seq-uniq (append (nth i a) (nth i b)))))
;; hugely insprired by vimscript-ts-mode
(https://github.com/nverno/vimscript-ts-mode)
(defun typst-ts-els-merge-settings (settings)
@@ -728,41 +794,46 @@ Use this function as one notifier of
`treesit-parser-notifiers'."
;; note: the `treesit-range-settings' for languages in
;; predefined settings are already settled at mode start
(typst-ts-els-merge-lang-settings lang)
+ ;; some feature like cmake-ts-mode will create a parser when
+ ;; the feature is required, so we need to clean thease
parsers
+ (mapc #'treesit-parser-delete (treesit-parser-list nil lang))
(message "Load %s language settings from configuration."
lang))
(error
;; if language not in setting or encounter error during loading,
;; then try your luck to load it
- (condition-case err
- (progn
- ;; add range rules
- (typst-ts-els--add-treesit-range-rules lang)
- ;; delete top level parsers, so range rules works (i.e.
local parsers)
- ;; so that highlighting will not exceed the desired range
- (mapc #'treesit-parser-delete (treesit-parser-list nil
lang))
-
- ;; find and merge settings
- (setq lang-ts-mode
- (intern (concat (symbol-name lang) "-ts-mode")))
- (setq settings
- (typst-ts-els--try-get-ts-settings lang-ts-mode))
-
- (setq treesit-font-lock-settings
- (append treesit-font-lock-settings
- (plist-get settings
:treesit-font-lock-settings)))
-
- (setq treesit-simple-indent-rules
- (append treesit-simple-indent-rules
- (plist-get settings
:treesit-simple-indent-rules)))
-
- (setq treesit-font-lock-feature-list
- (typst-ts-els--merge-features
- treesit-font-lock-feature-list
- (plist-get settings
:treesit-font-lock-feature-list)))
- (message "Luckily merged %s language settings." lang))
- (error
- (message "Loading %s language settings without luck: \n%s"
- lang
- (error-message-string err))))))
+ (when
typst-ts-highlight-raw-block-langs-not-in-predefined-settings
+ (condition-case err
+ (progn
+ ;; add range rules
+ (typst-ts-els--add-treesit-range-rules lang)
+ ;; delete top level parsers, so range rules works (i.e.
local parsers)
+ ;; so that highlighting will not exceed the desired
range
+ (mapc #'treesit-parser-delete (treesit-parser-list nil
lang))
+
+ ;; find and merge settings
+ (setq lang-ts-mode
+ (intern (concat (symbol-name lang) "-ts-mode")))
+ (setq settings
+ (typst-ts-els--try-get-ts-settings lang-ts-mode))
+
+ (setq treesit-font-lock-settings
+ (append treesit-font-lock-settings
+ (plist-get settings
:treesit-font-lock-settings)))
+
+ (setq treesit-simple-indent-rules
+ (append treesit-simple-indent-rules
+ (plist-get settings
:treesit-simple-indent-rules)))
+
+ (setq treesit-font-lock-feature-list
+ (typst-ts-els--merge-features
+ treesit-font-lock-feature-list
+ (plist-get settings
:treesit-font-lock-feature-list)))
+ (message "Luckily merged %s language settings." lang))
+ (error
+ (message "Loading %s language settings without luck: \n%s"
+ lang
+ (error-message-string err)))))
+ ))
;; whatever, we won't load that language again
(add-to-list 'typst-ts-els--include-languages lang))
))))
@@ -831,12 +902,12 @@ LANG and NEWLANG: either a symbol or string."
(defun typst-ts-embedding-lang-settings-test ()
"Test typst-ts-embedding-lang-settings."
- (let ((treesit-font-lock-feature-list
- '((comment common)
- (markup-basic code-basic math-basic)
- (markup-standard code-standard math-standard)
- (markup-extended code-extended math-extended)))
- missing-dylibs err-msgs)
+ (setq-local treesit-font-lock-feature-list
+ '((comment common)
+ (markup-basic code-basic math-basic)
+ (markup-standard code-standard math-standard)
+ (markup-extended code-extended math-extended)))
+ (let (missing-dylibs err-msgs)
(dolist (setting-entry typst-ts-embedding-lang-settings)
(let ((language (car setting-entry))
(config (cdr setting-entry)))
@@ -848,7 +919,7 @@ LANG and NEWLANG: either a symbol or string."
(error
(setq err-msgs (list (error-message-string err)))))))
(message "--------- Missing Tree Sitter Dynamic libraries -------------")
- (message " (This also could be an error of settings entry key name) ")
+ (message " (This also could be an error of entry key name in settings) ")
(message "%s" (string-join missing-dylibs " "))
(message "--------- Error Messages ------------------------------------")
(message "%s" (string-join err-msgs "\n"))))
diff --git a/typst-ts-mode.el b/typst-ts-mode.el
index fe7d026c54..a68b6d76d3 100644
--- a/typst-ts-mode.el
+++ b/typst-ts-mode.el
@@ -1023,8 +1023,11 @@ See `treesit-language-at-point-function'."
for config = (cdr setting)
when (treesit-ready-p lang t)
do
- (ignore-errors
- (typst-ts-els-merge-settings config)
+ (unwind-protect
+ (typst-ts-els-merge-settings config)
+ ;; some feature like cmake-ts-mode will create a parser when
+ ;; the feature is required, so we need to clean thease parsers
+ (mapc #'treesit-parser-delete (treesit-parser-list nil lang))
(add-to-list 'typst-ts-els--include-languages lang))))
(unless (treesit-ready-p 'typst)
@@ -1087,8 +1090,6 @@ See `treesit-language-at-point-function'."
;; Although without enabling `outline-minor-mode' also works, enabling it
;; provides outline ellipsis
(outline-minor-mode t)
-
-
(treesit-major-mode-setup))