1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-20 04:30:55 -08:00
Commit graph

584 commits

Author SHA1 Message Date
Yuan Fu
fae424aba9
Fix treesit.el tests
* lisp/treesit.el (treesit--imenu-merge-entries):
(Ftreesit_parser_set_included_ranges): Warn in the docstring
that the function is destructive/owns the argument.
* test/src/treesit-tests.el (treesit-range-fixup-after-edit):
(treesit-imenu): Fix tests.
2025-01-17 18:24:45 -08:00
Yuan Fu
f7e41ba3d0
Make sure treesit.el doesn't create parsers by itself (bug#75456)
Up to this point, functions in
treesit.el (font-lock/indentation/etc) creates a parser if one
doesn't exist.  This doesn't work well with local parsers,
because local parsers are not visible at global level and
font-lock or indentation functions might accidentally create a
global parser for an embedded language.

The solution is to not create parsers automatically.  This has
the potential of breaking things, but I don't expect any actual
breakage: all the major modes create parsers they need in the
major mode body, even though previously it isn't technically
necessary.

* lisp/treesit.el (treesit-buffer-root-node):
(treesit--update-ranges-local):
(treesit-update-ranges):
(treesit--guess-primary-parser): Use treesit-parser-list instead
of treesit-parser-create.
2025-01-17 17:40:04 -08:00
Yuan Fu
814b45775f
Add treesit-query-first-valid
This should help major modes to support grammar versions.

* doc/lispref/parsing.texi (Pattern Matching): Mention new function.
* lisp/treesit.el (treesit-query-first-valid): New function.
(treesit-query-valid-p): New function.
2025-01-17 17:27:23 -08:00
Juri Linkov
2d2bc6f1bc Add treesit-thing-settings to yaml-ts-mode and enable transpose-sexps
* lisp/treesit.el (treesit-major-mode-setup): Move setting of
'transpose-sexps-function' outside of 'treesit-thing-defined-p'
since 'treesit-transpose-sexps' doesn't depend on the 'sexp' thing.

