Skip to content

emacs-tree-sitter/elisp-tree-sitter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

f3b6e78 · Feb 11, 2025
Dec 10, 2024
Dec 10, 2024
Apr 30, 2024
Mar 4, 2024
Feb 12, 2022
Jan 8, 2025
Sep 9, 2023
Mar 21, 2020
Feb 11, 2025
Feb 12, 2022
Sep 9, 2023
Sep 8, 2023
Oct 19, 2020
Mar 14, 2020
Mar 26, 2024

Repository files navigation

ELisp Tree-sitter

Documentation GitHub Actions

For Emacs 29+, please use the built-in integration instead of this package.

This is an Emacs Lisp binding for tree-sitter, an incremental parsing library. It requires Emacs 25.1 or above, built with dynamic module support.

It aims to be the foundation for a new breed of Emacs packages that understand code structurally. For example:

  • Faster, fine-grained code highlighting.
  • More flexible code folding.
  • Structural editing (like Paredit, or even better) for non-Lisp code.
  • More informative indexing for imenu.

The author of tree-sitter articulated its merits a lot better in this Strange Loop talk.

Installation

See the installation section in the documentation.

If you want to hack on emacs-tree-sitter itself, see the next section instead.

Setup for Development

Note: On Windows, use Powershell instead of Bash or cmd.exe.

  • Clone this repo with the --recursive flag.
  • Add 3 of its directories to load-path: core/, lisp/ and langs/.
  • Install eask.
  • Run bin/setup.

If you want to hack on the high-level features (in Lisp) only:

  • Make changes to the .el files.
  • Add tests to tree-sitter-tests.el and run them with bin/test.

If you want to build additional (or all) grammars from source, or work on the core dynamic module, see the next 2 sections.

Building grammars from source

Note: If you are only interested in building the grammar binaries, not the dynamic module, check out tree-sitter-langs.

  • Install NodeJS. It is needed to generate the grammar code from the JavaScript DSL. The recommended tool to manage NodeJS is volta.
  • Install tree-sitter CLI tool: (Its binary can also be downloaded directly from GitHub.) Note: version 0.20+ cannot be used, as they introduced a breaking change in binary storage location.
    # For yarn user
    yarn global add [email protected]
    
    # For npm user
    npm install -g [email protected]
  • Run langs/script/compile. For example:
    langs/script/compile rust

Working on the dynamic module

  • Install the Rust toolchain.
  • Build:
    bin/build
  • Test:
    bin/test
  • Continuously rebuild and test on change (requires cargo-watch):
    bin/test watch

To test against a different version of Emacs, set the environment variable EMACS (e.g. EMACS=/snap/bin/emacs make test).

Alternatives

Contribution

Contributions are welcomed. Please take a look at the issue list for ideas, or create a new issue to describe any idea you have for improvement.

For language-specific issues/features, please check out tree-sitter-langs instead.

Show respect and empathy towards others. Both technical empathy and general empathy are highly valued.