From: Philip Kaludercic <philipk@posteo.net>
To: Yuan Fu <casouri@gmail.com>
Cc: Stefan Monnier <monnier@iro.umontreal.ca>,
Eli Zaretskii <eliz@gnu.org>, Dmitry Gutov <dgutov@yandex.ru>,
theophilusx@gmail.com, emacs-devel@gnu.org
Subject: Re: Tree-sitter introduction documentation
Date: Fri, 30 Dec 2022 11:25:25 +0000 [thread overview]
Message-ID: <87v8lt9lqy.fsf@posteo.net> (raw)
In-Reply-To: <787B1EB4-1925-4679-8747-449DCD685432@gmail.com> (Yuan Fu's message of "Fri, 30 Dec 2022 03:06:37 -0800")
[-- Attachment #1: Type: text/plain, Size: 1973 bytes --]
Yuan Fu <casouri@gmail.com> writes:
>> On Dec 27, 2022, at 8:44 AM, Philip Kaludercic <philipk@posteo.net> wrote:
>>
>> Stefan Monnier <monnier@iro.umontreal.ca> writes:
>>
>>>> It doesn't need any project, it is literally two command lines.
>>>> Here's an example:
>>>>
>>>> gcc -O2 -I. -c -o parser.o parser.c
>>>> gcc -shared parser.o scanner.o -ltree-sitter -o libtree-sitter-c-sharp.dll
>>>
>>> AFAIK `parser.c` is a file generated from the actual grammar's source,
>>> itself written in Javascript.
>>>
>>> So the above instructions are akin to downloading a precompiled binary
>>> and installing it. While it is the most convenient path for the
>>> end-users, it's important w.r.t Freedom to make sure that grammars can
>>> also be regenerated from source by the end users.
>>
>> I have asked the question before, but freedom or not, the above is a
>> nuisance to run for every language. If the process is as automatic as
>> the above example demonstrates, shouldn't Emacs have a command to take a
>> grammar and compile+install it? I guess this could be more complicated
>> if the grammar is generated using a custom tool-chain for each language
>> (or is it always Javascript?), but nothing impossible.
>
> Though the magic of programming, such command now exists: treesit-install-language-grammar. It needs recipes to work, though. The recipe would involve https://github.com, which I guess is probably too heretical to include in Emacs source, so I left the recipes empty. I tested the install command with these recipes:
>
> (setq treesit-language-source-alist
> '((python "https://github.com/tree-sitter/tree-sitter-python.git")
> (typescript "https://github.com/tree-sitter/tree-sitter-typescript.git"
> "typescript/src" "typescript")))
>
> Yuan
If acceptable, it looks good. I could imagine that it should be OK if
we point to GitHub, since we are just using it as a Git host. Here are
a few suggestions
[-- Attachment #2: Type: text/plain, Size: 3482 bytes --]
diff --git a/lisp/treesit.el b/lisp/treesit.el
index b120ca68c5..651898e948 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -99,6 +99,15 @@ treesit
:group 'tools
:version "29.1")
+(defcustom treesit-enabled-modes nil
+ "List of modes to enable tree-sitter support if available.
+When initialising a major mode with potential tree-sitter
+support, this variable is consulted. The special value t will
+enable tree-sitter support whenever possible."
+ :type '(choice (const :tag "Whenever possible" t)
+ (repeat :tag "Specific modes" function))
+ :version "29.1")
+
(defcustom treesit-max-buffer-size
(let ((mb (* 1024 1024)))
;; 40MB for 64-bit systems, 15 for 32-bit.
@@ -2690,20 +2699,19 @@ treesit--install-language-grammar-1
For LANG, URL, SOURCE-DIR, GRAMMAR-DIR, CC, C++, see
`treesit-language-source-alist'. If anything goes wrong, this
function signals an error."
- (let* ((lang (symbol-name lang))
- (default-directory "/tmp")
- (workdir (expand-file-name "treesit-workdir-00893133134"))
+ (let* ((default-directory (make-temp-file "treesit-workdir" t))
+ (workdir (expand-file-name "repo"))
(source-dir (expand-file-name (or source-dir "src") workdir))
(grammar-dir (expand-file-name (or grammar-dir "") workdir))
- (cc (or cc "cc"))
- (c++ (or c++ "c++"))
+ (cc (or cc (seq-find #'executable-find '("cc" "gcc" "c99"))
+ (error "No C compiler found")))
+ (c++ (or c++ (seq-find #'executable-find '("c++" "g++"))))
(soext (pcase system-type
('darwin "dylib")
((or 'ms-dos 'cywin 'windows-nt) "dll")
(_ "so")))
(out-dir (or (and out-dir (expand-file-name out-dir))
- (expand-file-name
- "tree-sitter" user-emacs-directory)))
+ (locate-user-emacs-file "tree-sitter")))
(lib-name (format "libtree-sitter-%s.%s" lang soext)))
(unwind-protect
(with-temp-buffer
@@ -2713,8 +2721,8 @@ treesit--install-language-grammar-1
"git" nil t nil "clone" url "--depth" "1" "--quiet"
workdir)
;; cp "${grammardir}"/grammar.js "${sourcedir}"
- (copy-file (concat grammar-dir "/grammar.js")
- (concat source-dir "/grammar.js"))
+ (copy-file (file-name-concat grammar-dir "grammar.js")
+ (file-name-concat source-dir "grammar.js"))
;; cd "${sourcedir}"
(setq default-directory source-dir)
(message "Compiling library")
@@ -2723,6 +2731,7 @@ treesit--install-language-grammar-1
cc nil t nil "-fPIC" "-c" "-I." "parser.c")
;; cc -fPIC -c -I. scanner.c
(when (file-exists-p "scanner.c")
+ (unless c++ (error "No C++ compiler found"))
(treesit--call-process-signal
cc nil t nil "-fPIC" "-c" "-I." "scanner.c"))
;; c++ -fPIC -I. -c scanner.cc
@@ -2739,7 +2748,7 @@ treesit--install-language-grammar-1
(rx bos (+ anychar) ".o" eos))
"-o" ,lib-name))
;; Copy out.
- (copy-file lib-name (concat out-dir "/") t)
+ (copy-file lib-name (file-name-as-directory out-dir) t)
(message "Library installed to %s/%s" out-dir lib-name))
(when (file-exists-p workdir)
(delete-directory workdir t)))))
next prev parent reply other threads:[~2022-12-30 11:25 UTC|newest]
Thread overview: 138+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-16 14:47 Tree-sitter introduction documentation Perry Smith
2022-12-16 15:06 ` Eli Zaretskii
2022-12-16 15:24 ` João Távora
2022-12-16 15:36 ` Perry Smith
2022-12-16 15:43 ` João Távora
2022-12-16 17:56 ` Philip Kaludercic
2022-12-16 15:38 ` Eli Zaretskii
2022-12-16 15:48 ` João Távora
2022-12-16 15:53 ` Perry Smith
2022-12-16 16:02 ` João Távora
2022-12-18 9:59 ` Eli Zaretskii
2022-12-18 14:07 ` Perry Smith
2022-12-18 17:18 ` Eli Zaretskii
2022-12-16 16:34 ` Eli Zaretskii
2022-12-17 0:03 ` Tim Cross
2022-12-17 8:42 ` Eli Zaretskii
2022-12-17 10:40 ` João Távora
2022-12-17 11:00 ` Eli Zaretskii
2022-12-18 0:40 ` Tim Cross
2022-12-16 16:01 ` Manuel Giraud
2022-12-16 16:40 ` Eli Zaretskii
2022-12-16 16:47 ` Perry Smith
2022-12-16 17:21 ` Eli Zaretskii
2022-12-16 15:53 ` Manuel Giraud
2022-12-16 15:56 ` João Távora
2022-12-16 16:39 ` Eli Zaretskii
2022-12-16 17:15 ` Manuel Giraud
2022-12-16 17:23 ` Eli Zaretskii
2022-12-16 20:22 ` Ken Brown
2022-12-17 4:06 ` Tim Cross
2022-12-17 15:42 ` Stefan Monnier
2022-12-17 17:41 ` T.V Raman
2022-12-26 22:42 ` Dmitry Gutov
2022-12-27 12:11 ` Eli Zaretskii
2022-12-27 12:43 ` Dmitry Gutov
2022-12-27 13:38 ` Eli Zaretskii
2022-12-27 14:11 ` Dmitry Gutov
2022-12-27 14:32 ` Eli Zaretskii
2022-12-27 16:36 ` Stefan Monnier
2022-12-27 16:44 ` Philip Kaludercic
2022-12-27 17:16 ` Eli Zaretskii
2022-12-27 17:20 ` Philip Kaludercic
2022-12-27 18:06 ` Eli Zaretskii
2022-12-27 17:33 ` Stefan Monnier
2022-12-30 11:06 ` Yuan Fu
2022-12-30 11:25 ` Philip Kaludercic [this message]
2022-12-30 11:54 ` tomas
2022-12-30 11:59 ` Philip Kaludercic
2022-12-30 12:27 ` tomas
2022-12-30 12:45 ` Philip Kaludercic
2022-12-30 14:26 ` Dmitry Gutov
2022-12-30 23:33 ` Yuan Fu
2022-12-30 15:31 ` Eli Zaretskii
2022-12-30 15:54 ` Philip Kaludercic
2022-12-30 16:17 ` Eli Zaretskii
2022-12-31 0:06 ` Yuan Fu
2022-12-31 0:12 ` Philip Kaludercic
2023-01-01 1:18 ` Yuan Fu
2023-01-02 19:10 ` [SPAM UNSURE] " Stephen Leake
2022-12-31 0:03 ` Yuan Fu
2022-12-31 0:25 ` Stefan Monnier
2023-01-01 1:16 ` Yuan Fu
2023-01-01 6:39 ` Eli Zaretskii
2023-01-02 0:31 ` Yuan Fu
2023-01-02 0:40 ` Stefan Monnier
2023-01-03 6:58 ` Yuan Fu
2023-01-02 3:34 ` Eli Zaretskii
2022-12-31 9:24 ` Eli Zaretskii
2022-12-31 22:14 ` Yuan Fu
2023-01-01 1:12 ` Yuan Fu
2022-12-31 0:44 ` Gregory Heytings
2023-01-03 4:08 ` Richard Stallman
2023-01-03 12:14 ` Eli Zaretskii
2023-01-01 3:03 ` Richard Stallman
2023-01-01 6:54 ` Eli Zaretskii
2023-01-01 19:14 ` Gregory Heytings
2023-01-01 20:11 ` Eli Zaretskii
2023-01-03 4:06 ` Richard Stallman
2023-01-03 12:06 ` Eli Zaretskii
2022-12-27 17:10 ` Eli Zaretskii
2022-12-27 17:31 ` Stefan Monnier
2022-12-27 18:08 ` Eli Zaretskii
2022-12-27 18:44 ` Stefan Monnier
2022-12-27 20:06 ` Philip Kaludercic
2022-12-27 21:13 ` Stefan Monnier
2022-12-28 2:52 ` Yuan Fu
2022-12-28 13:10 ` Gregory Heytings
2022-12-28 13:38 ` Lynn Winebarger
2022-12-28 14:41 ` Danny Freeman
2022-12-29 11:14 ` Philip Kaludercic
2022-12-29 15:27 ` Gregory Heytings
2022-12-29 15:40 ` Lynn Winebarger
2022-12-29 21:50 ` [SPAM UNSURE] " Stephen Leake
2022-12-29 22:37 ` Lynn Winebarger
2022-12-30 14:10 ` Lynn Winebarger
2022-12-30 16:25 ` Targeting libtreesitter from wisent and other parser generators for emacs Lynn Winebarger
2022-12-31 8:25 ` Eli Zaretskii
2022-12-31 13:07 ` Lynn Winebarger
2022-12-29 15:45 ` Tree-sitter introduction documentation Philip Kaludercic
2022-12-29 17:00 ` Gregory Heytings
2022-12-29 17:12 ` Philip Kaludercic
2022-12-29 17:31 ` Gregory Heytings
2022-12-29 18:12 ` Philip Kaludercic
2022-12-29 18:28 ` Eli Zaretskii
2022-12-29 18:44 ` Stefan Monnier
2022-12-29 19:34 ` Eli Zaretskii
2022-12-29 19:48 ` Stefan Monnier
2022-12-29 19:59 ` Eli Zaretskii
2022-12-29 18:32 ` Stefan Monnier
2022-12-29 16:32 ` Eli Zaretskii
2022-12-29 16:53 ` Philip Kaludercic
2022-12-29 16:59 ` Eli Zaretskii
2022-12-29 17:01 ` Philip Kaludercic
2022-12-29 17:03 ` Stefan Monnier
2022-12-29 17:12 ` Gregory Heytings
2022-12-29 17:13 ` Philip Kaludercic
2022-12-29 17:04 ` Gregory Heytings
2022-12-30 1:01 ` Gregory Heytings
2022-12-30 11:00 ` Philip Kaludercic
2022-12-30 12:07 ` Gregory Heytings
2022-12-30 13:10 ` Philip Kaludercic
2022-12-30 15:23 ` Gregory Heytings
2022-12-28 12:56 ` Gregory Heytings
2022-12-28 14:41 ` Stefan Monnier
2022-12-27 19:53 ` Dmitry Gutov
2023-01-01 3:03 ` Richard Stallman
2022-12-27 13:51 ` tomas
2022-12-27 15:58 ` Stefan Monnier
2022-12-16 17:23 ` Perry Smith
2022-12-16 17:31 ` Eli Zaretskii
2022-12-16 19:08 ` Perry Smith
2022-12-16 19:37 ` Eli Zaretskii
2022-12-16 20:05 ` Perry Smith
-- strict thread matches above, loose matches on Subject: below --
2022-12-17 4:50 Payas Relekar
2022-12-18 6:32 Pedro Andres Aranda Gutierrez
2022-12-18 8:07 ` Eli Zaretskii
2022-12-18 10:39 ` Pedro Andres Aranda Gutierrez
2022-12-18 11:44 ` Eli Zaretskii
2022-12-31 6:59 Pedro Andres Aranda Gutierrez
2022-12-31 7:47 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87v8lt9lqy.fsf@posteo.net \
--to=philipk@posteo.net \
--cc=casouri@gmail.com \
--cc=dgutov@yandex.ru \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=monnier@iro.umontreal.ca \
--cc=theophilusx@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).