Function: treesit-major-mode-setup

treesit-major-mode-setup is a byte-compiled function defined in treesit.el.gz.

Signature

(treesit-major-mode-setup)

Documentation

Activate tree-sitter to power major-mode features.

If treesit-font-lock-settings is non-nil, set up fontification and enable font-lock-mode(var)/font-lock-mode(fun).

If treesit-simple-indent-rules is non-nil, set up indentation.

If treesit-defun-type-regexp is non-nil or defun is defined in treesit-thing-settings, set up beginning-of-defun-function and end-of-defun-function.

If treesit-defun-name-function is non-nil, set up add-log-current-defun.

If treesit-simple-imenu-settings is non-nil, set up Imenu.

If either treesit-outline-predicate or treesit-simple-imenu-settings are non-nil, and Outline minor mode settings don't already exist, setup Outline minor mode.

If sexp, sentence are defined in treesit-thing-settings, enable tree-sitter navigation commands for them.

Make sure necessary parsers are created for the current buffer before calling this function.

View in manual

Probably introduced at or before Emacs version 30.1.

Source Code

;; Defined in /usr/src/emacs/lisp/treesit.el.gz
(defun treesit-major-mode-setup ()
  "Activate tree-sitter to power major-mode features.

If `treesit-font-lock-settings' is non-nil, set up fontification
and enable `font-lock-mode'.

If `treesit-simple-indent-rules' is non-nil, set up indentation.

If `treesit-defun-type-regexp' is non-nil or `defun' is defined
in `treesit-thing-settings', set up `beginning-of-defun-function'
and `end-of-defun-function'.

If `treesit-defun-name-function' is non-nil, set up
`add-log-current-defun'.

If `treesit-simple-imenu-settings' is non-nil, set up Imenu.

If either `treesit-outline-predicate' or `treesit-simple-imenu-settings'
are non-nil, and Outline minor mode settings don't already exist, setup
Outline minor mode.

If `sexp', `sentence' are defined in `treesit-thing-settings',
enable tree-sitter navigation commands for them.

Make sure necessary parsers are created for the current buffer
before calling this function."
  (unless treesit-primary-parser
    (setq treesit-primary-parser (treesit--guess-primary-parser)))
  ;; Font-lock.
  (when treesit-font-lock-settings
    ;; `font-lock-mode' wouldn't set up properly if
    ;; `font-lock-defaults' is nil, see `font-lock-specified-p'.
    (setq-local font-lock-defaults
                '( nil nil nil nil
                   (font-lock-fontify-syntactically-function
                    . treesit-font-lock-fontify-region)))
    (treesit-font-lock-recompute-features)
    (add-hook 'pre-redisplay-functions #'treesit--pre-redisplay 0 t)
    (when treesit-primary-parser
      (treesit-parser-add-notifier
       treesit-primary-parser #'treesit--font-lock-mark-ranges-to-fontify)))
  ;; Syntax
  (add-hook 'syntax-propertize-extend-region-functions
            #'treesit--pre-syntax-ppss 0 t)
  ;; Indent.
  (when treesit-simple-indent-rules
    (setq-local treesit-simple-indent-rules
                (treesit--indent-rules-optimize
                 treesit-simple-indent-rules)))
  ;; Enable indent if simple indent rules are set, or the major mode
  ;; sets a custom indent function.
  (when (or treesit-simple-indent-rules
            (and (not (eq treesit-indent-function #'treesit-simple-indent))
                 treesit-indent-function))
    (setq-local indent-line-function #'treesit-indent)
    (setq-local indent-region-function #'treesit-indent-region))
  ;; Navigation.
  (when (or treesit-defun-type-regexp
            (treesit-thing-defined-p 'defun nil))
    (keymap-set (current-local-map) "<remap> <beginning-of-defun>"
                #'treesit-beginning-of-defun)
    (keymap-set (current-local-map) "<remap> <end-of-defun>"
                #'treesit-end-of-defun)
    ;; `end-of-defun' will not work completely correctly in nested
    ;; defuns due to its implementation.  However, many lisp programs
    ;; use `beginning/end-of-defun', so we should still set
    ;; `beginning/end-of-defun-function' so they still mostly work.
    ;; This is also what `cc-mode' does: rebind user commands and set
    ;; the variables.  In future we should update `end-of-defun' to
    ;; work with nested defuns.
    (setq-local beginning-of-defun-function #'treesit-beginning-of-defun)
    (setq-local end-of-defun-function #'treesit-end-of-defun))
  ;; Defun name.
  (when treesit-defun-name-function
    (setq-local add-log-current-defun-function
                #'treesit-add-log-current-defun))

  (when (treesit-thing-defined-p 'sexp nil)
    (setq-local forward-sexp-function #'treesit-forward-sexp)
    (setq-local transpose-sexps-function #'treesit-transpose-sexps))

  (when (treesit-thing-defined-p 'sentence nil)
    (setq-local forward-sentence-function #'treesit-forward-sentence))

  ;; Imenu.
  (when treesit-simple-imenu-settings
    (setq-local imenu-create-index-function
                #'treesit-simple-imenu))

  ;; Outline minor mode.
  (when (and (or treesit-outline-predicate treesit-simple-imenu-settings)
             (not (seq-some #'local-variable-p
                            '(outline-search-function
                              outline-regexp outline-level))))
    (unless treesit-outline-predicate
      (setq treesit-outline-predicate
            #'treesit-outline-predicate--from-imenu))
    (setq-local outline-search-function #'treesit-outline-search
                outline-level #'treesit-outline-level))

  ;; Remove existing local parsers.
  (dolist (ov (overlays-in (point-min) (point-max)))
    (when-let ((parser (overlay-get ov 'treesit-parser)))
      (treesit-parser-delete parser)
      (delete-overlay ov))))