guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

tree-sitter grammars for emacs memo


From: Murad Mamedov
Subject: tree-sitter grammars for emacs memo
Date: Sun, 04 Dec 2022 19:04:02 +0300
User-agent: mu4e 1.8.11; emacs 29.0.50


Hi,

Today I spent some time on trying latest emacs with
--with-tree-siter enabled. It enables native support
for tree-sitter. However, language grammars are still
external. I came up with below snippet that makes
grammar packages. But I didn't find it worth committing.
So sharing it here if someone will want to try,
or may be form it to commit.

Current issues related to guix with tree-sitter below:

- Emacs tries to dlopen libraries with grammars.
 Since we are under guix, one has to add grammar
 packages to profile and use treesit-extra-load-path
 variable. In the long run, this will require different
 solution, probably patching emacs it self, idk.

--8<---------------cut here---------------start------------->8---
(use-package treesit
 :demand t
 :init
 (setq treesit-extra-load-path
       '("/home/muradm/.cache/guix-extra-profiles/desktop/lib")))
--8<---------------cut here---------------end--------------->8---

Regards,
muradm

Attachment: emacs-tree-sitter-module.patch
Description: Text Data


--8<---------------cut here---------------start------------->8---

(define (emacs-tree-sitter-grammar org lang version commit hash synopsis)
 (let ((name
        (string-append "emacs-tree-sitter-grammar-" lang))
       (home-page
(string-append "https://github.com/"; org "/tree-sitter-" lang))
       (src-dir (if (equal? "typescript" lang) "tsx/" ""))
       (lib (format #f "libtree-sitter-~a.so"
                    (if (equal? "typescript" lang) "tsx" lang))))
   (package
     (name name)
     (version version)
     (home-page home-page)
     (source (origin
               (method git-fetch)
               (uri (git-reference
                     (url home-page)
                     (commit commit)))
               (file-name (git-file-name name version))
;; Patch includes two files necessary to build each grammar ;; in emacs-with-tree-sitter loadable way. Files are ;; emacs-module.h and tree-sitter-lang.in, originated ;; from https://github.com/casouri/tree-sitter-module. (patches (list (local-file "emacs-tree-sitter-module.patch")))
               (modules '((guix build utils)))
               (snippet
                #~(begin
(copy-file (string-append #$src-dir "grammar.js") (string-append #$src-dir "src/grammar.js"))
                    (for-each
(lambda (f) (rename-file f (string-append #$src-dir f))) '("src/emacs-module.h" "src/tree-sitter-lang.in"))))
               (sha256 (base32 hash))))
     (build-system gnu-build-system)
     (arguments
      (list
       ;; Phases below and snippet above mimics actions from:
;; https://github.com/casouri/tree-sitter-module/blob/master/build.sh
       #:phases
       #~(modify-phases %standard-phases
           (delete 'configure)
           (replace 'build
             (lambda _
(with-directory-excursion (string-append #$src-dir "src")
                 (let* ((scanner? (or (file-exists? "scanner.c")
(file-exists? "scanner.cc"))) (CC (if (file-exists? "scanner.cc") "g++" "gcc")) (compile (lambda (f) (invoke CC "-fPIC" "-c" "-I." f)))
                        (link-args `("-fPIC" "-shared" "parser.o"
,@(if scanner? '("scanner.o") '())
                                     "-o" ,#$lib)))
                   (invoke "gcc" "-fPIC" "-c" "-I." "parser.c")
                   (for-each
(lambda (f) (when (file-exists? f) (compile f)))
                    '("scanner.c" "scanner.cc"))
                   (apply invoke CC link-args)))))
           (delete 'check)
           (replace 'install
             (lambda _
(install-file (string-append #$src-dir "src/" #$lib) (string-append #$output "/lib")))))))
     (synopsis synopsis)
     (description (string-append synopsis "."))
     (license license:expat))))

(define-public emacs-tree-sitter-grammar-bash
 (emacs-tree-sitter-grammar
  "tree-sitter" "bash" "0.19.0" "v0.19.0"
  "18c030bb65r50i6z37iy7jb9z9i8i36y7b08dbc9bchdifqsijs5"
  "Bash grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-c
 (emacs-tree-sitter-grammar
  "tree-sitter" "c" "0.20.2" "v0.20.2"
  "1w03r4l773ki4iq2xxsc2pqxf3pjsbybq3xq4glmnsihgylibn8v"
  "C grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-cpp
 (emacs-tree-sitter-grammar
  "tree-sitter" "cpp" "0.20.0" "v0.20.0"
  "0hxcpdvyyig8njga1mxp4qcnbbnr1d0aiy27vahijwbh98b081nr"
  "C++ grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-css
 (emacs-tree-sitter-grammar
  "tree-sitter" "css" "0.19.0" "v0.19.0"
  "014jrlgi7zfza9g38hsr4vlbi8964i5p7iglaih6qmzaiml7bja2"
  "CSS grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-c-sharp
 (emacs-tree-sitter-grammar
  "tree-sitter" "c-sharp" "0.20.0" "v0.20.0"
  "0lijbi5q49g50ji00p2lb45rvd76h07sif3xjl9b31yyxwillr6l"
  "C# grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-elixir
 (emacs-tree-sitter-grammar
"elixir-lang" "elixir" "0.0.1" "0ba537df8692179f34cccc7efed05de6cf5178aa"
  "1k35nfwnz8zjiw2mg8d6nphxp3gb7yhb0a5vw4cz2h3n10yyq75i"
  "Elixir grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-go
 (emacs-tree-sitter-grammar
  "tree-sitter" "go" "0.19.1" "rust-0.19.1"
  "0nxs47vd2fc2fr0qlxq496y852rwg39flhg334s7dlyq7d3lcx4x"
  "Go grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-html
 (emacs-tree-sitter-grammar
  "tree-sitter" "html" "0.19.0" "v0.19.0"
  "1hg7vbcy7bir6b8x11v0a4x0glvqnsqc3i2ixiarbxmycbgl3axy"
  "HTML grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-java
 (emacs-tree-sitter-grammar
  "tree-sitter" "java" "0.20.0" "v0.20.0"
  "1i9zfgqibinz3rkx6yws1wk49iys32x901dki65qihbxcmcfh341"
  "Java grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-javascript
 (emacs-tree-sitter-grammar
  "tree-sitter" "javascript" "0.20.0" "rust-0.20.0"
  "175yrk382n2di0c2xn4gpv8y4n83x1lg4hqn04vabf0yqynlkq67"
  "JavaScript grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-json
 (emacs-tree-sitter-grammar
  "tree-sitter" "json" "0.19.0" "v0.19.0"
  "06pjh31bv9ja9hlnykk257a6zh8bsxg2fqa54al7qk1r4n9ksnff"
  "JSON grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-python
 (emacs-tree-sitter-grammar
  "tree-sitter" "python" "0.20.0" "v0.20.0"
  "14nnnblbjxyri8x21kj59agiy3cn4fwfrab3dmidykdyq2r46f5w"
  "Python grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-rust
 (emacs-tree-sitter-grammar
  "tree-sitter" "rust" "0.20.3" "v0.20.3"
  "149jhy01mqvavwa8jlxb8bnn7sxpfq2x1w35si6zn60b7kqjlx8f"
  "Rust grammar for tree-sitter in Emacs"))

(define-public emacs-tree-sitter-grammar-typescript
 (emacs-tree-sitter-grammar
  "tree-sitter" "typescript" "0.20.1" "v0.20.1"
  "07fl9d968lal0aqj4f0n16p3n94cjkgfp54wynfr8gbdkjss5v5x"
  "TypeScript/TSX grammar for tree-sitter in Emacs"))

(define-public emacs-next-pgtk-tree-sitter
 (let ((commit "be67cc276a95a97a329fa633fef686ba06c8e6d2")
       (revision "3"))
   (package
     (inherit emacs-next-pgtk)
     (name "emacs-next-pgtk-tree-sitter")
     (version (git-version "29.0.50" revision commit))
     (source
      (origin
        (inherit (package-source emacs-next))
        (method git-fetch)
        (uri (git-reference
              (url "https://git.savannah.gnu.org/git/emacs.git";)
              (commit commit)))
        (file-name (git-file-name name version))
        (sha256
         (base32
          "0daczbivmp1v8dzp98pn8d93m9np38avs0xyyvhd48b8ly71daia"))))
     (arguments
(substitute-keyword-arguments (package-arguments emacs-next-pgtk)
        ((#:configure-flags flags #~'())
         #~(cons* "--with-tree-sitter" #$flags))))
     (inputs
      (modify-inputs
       (package-inputs emacs-next-pgtk)
       (prepend tree-sitter))))))

--8<---------------cut here---------------end--------------->8---

reply via email to

[Prev in Thread] Current Thread [Next in Thread]