From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Rahul Martim Juliato Newsgroups: gmane.emacs.devel Subject: Re: [PATCH] feat: add markdown-ts-mode Date: Sun, 21 Apr 2024 02:50:12 -0300 Message-ID: <87edazgt7v.fsf@gmail.com> References: <877cgs7m4e.fsf@gmail.com> <86frvga5zc.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="12883"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: Rahul Martim Juliato , Yuan Fu , "Ergus via Emacs development discussions." , Eli Zaretskii To: Jostein =?utf-8?Q?Kj=C3=B8nigsen?= Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sun Apr 21 11:06:26 2024 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ryT9W-00034C-8k for ged-emacs-devel@m.gmane-mx.org; Sun, 21 Apr 2024 11:06:26 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ryT99-0004PS-Vs; Sun, 21 Apr 2024 05:06:04 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ryQ5y-0002aO-Ej for emacs-devel@gnu.org; Sun, 21 Apr 2024 01:50:34 -0400 Original-Received: from mail-pf1-x42c.google.com ([2607:f8b0:4864:20::42c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1ryQ5v-0003zf-8V; Sun, 21 Apr 2024 01:50:34 -0400 Original-Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-6f103b541aeso904145b3a.3; Sat, 20 Apr 2024 22:50:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713678617; x=1714283417; darn=gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=Lvz6Kc3y37g1jSx8dS+0xK/9uwleJCMxYD6klIGUZEk=; b=K2iglQADflNQ/8LRV7MZ/6Orqx3FBEhmaSFAlntO9y16u0TlukXsySasw4pgKUAADP 6PwQeryldbUwbtGeawg8Ek1rBUb+ZhxnJmB8R4aIm0K+BIXWFYp/PHvGWNtqLnWot+7Z ZDRy/rgCMhZDH6wpI0F02Xk+c3G3LFBFhDnvKCMu8E4VwVhUIGDOTt9TBLDzIeblpQgx J9nSoPMnw2V3pmEeFRTSWC12fXITM/eHFnX7Snx0xbC8hMHmvW4jY8StHk5wXaRNj49n SgiS9xX1s/mne0nBBaUd/4BwryZjV1j+hdPSwUuiInmosoc99kafCemHtsxoxXILpWEN LuOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713678617; x=1714283417; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Lvz6Kc3y37g1jSx8dS+0xK/9uwleJCMxYD6klIGUZEk=; b=c42lrCEwCFB08N66Kp7DjyF1WWHSo9YiTYoYiTbdGPig6pLMLMLtKupLU3d7hVuXX1 MOpHrAHaj3F33PwyEiXmzS0rW1spZXDVB7I8Ur3hpkTbdLyj42yrNIwdXk4JwHN1aZJP l2vWeE6RG3OOLcO1HtDw+kSN28I2JqJLO7lfgd1KXfs8l15a+5w03kkNriHE9DkSQBoi wIoCa2U//0XsA6/fq1t0tkZWot34PCEK6r2WSq7Jpn+aozjzhsCTaQlsSUYvaCBUJVt1 maCjI33nAS57lpz5S8v/ci+vQSfMsrocdFrkKD30gYPrAt7BuAyTlehMA3SCUyOl4VEK ijiw== X-Forwarded-Encrypted: i=1; AJvYcCV6isFbdgS+9K6Oe2/6yEZ3qKhxQ8KiI8dOgQgXrasEJqtUJqEfjfcd0WCR6Sva7uX6KpigLUXbhuIYAcqkpUJRonqbFWlWtUdM20XyJLZAjis= X-Gm-Message-State: AOJu0YyFrbe9vDdzwmyEcdSwZPYr6oObcwTpKScepPIc5VP79Iw0NKBF G3VfbXik2iHzCx79tn76yUB2gMhN5i//N+8TobxnCsKOU5I6oMA4XMAKACH5wGo= X-Google-Smtp-Source: AGHT+IFmdNd63ib//sUZ3fyfuODOjK9zhVtMifX58qfqAU8X//D8X3GHLYQHW67E5W2McsVDB4YfKw== X-Received: by 2002:a05:6a00:3cd4:b0:6ed:d47e:625d with SMTP id ln20-20020a056a003cd400b006edd47e625dmr7408480pfb.30.1713678616663; Sat, 20 Apr 2024 22:50:16 -0700 (PDT) Original-Received: from debian ([2804:7f0:9182:dfe8:a75:b0ca:67e7:6a46]) by smtp.gmail.com with ESMTPSA id ld2-20020a056a004f8200b006eaf43bbcb5sm5682988pfb.114.2024.04.20.22.50.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Apr 2024 22:50:15 -0700 (PDT) X-Google-Original-From: Rahul Martim Juliato In-Reply-To: ("Jostein =?utf-8?Q?Kj=C3=B8nigsen=22's?= message of "Sat, 20 Apr 2024 19:45:05 +0200") Received-SPF: pass client-ip=2607:f8b0:4864:20::42c; envelope-from=rahuljuliato@gmail.com; helo=mail-pf1-x42c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Sun, 21 Apr 2024 05:06:02 -0400 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:317916 Archived-At: --=-=-= Content-Type: text/plain Thanks Eli and Jostein! No problem criticising :) Please find a new patch attached. Things I've made: - changed the file to the textmodes folder - made it inherit from `text-mode' - changed the news with +++ - changed `emacs.texi' (is it here?) to add Markdown - scratched my head until 2:30AM thinking why it would not work for Jostein test. Well Jostein, I've been played by the tree-sitter github repository maintainer, lol. First, a little note. There's actually no major changes to the version on github. I only changed documenting strings and made some small name changes to more "alike" already existing modes. It happens that on tree-sitter repository, unlike any other of their repositories (that I've seen), "main" branch is NOT the current branch, but the "we moved from here bye" one. The current default branch is "split_parser" where tree-sitter-markdown/src/ resides, hence the confusion. So, I wrote the mode with the "main" one in mind. I already checked the "new" (split_parser) one, and it seems it is possible to convert the current work to use this one instead. I'll try to do this in the middle of the week or sooner :) In the mean time, I realized more people would like to test this patch and tree-sitter setup is really trick, so I made this little "guide" on how to apply it until the end result (this might work now, pointing to the "main" branch with the current patch). If you could please try the path (B) on the guide and tell me if this works for you, It would be nice, Jostein. Thanks! Rahul --- beggining of guide on how to apply this patch and test it Git apply this patch. Run the autogen script: ./autogen.sh Make sure configure uses tree-sitter: ./configure --with-tree-sitter Compile: make bootstrap Check the build: ./src/emacs -Q --version Open emacs ./src/emacs -Q --init-dir=~/tmp_emacs_dir/ A) The Hard Way Visit a .md file C-x f TEST.md Note the mode will not automatically load. This behavior is the same as typescript-ts-mode or other treesitter modes I've been using. M-x markdown-ts-mode It will fail since you have no tree sitter grammar installed. and will suggest installing it with `treesit-install-language-grammar'. This behaviour is also standard for the tree-sitter modes I currently use (typescript, tsx, rust). Issuing "M-x treesit-install-language-grammar RET". It asks for language, complete with "markdown RET". It says there's no recipie for it, if you want to build it interactivelly. Anwser "yes". It asks for the URL where the grammar is hosted, enter: "https://github.com/tree-sitter-grammars/tree-sitter-markdown RET" It asks for the tag or branch, setting the default, enter "main RET". It asks for the subfolder, leave the default (src), enter "RET". It asks for the C compiler to use (default: auto-detect), just "RET". It asks for the C++ compiler to use (default: auto-detect), just "RET". Install to (default "~/tmp_emacs_dir/treesitter"), just "RET". It will clone the repository, compile the library and tell in the minibuffer the library is installed to your folder. B) The Easier Way. Copy-paste and eval this use-package definition. (use-package markdown-ts-mode :mode ("\\.md\\'" . markdown-ts-mode) :defer 't :config (add-to-list 'treesit-language-source-alist '(markdown "https://github.com/tree-sitter-grammars/tree-sitter-markdown" "main" "src"))) Visit your markdown test file. It will probably fail due to the missing grammar. Issue "M-x treesit-install-language-grammar RET". Now with TAB it should complete "markdown", if not, type it. As we already have the source now defined, just hit "RET" to install to the default treemacs folder. It will clone the repository and say it installed on your folder. Just reload the mode with "M-x markdown-ts-mode". >From now on (with the use-package definition on `init.el') you should just open .md and have the highlight and stuff. --- end of the guide --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-feat-add-markdown-ts-mode.patch >From 45796df36129ec77c532b3fa21cdd0b8033c9777 Mon Sep 17 00:00:00 2001 From: Rahul Martim Juliato Date: Fri, 19 Apr 2024 23:21:20 -0300 Subject: [PATCH] feat: add markdown-ts-mode * lisp/textmodes/markdown-ts-mode.el: New file. * doc/emacs/emacs.texi: Add Markdown to the manual * etc/NEWS: Announce markdown-ts-mode --- doc/emacs/emacs.texi | 1 + etc/NEWS | 5 ++ lisp/textmodes/markdown-ts-mode.el | 106 +++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 lisp/textmodes/markdown-ts-mode.el diff --git a/doc/emacs/emacs.texi b/doc/emacs/emacs.texi index 7d77f13ab21..244c822ee04 100644 --- a/doc/emacs/emacs.texi +++ b/doc/emacs/emacs.texi @@ -618,6 +618,7 @@ Top * Enriched Text:: Editing text enriched with fonts, colors, etc. * Text Based Tables:: Commands for editing text-based tables. * Two-Column:: Splitting text columns into separate windows. +* Markdown:: Major mode for editing Markdown files. Filling Text diff --git a/etc/NEWS b/etc/NEWS index 8ad1e78ca60..06fbaa03b55 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1688,6 +1688,11 @@ A major mode based on the tree-sitter library for editing Elixir files. *** New major mode 'lua-ts-mode'. A major mode based on the tree-sitter library for editing Lua files. ++++ +*** New major mode 'markdown-ts-mode'. +A major mode based on the tree-sitter library for editing Markdown files. + + ** Minibuffer and Completions +++ diff --git a/lisp/textmodes/markdown-ts-mode.el b/lisp/textmodes/markdown-ts-mode.el new file mode 100644 index 00000000000..063780a772f --- /dev/null +++ b/lisp/textmodes/markdown-ts-mode.el @@ -0,0 +1,106 @@ +;;; markdown-ts-mode.el --- tree sitter support for Markdown -*- lexical-binding: t; -*- + +;; Copyright (C) 2024 Free Software Foundation, Inc. + +;; Author : Rahul Martim Juliato +;; Maintainer : Rahul Martim Juliato +;; Created : April 2024 +;; Keywords : markdown md languages tree-sitter + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: +;; + +;;; Code: + +(require 'treesit) +(require 'subr-x) + +(declare-function treesit-node-parent "treesit.c") +(declare-function treesit-node-type "treesit.c") +(declare-function treesit-parser-create "treesit.c") + +(defvar markdown-ts--treesit-settings + (treesit-font-lock-rules + :language 'markdown + :override t + :feature 'delimiter + '([ "[" "]" "(" ")" ] @shadow) + + :language 'markdown + :feature 'paragraph + '([((atx_heading) @font-lock-keyword-face) + ((block_quote_marker) @font-lock-string-face) + ((code_span) @font-lock-string-face) + ((emphasis) @underline) + ((image_description) @link) + ((indented_code_block) @font-lock-string-face) + ((link_destination) @font-lock-string-face) + ((setext_heading) @font-lock-keyword-face) + ((strong_emphasis) @bold) + ((thematic_break) @shadow) + (block_quote (block_quote_marker) @font-lock-string-face) + (block_quote (paragraph) @font-lock-string-face) + (fenced_code_block (code_fence_content) @font-lock-string-face) + (fenced_code_block (fenced_code_block_delimiter) @font-lock-doc-face) + (inline_link (link_destination) @font-lock-string-face) + (inline_link (link_text) @link) + (list_item (list_marker_dot) @font-lock-keyword-face) + (list_item (list_marker_minus) @font-lock-keyword-face) + (list_item (list_marker_plus) @font-lock-keyword-face) + (list_item (list_marker_star) @font-lock-keyword-face) + (shortcut_link (link_text) @link) + ]))) + +(defun markdown-ts-imenu-node-p (node) + "Check if NODE is a valid entry to imenu." + (equal (treesit-node-type (treesit-node-parent node)) + "atx_heading")) + +(defun markdown-ts-imenu-name-function (node) + "Return an imenu entry if NODE is a valid header." + (let ((name (treesit-node-text node))) + (if (markdown-ts-imenu-node-p node) + (thread-first (treesit-node-parent node)(treesit-node-text)) + name))) + +(defun markdown-ts-setup () + "Setup treesit for `markdown-ts-mode'." + (setq-local treesit-font-lock-settings markdown-ts--treesit-settings) + (treesit-major-mode-setup)) + +;;;###autoload +(define-derived-mode markdown-ts-mode text-mode "Markdown" + "Major mode for editing Markdown using tree-sitter grammar." + (setq-local font-lock-defaults nil + treesit-font-lock-feature-list '((delimiter) + (paragraph))) + + (setq-local treesit-simple-imenu-settings + `(("Headings" markdown-ts-imenu-node-p nil markdown-ts-imenu-name-function))) + + (when (treesit-ready-p 'markdown) + (treesit-parser-create 'markdown) + (markdown-ts-setup))) + +(derived-mode-add-parents 'markdown-ts-mode '(markdown-mode)) + +(if (treesit-ready-p 'markdown) + (add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-ts-mode))) + +(provide 'markdown-ts-mode) +;;; markdown-ts-mode.el ends here -- 2.39.2 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Jostein Kj=C3=B8nigsen writes: > Some comments so far about *how* the mode should correctly be added to re= po, so I won't delve into > that. > > Instead, I like the idea behind having built in modes for stuff like this= . So I went ahead and tested the > real-world functionality of the major-mode on the files I have :) > > First I tried to install the grammar using the default for treesit-instal= l-grammar, and that failed. I then > tweaked some settings, and I think I did the right thing? > > Repo: https://github.com/tree-sitter-grammars/tree-sitter-markdown > Subfolder for compilation:=20 > > tree-sitter-markdown/src > > After installing this grammar using , I can compile/evaluate the provided= major-mode (but not > before!). I think most other TS-based major-modes in Emacs have a way to = handle this more gracefully, > and that should probably be addressed here too? > > Now after compiling it and activating it... Im getting some confusing beh= aviour on existing files: > > 1. No syntax-highlighting at all. Not on new, nor existing buffers. What = I am doing wrong here? :) > 2. Newline chars in modeline to tell me my current section (# Deployment^= J). Is this major-mode > somehow linebreak-type sensitive? IMO that's not a great thing. > 3. No imenu? Imenu really would make this nicer to use, but not really wo= rth looking into until other > issues are resolved. > > The contrast to the version you say you've already published on MELPA is = quite significant, where from > what I can tell...=20 > > In that mode, literally everything works. Are there any reason you can't = submit that version instead of > this modified version? > > Also: Please don't consider these comments in a dissuading manner. These = are meant as constructive > criticism, because I want Emacs to have these things, but then they need = to be good enough :) > > =E2=80=94 > Kind Regards > Jostein Kj=C3=B8nigsen > > On 20 Apr 2024, at 08:44, Eli Zaretskii wrote: > > From: Rahul Martim Juliato > Date: Sat, 20 Apr 2024 00:23:45 -0300 > > I've been using Emacs without any extra packages as an educational > experiment after years of package hording. > > One of the few things I've been missing is a way of displaying some sort > of syntax highlight for markdown documents. > > It feels a bit frustrating opening a README.md file with a single face > color, since Emacs from the box can handle so much. I am sure others > might have shared this feeling before. > > This patch is a modified version of a package I've recently published on > MELPA, screenshots are available here: > https://github.com/LionyxML/markdown-ts-mode > > It is a very basic mode that provides syntax highlight and imenu support > using treesitter grammar from > https://github.com/tree-sitter-grammars/tree-sitter-markdown > > The idea here is to provide minimal support to Emacs and continue > building up features in the future. > > It is the first time I contribute to Emacs devel, so please let me know > iif I did something wrong or anything is not at the expected standards. > > Thanks, please see a couple of comments below. I've CC'ed Yuan as > well, in case he has comments. > > From 364f61b03d601d2cb3aeb1687da2d1b2a232474c Mon Sep 17 00:00:00 2001 > > From: Rahul Martim Juliato > Date: Fri, 19 Apr 2024 23:21:20 -0300 > > --- > etc/NEWS | 5 ++ > lisp/progmodes/markdown-ts-mode.el | 106 +++++++++++++++++++++++++++++ > 2 files changed, 111 insertions(+) > create mode 100644 lisp/progmodes/markdown-ts-mode.el > > Please accompany the patches with a ChangeLog-style commit log > message; see CONTRIBUTE for the details. In this case, you'd need a > very minimal one, something like: > > * lisp/progmodes/markdown-ts-mode.el: New file. > * etc/NEWS: Announce the new mode. > > +--- > +*** New major mode 'markdown-ts-mode'. > +A major mode based on the tree-sitter library for editing Markdown file= s. > > How about mentioning this in the user manual as well? It doesn't have > to be anything more than just the name of the mode. > > diff --git a/lisp/progmodes/markdown-ts-mode.el b/lisp/progmodes/markdow= n-ts-mode.el > > Should this mode live in lisp/textmodes/ instead? Markdown is AFAIU a > mode for text with markup, it isn't a programming language. > > +(defun markdown-ts-setup () > + "Setup treesit for `markdown-ts-mode'." > + (setq-local treesit-font-lock-settings markdown-ts--treesit-settings) > + (treesit-major-mode-setup)) > + > +;;;###autoload > +(define-derived-mode markdown-ts-mode fundamental-mode "markdown[ts]" > + "Major mode for editing Markdown using tree-sitter grammar." > + (setq-local font-lock-defaults nil > + treesit-font-lock-feature-list '((delimiter) > + (paragraph))) > > I wonder whether this mode should inherit from Text mode instead, and > consequently have some text-related commands, perhaps aided by the > tree-sitter grammar? WDYT? We could, of course, add commands later, > but the decision to have Text mode as the parent of this one should be > made now. --=-=-=--