(defcustom c-ts-mode-indent-offset 2
"Number of spaces for each indentation step in `c-ts-mode'."
+ :version "29.1"
:type 'integer
:safe 'integerp
:group 'c)
one of the supplied styles doesn't suffice a function could be
set instead. This function is expected return a list that
follows the form of `treesit-simple-indent-rules'."
+ :version "29.1"
:type '(choice (symbol :tag "Gnu" 'gnu)
(symbol :tag "K&R" 'k&r)
(symbol :tag "Linux" 'linux)
;;;###autoload
(define-derived-mode c-ts-mode--base-mode prog-mode "C"
"Major mode for editing C, powered by tree-sitter."
- :group 'c
:syntax-table c-ts-mode--syntax-table
- ;; Comments.
- (setq-local comment-start "// ")
- (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
- (setq-local comment-end "")
-
;; Navigation.
(setq-local treesit-defun-type-regexp
(rx (or "specifier"
;; Electric
(setq-local electric-indent-chars
- (append "{}():;," electric-indent-chars))
+ (append "{}():;," electric-indent-chars))
;; Imenu.
(setq-local imenu-create-index-function #'c-ts-mode--imenu)
(treesit-parser-create 'c)
+ ;; Comments.
+ (setq-local comment-start "/* ")
+ (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
+ (setq-local comment-end " */")
+
(setq-local treesit-simple-indent-rules
(c-ts-mode--set-indent-style 'c))
(unless (treesit-ready-p nil 'cpp)
(error "Tree-sitter for C++ isn't available"))
+ ;; Comments.
+ (setq-local comment-start "// ")
+ (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
+ (setq-local comment-end "")
+
(treesit-parser-create 'cpp)
(setq-local treesit-simple-indent-rules
(defcustom css-ts-mode-indent-offset 2
"Number of spaces for each indentation step in `ts-mode'."
+ :version "29.1"
:type 'integer
:safe 'integerp
:group 'css)
;; Indent.
(setq-local treesit-simple-indent-rules css-ts-mode--indent-rules)
+ ;; Electric
+ (setq-local electric-indent-chars
+ (append "{}():;," electric-indent-chars))
+
;; Navigation.
(setq-local treesit-defun-type-regexp "rule_set")
;; Font-lock.
;;; Code:
(require 'treesit)
-(require 'rx)
(defcustom java-ts-mode-indent-offset 4
"Number of spaces for each indentation step in `java-ts-mode'."
+ :version "29.1"
:type 'integer
:safe 'integerp
:group 'java)
(defun java-ts-mode--imenu ()
"Return Imenu alist for the current buffer."
(let* ((node (treesit-buffer-root-node))
- (tree (treesit-induce-sparse-tree
- node (rx (or "class_declaration"
- "interface_declaration"
- "enum_declaration"
- "record_declaration"
- "method_declaration")))))
- (java-ts-mode--imenu-1 tree)))
+ (class-tree
+ `("Class" . ,(java-ts-mode--imenu-1
+ (treesit-induce-sparse-tree
+ node "^class_declaration$"))))
+ (interface-tree
+ `("Interface" . ,(java-ts-mode--imenu-1
+ (treesit-induce-sparse-tree
+ node "^interface_declaration$"))))
+ (enum-tree
+ `("Enum" . ,(java-ts-mode--imenu-1
+ (treesit-induce-sparse-tree
+ node "^enum_declaration$"))))
+ (record-tree
+ `("Record" . ,(java-ts-mode--imenu-1
+ (treesit-induce-sparse-tree
+ node "^record_declaration$"))))
+ (method-tree
+ `("Method" . ,(java-ts-mode--imenu-1
+ (treesit-induce-sparse-tree
+ node "^method_declaration$")))))
+ (cl-remove-if
+ #'null
+ `(,(when (cdr class-tree) class-tree)
+ ,(when (cdr interface-tree) interface-tree)
+ ,(when (cdr enum-tree) enum-tree)
+ ,(when (cdr record-tree) record-tree)
+ ,(when (cdr method-tree) method-tree)))))
;;;###autoload
(define-derived-mode java-ts-mode prog-mode "Java"
"Major mode for editing Java, powered by tree-sitter."
- :group 'c
+ :group 'java
:syntax-table java-ts-mode--syntax-table
(unless (treesit-ready-p nil 'java)
;; Indent.
(setq-local treesit-simple-indent-rules java-ts-mode--indent-rules)
+ ;; Electric
+ (setq-local electric-indent-chars
+ (append "{}():;," electric-indent-chars))
+
;; Navigation.
- (setq-local treesit-defun-type-regexp
- (rx (or "declaration")))
+ (setq-local treesit-defun-type-regexp "declaration")
;; Font-lock.
(setq-local treesit-font-lock-settings java-ts-mode--font-lock-settings)
(defcustom json-ts-mode-indent-offset 2
"Number of spaces for each indentation step in `json-ts-mode'."
+ :version "29.1"
:type 'integer
:safe 'integerp
:group 'json)
(defvar json-ts-mode--font-lock-settings
(treesit-font-lock-rules
:language 'json
- :feature 'minimal
+ :feature 'comment
:override t
- `((pair
- key: (_) @font-lock-string-face)
-
- (string) @font-lock-string-face
-
- (number) @font-lock-constant-face
-
- [(null) (true) (false)] @font-lock-constant-face
-
- (escape_sequence) @font-lock-constant-face
-
- (comment) @font-lock-comment-face))
+ '((comment) @font-lock-comment-face)
+ :language 'json
+ :feature 'string
+ :override t
+ '((escape_sequence) @font-lock-constant-face
+ (string) @font-lock-string-face)
+ :language 'json
+ :feature 'number
+ :override t
+ '((number) @font-lock-constant-face)
+ :language 'json
+ :feature 'constant
+ :override t
+ '([(null) (true) (false)] @font-lock-constant-face)
+ :language 'json
+ :feature 'pair
+ :override t
+ `((pair key: (_) @font-lock-variable-name-face)))
"Font-lock settings for JSON.")
(defun json-ts-mode--imenu-1 (node)
(setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
(setq-local comment-end "")
+ ;; Electric
+ (setq-local electric-indent-chars
+ (append "{}():;," electric-indent-chars))
+
;; Indent.
(setq-local treesit-simple-indent-rules json-ts--indent-rules)
;; Font-lock.
(setq-local treesit-font-lock-settings json-ts-mode--font-lock-settings)
(setq-local treesit-font-lock-feature-list
- '((minimal) () ()))
+ '((comment string number) (constant pair) ()))
;; Imenu.
(setq-local imenu-create-index-function #'json-ts-mode--imenu)
(defcustom ts-mode-indent-offset 2
"Number of spaces for each indentation step in `ts-mode'."
+ :version "29.1"
:type 'integer
:safe 'integerp
:group 'typescript)
(defvar ts-mode--font-lock-settings
(treesit-font-lock-rules
-
:language 'tsx
:override t
:feature 'comment
((treesit-ready-p nil 'tsx)
;; Tree-sitter.
(treesit-parser-create 'tsx)
+
;; Comments.
(setq-local comment-start "// ")
(setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
(setq-local comment-end "")
+
+ ;; Electric
+ (setq-local electric-indent-chars
+ (append "{}():;," electric-indent-chars))
+
;; Indent.
(setq-local treesit-simple-indent-rules ts-mode--indent-rules)
+
;; Navigation.
(setq-local treesit-defun-type-regexp
(rx (or "class_declaration"
"method_definition"
"function_declaration"
"lexical_declaration")))
+
;; Font-lock.
(setq-local treesit-font-lock-settings ts-mode--font-lock-settings)
(setq-local treesit-font-lock-feature-list
(property pattern jsx)))
;; Imenu.
(setq-local imenu-create-index-function #'js--treesit-imenu)
+
;; Which-func (use imenu).
(setq-local which-func-functions nil)
+
(treesit-major-mode-setup))
+
;; Elisp.
(t
(js-mode)