* lisp/textmodes/yaml-ts-mode.el (yaml-ts-mode):
Add 'treesit-thing-settings' with the 'list' thing,
but use it only for list commands, not sexp commands (bug#73404).
2025-01-12 20:17:16 +02:00
Juri Linkov
54e4b30503 * lisp/treesit.el: Fix 'treesit--explorer-tree-mode-map'.
(treesit--explorer-tree-mode-map): Move this map
before its mode 'treesit--explorer-tree-mode',
otherwise the map has no effect.
2025-01-12 09:39:36 +02:00
Juri Linkov
db4bf410f2 Improve treesit list navigation support for #if/#endif (bug#73404)
* lisp/treesit.el (treesit--forward-list-with-default): Improve to
better support the case when point is inside an opening/closing node
with a name longer than 1 character such as "#if" and "#endif".
(treesit-navigate-thing): No need to check for thing 'list'
since list commands now use other functions.

* lisp/progmodes/c-ts-mode.el (c-ts-mode--thing-settings): Add
more preproc nodes such as #if/#endif and #ifdef/#endif and their
variants to the 'list' thing.
2025-01-11 20:28:43 +02:00
Juri Linkov
42a5ac3b51 Use the treesit thing 'list' with symbol property 'treesit-thing-symbol'
* doc/lispref/parsing.texi (User-defined Things): Mention new
functions 'treesit-forward-list', 'treesit-down-list',
'treesit-up-list', 'treesit-show-paren-data' that use the thing
'list' with the symbol property 'treesit-thing-symbol' (bug#73404).

* lisp/treesit.el: Put the property 'treesit-thing-symbol'
on the symbol 'list'.
(treesit--forward-list-with-default, treesit-down-list)
(treesit-up-list, treesit-navigate-thing)
(treesit-show-paren-data--categorize, treesit-major-mode-setup):
Replace 'sexp-list' with 'list'.

* lisp/progmodes/c-ts-mode.el (c-ts-mode--thing-settings):
* lisp/progmodes/js.el (js-ts-mode):
* lisp/progmodes/ruby-ts-mode.el (ruby-ts-mode):
* lisp/progmodes/typescript-ts-mode.el (typescript-ts-base-mode)
(tsx-ts-mode):
* lisp/textmodes/html-ts-mode.el (html-ts-mode):
Replace 'sexp-list' with 'list'.

* src/treesit.c (treesit_traverse_validate_predicate)
(treesit_traverse_match_predicate): Check if the 'pred'
symbol has the property 'Qtreesit_thing_symbol'.
(syms_of_treesit): New symbol 'Qtreesit_thing_symbol'.
2025-01-10 09:33:49 +02:00
Gabriel Santos
493bb2eaf1
Add button navigation to treesit-explorer (bug#75141)
* lisp/treesit.el (treesit--explorer-tree-mode-map): Define it
as a child of special-mode-map, adding keys for button
navigation.
2025-01-08 20:11:46 -08:00
Juri Linkov
997b9b8d38 * lisp/treesit.el: Use forward-list-default-function for C-M-n
(treesit--forward-list-with-default): New internal function
with body from 'treesit-forward-sexp-list' (bug#73404).
(treesit-forward-sexp-list, treesit-forward-list):
Replace body with a call to the shared implementation
'treesit--forward-list-with-default' using the
corresponding default function as an argument.
2025-01-06 20:02:18 +02:00
Juri Linkov
47ff8ab307 * lisp/treesit.el: Fix treesit-show-paren-data (bug#75198)
(treesit-show-paren-data--categorize): Use 'treesit-thing-defined-p'
to check if the thing exists for the language at POS before calling
'treesit-parent-until' that raises an error for an undefined thing.
(treesit-thing-defined-p): Add the alias signature to the docstring.
2025-01-05 09:43:22 +02:00
Juri Linkov
d9a0e78197 * lisp/treesit.el (treesit-transpose-sexps): Improve (bug#60655).
Use 'treesit-thing-next' and 'treesit-thing-prev' with
'treesit-node-named' to transpose named siblings that leaves the right
punctuation in anonymous nodes between named siblings.  Fall back
to 'transpose-sexps-default-function' inside strings and comments.
(treesit-node-named): New helper function.
2025-01-04 20:30:07 +02:00
Eli Zaretskii
6814ab06f2 Merge from origin/emacs-30
6468c3f7a7 Update doc string of 'insert'
6d8c3c0cbe Use `keymap*-set' over `global-set-key'/`define-key' in e...
4b2bb63b7a Fix documentation and prompt in 'package-isolate'
55f43f5b22 ; Fix typo in treesit-explore-mode
921f454f50 Update fontification for attribute values in heex-ts-mode
ae2589ea7a Add expression handling to heex-ts-mode
0cacf80639 ; * etc/NEWS: Document change of 'make-cursor-line-fully-...
f47a29da5c * lisp/man.el (Man-mode): Improve docstring.

# Conflicts:
#	etc/NEWS
2025-01-04 09:59:55 -05:00
Yuan Fu
55f43f5b22
; Fix typo in treesit-explore-mode
* lisp/treesit.el (treesit-explore-mode): We added the hook to
kill-buffer-hook, so make sure to remove it from
kill-buffer-hook, not post-command-hook.
2025-01-03 21:40:42 -08:00
Stefan Kangas
7fa975adbc Update copyright year to 2025
Run "TZ=UTC0 admin/update-copyright".
2025-01-02 18:39:42 +01:00
Paul Eggert
4da38c6321 Update copyright year to 2025
Run "TZ=UTC0 admin/update-copyright".
2025-01-01 07:39:17 +00:00
Juri Linkov
687ff86e80 Improve treesit-forward-sexp-list, treesit-down-list, treesit-up-list
* lisp/treesit.el (treesit-forward-sexp-list): Rewrite to support
the value of ARG more than 1.  In this case every step moves forward
either over the next treesit-based list or over the syntax-based symbol.
(treesit-down-list, treesit-up-list): Rewrite to support the fallback
to the syntax-based navigation while inside the treesit-based list.
Also use a loop for ARG more than 1 (bug#73404).
2024-12-30 20:07:40 +02:00
Juri Linkov
4068948a74 * lisp/treesit.el (treesit-show-paren-data--categorize): Fix it.
Copy the implementation of treesit-parent-until here, and call
its treesit-node-match-p with the argument IGNORE-MISSING set to t
that causes it to fail silently instead of raising an error when
the predicate 'sexp-list' is not defined in an embedded language.
(treesit-major-mode-setup): Set show-paren-data-function to
treesit-show-paren-data only when 'sexp-list' thing is defined
that is used by treesit-show-paren-data--categorize (bug#75198).
2024-12-30 19:54:39 +02:00
Yuan Fu
0b1986ba52
Generate compatibility report for multiple Emacs versions
* admin/tree-sitter/compat-template.html: Update template.
* admin/tree-sitter/treesit-admin.el:
(treesit-admin--builtin-language-sources): Add sources.
(treesit-admin--builtin-modes): New variable.
(treesit-admin--verify-major-mode-queries): Don't need to pass
LANGS argument anymore.
(treesit-admin-verify-major-mode-queries): Move, and use
treesit-admin--builtin-modes.
(treesit-admin--mode-languages): Set some variables so it gets
all the languages.
(treesit-admin--find-latest-compatible-revision): Also return
commit timestamp.
(treesit-admin--generate-compatibility-report): New parameter
EMACS-EXECUTABLES.  Support generating report for multiple Emacs
versions.
* lisp/treesit.el (treesit--language-git-timestamp): New function.
2024-12-30 00:20:55 -08:00
Yuan Fu
9e1e9fdff4
Refactor treesit-admin--verify-major-mode-queries
Make treesit-admin--verify-major-mode-queries use
treesit--install-language-grammar-1, rathre than the interactive
command treesit-install-language-grammar.

* admin/treesit-admin.el:
(treesit-admin--verify-major-mode-queries): Add parameter
SOURCE-ALIST.  Use treesit--install-language-grammar-1.
(treesit-admin-verify-major-mode-queries): Pass
treesit-admin--builtin-language-sources to
treesit-admin--verify-major-mode-queries.

* lisp/treesit.el (treesit-install-language-grammar): Don't
return revision of the git repo.
2024-12-30 00:20:54 -08:00
Yuan Fu
e2f7917152
Refactor treesit--install-language-grammar-1
Separate treesit--install-language-grammar-1 into two functions,
one clones the repository, the other builds and installs the
grammar.

* lisp/treesit.el (treesit--install-language-grammar-1):
Refactor out treesit--build-grammar.
(treesit--build-grammar): New function.
(treesit--language-git-revision): Now takes REPO-DIR as an
argument.
2024-12-30 00:20:54 -08:00
Yuan Fu
a22730f4d7
Support COMMIT in treesit-language-source-alist
* lisp/treesit.el (treesit-language-source-alist): Add COMMIT
field.
(treesit--install-language-grammar-1): Support COMMIT.
2024-12-30 00:20:53 -08:00
Juri Linkov
dc653bf063 * lisp/treesit.el (treesit-show-paren-data--categorize): Improve.
Instead of using only the immediate parent, try to search more levels
using 'treesit-parent-until' (bug#75122).
2024-12-30 09:23:05 +02:00
Juri Linkov
1addae07be Treesit support for show-paren-mode (bug#75122)
* lisp/treesit.el (treesit-show-paren-data--categorize):
New internal function.
(treesit-show-paren-data): New function.
(treesit-major-mode-setup): Set 'show-paren-data-function' to
'treesit-show-paren-data'.
2024-12-29 20:08:11 +02:00
Juri Linkov
ec8dd27f00 Add new variable 'up-list-function' for 'treesit-up-list'
* lisp/emacs-lisp/lisp.el (up-list-function): New variable (bug#73404).
(up-list-default-function): New function.
(up-list): Split part to 'up-list-default-function'.

* lisp/treesit.el (treesit-up-list): New function.
(treesit-major-mode-setup): Set 'up-list-function' to
'treesit-up-list'.
2024-12-29 19:57:28 +02:00
Juri Linkov
3c50edb2b5 Add new variable 'down-list-function' for 'treesit-down-list'
* lisp/emacs-lisp/lisp.el (down-list-default-function): New function.
(down-list-function): New variable (bug#73404).
(down-list): Move meat to 'down-list-default-function',
and call 'down-list-function' when non-nil.  Don't raise an error
in strings or comments when 'down-list-function' is non-nil.

* lisp/treesit.el (treesit--scan-error): New internal function.
(treesit-forward-sexp, treesit-forward-list): Use 'treesit--scan-error'.
(treesit-down-list): New function.
(treesit-major-mode-setup): Set 'down-list-function' to
'treesit-down-list'.
2024-12-29 19:51:18 +02:00
Juri Linkov
3db984c72b Add new variable 'forward-list-function' for 'treesit-forward-list'
* lisp/emacs-lisp/lisp.el (forward-list-default-function): New function.
(forward-list-function): New variable (bug#73404).
(forward-list): Move meat to 'forward-list-default-function',
and call 'forward-list-function' when non-nil.

* lisp/treesit.el (treesit-forward-list): Rewrite to not rely on
'treesit-forward-sexp'.
(treesit-major-mode-setup): Set 'forward-list-function' to
'treesit-forward-list'.
2024-12-29 19:42:40 +02:00
Eli Zaretskii
e96727f0ea ; Fix documentation of recent additions to treesit.el
* lisp/treesit.el (treesit-language-display-name-alist)
(treesit-language-display-name): Doc fixes.

* etc/NEWS: Fix wording of entry announcing the above.
2024-12-25 20:52:45 +02:00
Juri Linkov
c09e056c43 * lisp/treesit.el: Improvements for treesit-explore-mode (bug#75079)
(treesit-explorer-switch-parser): Don't use completing-read
on the single parser.
(treesit-explore-mode): Don't save treesit-explore-mode to the desktop.
2024-12-25 19:54:06 +02:00
Yuan Fu
e2a9af4311
Add treesit-aggregated-simple-imenu-settings
Now we support setting up Imenu for multiple languages

* doc/lispref/modes.texi: Update manual.
* lisp/treesit.el:
(treesit-aggregated-simple-imenu-settings): New variable.
(treesit--imenu-merge-entries): New function.
(treesit--generate-simple-imenu): This was previously
treesit-simple-imenu.
(treesit-simple-imenu): Support
treesit-aggregated-simple-imenu-settings.
(treesit-major-mode-setup): Recognize
treesit-aggregated-simple-imenu-settings.
* test/src/treesit-tests.el (treesit-imenu): New test.
2024-12-24 13:56:44 -08:00
Yuan Fu
833494d4b0
; Add some shortdoc examples for treesit entry
* lisp/treesit.el: Add some shortdoc examples.
2024-12-24 13:52:39 -08:00
Yuan Fu
251b4c8c39
Add treesit-language-display-name
* lisp/treesit.el:
(treesit-language-display-name-alist): New variable.
(treesit-language-display-name): New function.
* doc/lispref/parsing.texi (Language Grammar): Add to manual.
* etc/NEWS: Add to NEWS.
2024-12-24 13:52:39 -08:00
Yuan Fu
32ad734289
Include lightweight tags in treesit-admin--verify-major-mode-queries
* lisp/treesit.el (treesit--language-git-revision): Include
lightweight tags as well.
2024-12-23 18:52:41 -08:00
Yuan Fu
93755ea1a6
Create a blobless clone in treesit-admin--verify-major-mode-queries
* admin/treesit-admin.el (treesit-admin--verify-major-mode-queries):
Create a blobless clone.
* lisp/treesit.el (treesit--install-language-grammar-blobless):
New variable.
(treesit--git-clone-repo): Support blobless clone.
2024-12-23 18:52:40 -08:00
Yuan Fu
8aad208e00
Move admin scripts to admin/treesit-admin.el
* admin/treesit-admin.el: New file.
* lisp/treesit.el (treesit--check-manual-coverage):
(treesit--builtin-language-sources):
(treesit--verify-major-mode-queries):
(treesit-verify-major-mode-queries): Move out.
2024-12-20 08:22:04 -08:00
Yuan Fu
fe06a2baac
Add automated process to verify tree-sitter queries
This allows us to inform packagers of the grammar version they
want to use when packaging tree-sitter grammars with Emacs.

* lisp/treesit.el (treesit--builtin-language-sources):
New variable.
(treesit--verify-major-mode-queries):
(treesit-verify-major-mode-queries): New functions.
2024-12-20 00:53:00 -08:00
Yuan Fu
05ab13ebc7
Add keyword :reversed to treesit-font-lock-rules
This keyword will be useful for implementing
string-interpolation feature.

* doc/lispref/modes.texi (Parser-based Font Lock): Document the
new keyword.
* lisp/treesit.el (treesit-font-lock-settings): Document.
(treesit-font-lock-setting-reversed): New function.
(treesit-font-lock-rules): Add new keyword.
(treesit-font-lock-recompute-features): Handle new keyword.
2024-12-20 00:53:00 -08:00
Juri Linkov
d930d7f865 New treesit thing 'sexp-list' (bug#73404)
* lisp/treesit.el (treesit-forward-list): New command.
(treesit-forward-sexp): Check the thing 'text' only when
'treesit-sexp-type-regexp' is nil.
(treesit-forward-sexp-list): New function.
(treesit-navigate-thing): Don't try moving to parent
when thing is 'sexp-list'.
(treesit-major-mode-setup): Set 'forward-sexp-function' to
'treesit-forward-sexp-list' when the 'sexp-list' thing is defined.
2024-12-19 09:27:28 +02:00
Yuan Fu
9377ef5c23
Declare tree-sitter functions with a new macro
* lisp/progmodes/c-ts-mode.el:
* lisp/progmodes/cmake-ts-mode.el:
* lisp/progmodes/csharp-mode.el:
* lisp/progmodes/dockerfile-ts-mode.el:
* lisp/progmodes/elixir-ts-mode.el:
* lisp/progmodes/go-ts-mode.el:
* lisp/progmodes/heex-ts-mode.el:
* lisp/progmodes/java-ts-mode.el:
* lisp/progmodes/json-ts-mode.el:
* lisp/progmodes/lua-ts-mode.el:
* lisp/progmodes/php-ts-mode.el:
* lisp/progmodes/ruby-ts-mode.el:
* lisp/progmodes/rust-ts-mode.el:
* lisp/progmodes/js.el:
* lisp/progmodes/python.el:
* lisp/progmodes/sh-script.el:
* lisp/progmodes/c-ts-common.el:
* lisp/progmodes/prog-mode.el:
* lisp/progmodes/typescript-ts-mode.el: Use new macro.
* lisp/treesit.el (treesit-declare-unavailable-functions): New
macro.
2024-12-12 20:59:08 -08:00
Yuan Fu
b953bcb170
Allow treesit--font-lock-level-setter to be an alist
* lisp/treesit.el (treesit-font-lock-level): Allow the
value to be an alist mapping major modes to font lock levels.
(treesit--font-lock-level-setter): Rewrite.
(treesit--compute-font-lock-level): New function.
(treesit-font-lock-recompute-features): Use new function.

* doc/lispref/modes.texi (Parser-based Font Lock): Minor fix.
2024-12-07 23:36:02 -08:00
Yuan Fu
ed9eaaa996
Validate font-lock rules when setting up tree-sitter major mode
When tree-sitter grammar make breaking changes, major modes
breaks completely: no highlighting is shown.  This new function
will run in treesit-major-mode-setup, validate each
font-lock features, and disable the ones that are not compatible
with the new grammar, so that the rest of the features still
work.  It also displays a warning explaining the situation,
which looks like this:

    Warning (treesit-font-lock-rules-mismatch): Emacs cannot
    compile every font-lock rules because a mismatch between the
    grammar and the rules.  This is most likely due to a
    mismatch between the font-lock rules defined by the major
    mode and the tree-sitter grammar.

    This error can be fixed by either downgrading the
    grammar (tree-sitter-c) on your system, or upgrading the
    major mode package.  The following are the temporarily
    disabled features:

    - `preprocessor' for c.

* lisp/treesit.el (treesit-validate-font-lock-rules): New function.
(treesit-major-mode-setup): Validate font-lock rules.
2024-12-04 22:39:28 -08:00
Yuan Fu
10b4d3045e
Make tree-sitter-explorer support selecting local parser
Now treesit-explore-mode will prompt the user to select a parser
to explore, rather than a language.  It'll also include the
local parsers at point for selection.

* lisp/treesit.el (treesit--explorer-language): Change to
treesit--explorer-parser.
(treesit--explorer--nodes-to-highlight):
(treesit--explorer-refresh): Change to use parser.
(treesit--explorer-generate-parser-alist): New function.
(treesit-explorer-switch-parser): New command.
(treesit-explore-mode): Use switch-parser to setup.
* doc/lispref/parsing.texi (Language Grammar): Mention
treesit-explorer-switch-parser.
2024-12-04 22:39:28 -08:00
Yuan Fu
e37cd4fa59
Add baseline tree-sitter indent rule for C-like languages
I found a really good baseline indent rule that handles a wide
range of situations very well.  Now major modes can just start
with this rule and add exceptions on top.

This is worth mentioning in the manual, but that'll be a large
change, and doesn't have to be included in this commit.

* lisp/progmodes/c-ts-common.el:

(c-ts-common-list-indent-style): New variable.
(c-ts-common--standalone-parent):
(c-ts-common--prev-standalone-sibling):
(c-ts-common-parent-ignore-preproc):
(c-ts-common-baseline-indent-rule): New function.

* lisp/treesit.el (treesit--indent-prev-line-node): New function.
(treesit-simple-indent-presets): Add new preset.
2024-12-01 17:53:22 -08:00
Yuan Fu
4afdb7e80f
; Minor simplification for tree-sitter indent preset column-0
* lisp/treesit.el (treesit-simple-indent-presets): Simplify.
2024-12-01 17:53:22 -08:00
Yuan Fu
d0b918d8f3
Add treesit-explore command
* lisp/treesit.el (treesit-explore): New function.
* doc/lispref/parsing.texi (Language Grammar): Advertize this
command instead of the minor mode.
2024-12-01 17:53:22 -08:00
Yuan Fu
1e44c63fca
Allow treesit-simple-indent's rule to be a single function
* lisp/treesit.el (treesit-simple-indent-rules): Allow the rule
to be a single function.  Also replace cl-loop with dolist plus
catch-throw.
(treesit--indent-rules-optimize): Handle the case when a rule is
a function.
* doc/lispref/modes.texi (Parser-based Indentation): Update
manuel.
2024-12-01 17:53:21 -08:00
Yuan Fu
1d42512569
Refactor treesit--indent-1
* lisp/treesit.el (treesit--indent-largest-node-at): New
function.
(treesit--indent-1): Extract code out into the new function.
2024-12-01 17:53:21 -08:00
Yuan Fu
df5ac0daf0
Fix the call to treesit-thing-defined-p
* lisp/treesit.el (treesit-defun-at-point): Add the necessary
2nd argument.
2024-10-30 18:17:59 -07:00
Yuan Fu
1551c306f3
Fix the call to treesit-thing-defined-p
* lisp/treesit.el (treesit-defun-at-point): Add the necessary
2nd argument.
2024-10-28 19:33:20 -07:00
Eli Zaretskii
aeaeccbe32 Merge from origin/emacs-30
c78b4d2b31 Fix doc string of 'wdired-use-dired-vertical-movement'
b0aaee93fd Update the documentation of void functions
299a1f2407 ; * lisp/vc/log-edit.el (log-edit-diff-function): Grammar...
67a27ff53b ; Fix typos
2024-10-27 08:23:06 -04:00
Stefan Kangas
67a27ff53b ; Fix typos 2024-10-27 07:49:32 +01:00