Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--book/src/generated/lang-support.md1
-rw-r--r--languages.toml14
-rw-r--r--runtime/queries/elisp/highlights.scm72
-rw-r--r--runtime/queries/elisp/tags.scm5
4 files changed, 92 insertions, 0 deletions
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index d013f201..b9aadc69 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -42,6 +42,7 @@
| edoc | ✓ | | | |
| eex | ✓ | | | |
| ejs | ✓ | | | |
+| elisp | ✓ | | | |
| elixir | ✓ | ✓ | ✓ | `elixir-ls` |
| elm | ✓ | ✓ | | `elm-language-server` |
| elvish | ✓ | | | `elvish` |
diff --git a/languages.toml b/languages.toml
index e908ea59..19c5cf9f 100644
--- a/languages.toml
+++ b/languages.toml
@@ -3642,6 +3642,20 @@ name = "pest"
source = { git = "https://github.com/pest-parser/tree-sitter-pest", rev = "a8a98a824452b1ec4da7f508386a187a2f234b85" }
[[language]]
+name = "elisp"
+scope = "source.elisp"
+file-types = ["el"]
+comment-tokens = [";"]
+
+[language.auto-pairs]
+'(' = ')'
+'"' = '"'
+
+[[grammar]]
+name = "elisp"
+source = { git = "https://github.com/Wilfred/tree-sitter-elisp", rev = "e5524fdccf8c22fc726474a910e4ade976dfc7bb" }
+
+[[language]]
name = "gjs"
scope = "source.gjs"
file-types = ["gjs"]
diff --git a/runtime/queries/elisp/highlights.scm b/runtime/queries/elisp/highlights.scm
new file mode 100644
index 00000000..1639168b
--- /dev/null
+++ b/runtime/queries/elisp/highlights.scm
@@ -0,0 +1,72 @@
+;; Special forms
+[
+ "and"
+ "catch"
+ "cond"
+ "condition-case"
+ "defconst"
+ "defvar"
+ "function"
+ "if"
+ "interactive"
+ "lambda"
+ "let"
+ "let*"
+ "or"
+ "prog1"
+ "prog2"
+ "progn"
+ "quote"
+ "save-current-buffer"
+ "save-excursion"
+ "save-restriction"
+ "setq"
+ "setq-default"
+ "unwind-protect"
+ "while"
+] @keyword
+
+;; Function definitions
+[
+ "defun"
+ "defsubst"
+ ] @keyword
+(function_definition name: (symbol) @function)
+(function_definition parameters: (list (symbol) @variable.parameter))
+(function_definition docstring: (string) @comment)
+
+;; Highlight macro definitions the same way as function definitions.
+"defmacro" @keyword
+(macro_definition name: (symbol) @function)
+(macro_definition parameters: (list (symbol) @variable.parameter))
+(macro_definition docstring: (string) @comment)
+
+(comment) @comment
+
+(integer) @constant.numeric.integer
+(float) @constant.numeric.float
+(char) @constant.character
+
+(string) @string
+
+[
+ "("
+ ")"
+ "#["
+ "["
+ "]"
+] @punctuation.bracket
+
+[
+ "`"
+ "#'"
+ "'"
+ ","
+ ",@"
+] @operator
+
+;; Highlight nil and t as constants, unlike other symbols
+[
+ "nil"
+ "t"
+] @constant.builtin
diff --git a/runtime/queries/elisp/tags.scm b/runtime/queries/elisp/tags.scm
new file mode 100644
index 00000000..7abcb9a4
--- /dev/null
+++ b/runtime/queries/elisp/tags.scm
@@ -0,0 +1,5 @@
+;; defun/defsubst
+(function_definition name: (symbol) @name) @definition.function
+
+;; Treat macros as function definitions for the sake of TAGS.
+(macro_definition name: (symbol) @name) @definition.function