diff options
| author | Roi Martin | 2025-09-04 07:40:32 +0200 |
|---|---|---|
| committer | Juri Linkov | 2025-09-07 20:43:36 +0300 |
| commit | 86cc48e45eddadde635616ef1037be7c212fb77d (patch) | |
| tree | 7d2e7cd37d1ccd5030eff7cd3a5da68439d8a520 | |
| parent | a4ea22d9989cece0dcbae511c3e321b34474fe14 (diff) | |
| download | emacs-86cc48e45eddadde635616ef1037be7c212fb77d.tar.gz emacs-86cc48e45eddadde635616ef1037be7c212fb77d.zip | |
Fix font lock and indentation in cmake-ts-mode
Fix font lock and indentation in cmake-ts-mode when the tree-sitter
grammar is automatically installed (Bug#79363).
* lisp/progmodes/cmake-ts-mode.el (cmake-ts-mode--indent-rules)
(cmake-ts-mode--font-lock-settings): Evaluate the rules only after the
tree-sitter grammar is installed.
(cmake-ts-mode): Call the new `cmake-ts-mode--indent-rules' and
`cmake-ts-mode--font-lock-settings' functions.
| -rw-r--r-- | lisp/progmodes/cmake-ts-mode.el | 182 |
1 files changed, 99 insertions, 83 deletions
diff --git a/lisp/progmodes/cmake-ts-mode.el b/lisp/progmodes/cmake-ts-mode.el index 84589b1eb73..8e49b18f731 100644 --- a/lisp/progmodes/cmake-ts-mode.el +++ b/lisp/progmodes/cmake-ts-mode.el | |||
| @@ -61,28 +61,36 @@ | |||
| 61 | table) | 61 | table) |
| 62 | "Syntax table for `cmake-ts-mode'.") | 62 | "Syntax table for `cmake-ts-mode'.") |
| 63 | 63 | ||
| 64 | (defvar cmake-ts-mode--indent-rules | 64 | (defvar cmake-ts-mode--indent-rules nil |
| 65 | `((cmake | ||
| 66 | ((node-is ")") parent-bol 0) | ||
| 67 | ((node-is "else_command") parent-bol 0) | ||
| 68 | ((node-is "elseif_command") parent-bol 0) | ||
| 69 | ((node-is "endforeach_command") parent-bol 0) | ||
| 70 | ((node-is "endfunction_command") parent-bol 0) | ||
| 71 | ((node-is "endif_command") parent-bol 0) | ||
| 72 | ((parent-is "foreach_loop") parent-bol cmake-ts-mode-indent-offset) | ||
| 73 | ((parent-is "function_def") parent-bol cmake-ts-mode-indent-offset) | ||
| 74 | ((parent-is "if_condition") parent-bol cmake-ts-mode-indent-offset) | ||
| 75 | ((parent-is "normal_command") parent-bol cmake-ts-mode-indent-offset) | ||
| 76 | ;;; Release v0.4.0 wraps arguments in an argument_list node. | ||
| 77 | ,@(ignore-errors | ||
| 78 | (treesit-query-capture 'cmake '((argument_list) @capture)) | ||
| 79 | `(((parent-is "argument_list") grand-parent cmake-ts-mode-indent-offset))) | ||
| 80 | ;;; Release v0.3.0 wraps the body of commands into a body node. | ||
| 81 | ,@(ignore-errors | ||
| 82 | (treesit-query-capture 'cmake '((body) @capture)) | ||
| 83 | `(((parent-is "body") grand-parent cmake-ts-mode-indent-offset))))) | ||
| 84 | "Tree-sitter indent rules for `cmake-ts-mode'.") | 65 | "Tree-sitter indent rules for `cmake-ts-mode'.") |
| 85 | 66 | ||
| 67 | (defun cmake-ts-mode--indent-rules () | ||
| 68 | "Return tree-sitter indent rules for `cmake-ts-mode'. | ||
| 69 | |||
| 70 | Tree-sitter indent rules are evaluated the first time this function | ||
| 71 | is called. Subsequent calls return the first evaluated value." | ||
| 72 | (or cmake-ts-mode--indent-rules | ||
| 73 | (setq cmake-ts-mode--indent-rules | ||
| 74 | `((cmake | ||
| 75 | ((node-is ")") parent-bol 0) | ||
| 76 | ((node-is "else_command") parent-bol 0) | ||
| 77 | ((node-is "elseif_command") parent-bol 0) | ||
| 78 | ((node-is "endforeach_command") parent-bol 0) | ||
| 79 | ((node-is "endfunction_command") parent-bol 0) | ||
| 80 | ((node-is "endif_command") parent-bol 0) | ||
| 81 | ((parent-is "foreach_loop") parent-bol cmake-ts-mode-indent-offset) | ||
| 82 | ((parent-is "function_def") parent-bol cmake-ts-mode-indent-offset) | ||
| 83 | ((parent-is "if_condition") parent-bol cmake-ts-mode-indent-offset) | ||
| 84 | ((parent-is "normal_command") parent-bol cmake-ts-mode-indent-offset) | ||
| 85 | ;; Release v0.4.0 wraps arguments in an argument_list node. | ||
| 86 | ,@(ignore-errors | ||
| 87 | (treesit-query-capture 'cmake '((argument_list) @capture)) | ||
| 88 | `(((parent-is "argument_list") grand-parent cmake-ts-mode-indent-offset))) | ||
| 89 | ;; Release v0.3.0 wraps the body of commands into a body node. | ||
| 90 | ,@(ignore-errors | ||
| 91 | (treesit-query-capture 'cmake '((body) @capture)) | ||
| 92 | `(((parent-is "body") grand-parent cmake-ts-mode-indent-offset)))))))) | ||
| 93 | |||
| 86 | (defvar cmake-ts-mode--constants | 94 | (defvar cmake-ts-mode--constants |
| 87 | '("ON" "TRUE" "YES" "Y" "OFF" "FALSE" "NO" "N" "IGNORE" "NOTFOUND") | 95 | '("ON" "TRUE" "YES" "Y" "OFF" "FALSE" "NO" "N" "IGNORE" "NOTFOUND") |
| 88 | "CMake constants for tree-sitter font-locking.") | 96 | "CMake constants for tree-sitter font-locking.") |
| @@ -140,69 +148,77 @@ Check if a node type is available, then return the right font lock rules." | |||
| 140 | eol)) | 148 | eol)) |
| 141 | @font-lock-constant-face)))))))) | 149 | @font-lock-constant-face)))))))) |
| 142 | 150 | ||
| 143 | (defvar cmake-ts-mode--font-lock-settings | 151 | (defvar cmake-ts-mode--font-lock-settings nil |
| 144 | (treesit-font-lock-rules | ||
| 145 | :language 'cmake | ||
| 146 | :feature 'bracket | ||
| 147 | '((["(" ")"]) @font-lock-bracket-face) | ||
| 148 | |||
| 149 | :language 'cmake | ||
| 150 | :feature 'builtin | ||
| 151 | (cmake-ts-mode--font-lock-compatibility-fe9b5e0) | ||
| 152 | |||
| 153 | :language 'cmake | ||
| 154 | :feature 'comment | ||
| 155 | '([(bracket_comment) (line_comment)] @font-lock-comment-face) | ||
| 156 | |||
| 157 | :language 'cmake | ||
| 158 | :feature 'constant | ||
| 159 | `(((argument) @font-lock-constant-face | ||
| 160 | (:match ,(rx-to-string | ||
| 161 | `(seq bol | ||
| 162 | (or ,@cmake-ts-mode--constants) | ||
| 163 | eol)) | ||
| 164 | @font-lock-constant-face))) | ||
| 165 | |||
| 166 | :language 'cmake | ||
| 167 | :feature 'function | ||
| 168 | '((normal_command (identifier) @font-lock-function-call-face)) | ||
| 169 | |||
| 170 | :language 'cmake | ||
| 171 | :feature 'keyword | ||
| 172 | `([,@cmake-ts-mode--keywords] @font-lock-keyword-face) | ||
| 173 | |||
| 174 | :language 'cmake | ||
| 175 | :feature 'number | ||
| 176 | '(((unquoted_argument) @font-lock-number-face | ||
| 177 | (:match "\\`-?[[:digit:]]*\\.?[[:digit:]]*\\.?[[:digit:]]+\\'" | ||
| 178 | @font-lock-number-face))) | ||
| 179 | |||
| 180 | :language 'cmake | ||
| 181 | :feature 'string | ||
| 182 | '([(bracket_argument) (quoted_argument)] @font-lock-string-face) | ||
| 183 | |||
| 184 | :language 'cmake | ||
| 185 | :feature 'escape-sequence | ||
| 186 | :override t | ||
| 187 | '((escape_sequence) @font-lock-escape-face) | ||
| 188 | |||
| 189 | :language 'cmake | ||
| 190 | :feature 'misc-punctuation | ||
| 191 | ;; Don't override strings. | ||
| 192 | :override 'nil | ||
| 193 | '((["$" "{" "}"]) @font-lock-misc-punctuation-face) | ||
| 194 | |||
| 195 | :language 'cmake | ||
| 196 | :feature 'variable | ||
| 197 | :override t | ||
| 198 | '((variable) @font-lock-variable-use-face) | ||
| 199 | |||
| 200 | :language 'cmake | ||
| 201 | :feature 'error | ||
| 202 | :override t | ||
| 203 | '((ERROR) @font-lock-warning-face)) | ||
| 204 | "Tree-sitter font-lock settings for `cmake-ts-mode'.") | 152 | "Tree-sitter font-lock settings for `cmake-ts-mode'.") |
| 205 | 153 | ||
| 154 | (defun cmake-ts-mode--font-lock-settings () | ||
| 155 | "Return tree-sitter font-lock settings for `cmake-ts-mode'. | ||
| 156 | |||
| 157 | Tree-sitter font-lock rules are evaluated the first time this function | ||
| 158 | is called. Subsequent calls return the first evaluated value." | ||
| 159 | (or cmake-ts-mode--font-lock-settings | ||
| 160 | (setq cmake-ts-mode--font-lock-settings | ||
| 161 | (treesit-font-lock-rules | ||
| 162 | :language 'cmake | ||
| 163 | :feature 'bracket | ||
| 164 | '((["(" ")"]) @font-lock-bracket-face) | ||
| 165 | |||
| 166 | :language 'cmake | ||
| 167 | :feature 'builtin | ||
| 168 | (cmake-ts-mode--font-lock-compatibility-fe9b5e0) | ||
| 169 | |||
| 170 | :language 'cmake | ||
| 171 | :feature 'comment | ||
| 172 | '([(bracket_comment) (line_comment)] @font-lock-comment-face) | ||
| 173 | |||
| 174 | :language 'cmake | ||
| 175 | :feature 'constant | ||
| 176 | `(((argument) @font-lock-constant-face | ||
| 177 | (:match ,(rx-to-string | ||
| 178 | `(seq bol | ||
| 179 | (or ,@cmake-ts-mode--constants) | ||
| 180 | eol)) | ||
| 181 | @font-lock-constant-face))) | ||
| 182 | |||
| 183 | :language 'cmake | ||
| 184 | :feature 'function | ||
| 185 | '((normal_command (identifier) @font-lock-function-call-face)) | ||
| 186 | |||
| 187 | :language 'cmake | ||
| 188 | :feature 'keyword | ||
| 189 | `([,@cmake-ts-mode--keywords] @font-lock-keyword-face) | ||
| 190 | |||
| 191 | :language 'cmake | ||
| 192 | :feature 'number | ||
| 193 | '(((unquoted_argument) @font-lock-number-face | ||
| 194 | (:match "\\`-?[[:digit:]]*\\.?[[:digit:]]*\\.?[[:digit:]]+\\'" | ||
| 195 | @font-lock-number-face))) | ||
| 196 | |||
| 197 | :language 'cmake | ||
| 198 | :feature 'string | ||
| 199 | '([(bracket_argument) (quoted_argument)] @font-lock-string-face) | ||
| 200 | |||
| 201 | :language 'cmake | ||
| 202 | :feature 'escape-sequence | ||
| 203 | :override t | ||
| 204 | '((escape_sequence) @font-lock-escape-face) | ||
| 205 | |||
| 206 | :language 'cmake | ||
| 207 | :feature 'misc-punctuation | ||
| 208 | ;; Don't override strings. | ||
| 209 | :override 'nil | ||
| 210 | '((["$" "{" "}"]) @font-lock-misc-punctuation-face) | ||
| 211 | |||
| 212 | :language 'cmake | ||
| 213 | :feature 'variable | ||
| 214 | :override t | ||
| 215 | '((variable) @font-lock-variable-use-face) | ||
| 216 | |||
| 217 | :language 'cmake | ||
| 218 | :feature 'error | ||
| 219 | :override t | ||
| 220 | '((ERROR) @font-lock-warning-face))))) | ||
| 221 | |||
| 206 | (defun cmake-ts-mode--defun-name (node) | 222 | (defun cmake-ts-mode--defun-name (node) |
| 207 | "Return the defun name of NODE. | 223 | "Return the defun name of NODE. |
| 208 | Return nil if there is no name or if NODE is not a defun node." | 224 | Return nil if there is no name or if NODE is not a defun node." |
| @@ -238,10 +254,10 @@ Return nil if there is no name or if NODE is not a defun node." | |||
| 238 | (setq-local which-func-functions nil) | 254 | (setq-local which-func-functions nil) |
| 239 | 255 | ||
| 240 | ;; Indent. | 256 | ;; Indent. |
| 241 | (setq-local treesit-simple-indent-rules cmake-ts-mode--indent-rules) | 257 | (setq-local treesit-simple-indent-rules (cmake-ts-mode--indent-rules)) |
| 242 | 258 | ||
| 243 | ;; Font-lock. | 259 | ;; Font-lock. |
| 244 | (setq-local treesit-font-lock-settings cmake-ts-mode--font-lock-settings) | 260 | (setq-local treesit-font-lock-settings (cmake-ts-mode--font-lock-settings)) |
| 245 | (setq-local treesit-font-lock-feature-list | 261 | (setq-local treesit-font-lock-feature-list |
| 246 | '((comment) | 262 | '((comment) |
| 247 | (keyword string) | 263 | (keyword string) |