all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Rahul Martim Juliato <rahuljuliato@gmail.com>
To: Rahul Martim Juliato <rahuljuliato@gmail.com>
Cc: emacs-devel@gnu.org
Subject: Re: [PATCH] feat: add markdown-ts-mode
Date: Wed, 03 Jul 2024 16:13:52 -0300	[thread overview]
Message-ID: <87cynugufj.fsf@gmail.com> (raw)
In-Reply-To: <8734owcxe2.fsf@gmail.com> (Rahul Martim Juliato's message of "Fri, 28 Jun 2024 23:09:57 -0300")

[-- Attachment #1: Type: text/plain, Size: 527 bytes --]

Hello there!

Following up on the April thread:
https://lists.gnu.org/archive/html/emacs-devel/2024-04/msg00746.html

And the June thread:
https://lists.gnu.org/archive/html/emacs-devel/2024-06/msg01061.html

I noticed the move to the Emacs 30 branch is already underway. However,
I have not received any feedback on my patch, which has left me in the
dark about its status.

Could you please provide your insights or suggestions on the patch? Your
feedback is crucial for moving this forward.

Best regards,
Rahul M. Juliato


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-feat-add-markdown-ts-mode.patch --]
[-- Type: text/x-diff, Size: 5873 bytes --]

>From a1d071285b3ea989f8722b0b2915cf881b59b84c Mon Sep 17 00:00:00 2001
From: Rahul Martim Juliato <rahul.juliato@gmail.com>
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 | 113 +++++++++++++++++++++++++++++
 3 files changed, 119 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..49fe1baf011
--- /dev/null
+++ b/lisp/textmodes/markdown-ts-mode.el
@@ -0,0 +1,113 @@
+;;; markdown-ts-mode.el --- tree sitter support for Markdown  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2024 Free Software Foundation, Inc.
+
+;; Author     : Rahul Martim Juliato <rahul.juliato@gmail.com>
+;; Maintainer : Rahul Martim Juliato <rahul.juliato@gmail.com>
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; 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
+   '([((setext_heading) @font-lock-keyword-face)
+      ((atx_heading) @font-lock-keyword-face)
+      ((thematic_break) @shadow)
+      ((indented_code_block) @font-lock-string-face)
+      (list_item (list_marker_star) @font-lock-keyword-face)
+      (list_item (list_marker_plus) @font-lock-keyword-face)
+      (list_item (list_marker_minus) @font-lock-keyword-face)
+      (list_item (list_marker_dot) @font-lock-keyword-face)
+      (fenced_code_block (fenced_code_block_delimiter) @font-lock-doc-face)
+      (fenced_code_block (code_fence_content) @font-lock-string-face)
+      ((block_quote_marker) @font-lock-string-face)
+      (block_quote (paragraph) @font-lock-string-face)
+      (block_quote (block_quote_marker) @font-lock-string-face)
+      ])
+
+   :language 'markdown-inline
+   :feature 'paragraph-inline
+   '([
+      ((image_description) @link)
+      ((link_destination) @font-lock-string-face)
+      ((code_span) @font-lock-string-face)
+      ((emphasis) @underline)
+      ((strong_emphasis) @bold)
+      (inline_link (link_text) @link)
+      (inline_link (link_destination) @font-lock-string-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)
+					           (paragraph-inline)))
+
+  (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-inline)
+    (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


[-- Attachment #3: Type: text/plain, Size: 4537 bytes --]



> Philip Kaludercic <philipk@posteo.net> writes:
>> Rahul Martim Juliato <rahuljuliato@gmail.com> writes:
>>
>>>> So if I understand correctly, there is no keymap or any convenience
>>>> features that markdown-mode provides, because this is just the
>>>> beginning, right?  A large part of major modes for me is not just the
>>>> syntax highlighting and integration into Emacs systems, but also
>>>> bindings that in the case of Markdown would insert links or add/remove
>>>> emphasis.  I think it would be nice, if we could add these features in
>>>> the future, and re-use bindings from a package like AucTeX to build on
>>>> existing intuition (org-mode would be an alternative, but I am not a fan
>>>> or their choice of bindings).  Some commands to "compile" and preview a
>>>> document would also be nice.
>>>
>>>
>>> Hello there again!
>>>
>>> Please find attached the current version of this patch.
>>>
>>> It now works with the "official" tree-sitter grammar for markdown:
>>> https://github.com/tree-sitter-grammars/tree-sitter-markdown
>>>
>>> Please note (as explained above) the `main branch' is not the default
>>> anymore, but `split_parser' is.
>>>
>>> They splitted the parser into two, one for the body of the document and
>>> another to inline.
>>>
>>> So, in order to test this patch, configure it with:
>>>
>>> (use-package markdown-ts-mode
>>>     :ensure nil
>>>     :defer t  
>>>     :mode ("\\.md\\'" . markdown-ts-mode)
>>>     :config
>>>     (add-to-list 'treesit-language-source-alist '(markdown
>>> "https://github.com/tree-sitter-grammars/tree-sitter-markdown"
>>> "split_parser" "tree-sitter-markdown/src"))
>>>     (add-to-list 'treesit-language-source-alist '(markdown-inline
>>> "https://github.com/tree-sitter-grammars/tree-sitter-markdown"
>>> "split_parser" "tree-sitter-markdown-inline/src")))
>>
>> I have said this before, and will say it again,
>> `treesit-language-source-alist' shouldn't clone moving git repositories
>> but download tarballs (which basically every git host provides as a
>> feature, since git archive is built-in) and use those to build the
>> library.  These tarballs should be pinned in the -ts-mode.el files
>> themselves to make using these major modes more reliable.
>>
>
> This is a problem with all TS modes, isnt it? Or did I do something
> wrong on my patch?
>
>>> If you visit a markdown file treesit issues an error, as always, asking
>>> for the grammars.
>>>
>>> Then, install BOTH grammars:
>>>
>>> M-x treesit-install-language-grammar RET markdown RET
>>> M-x treesit-install-language-grammar RET markdown-inline RET
>>>
>>> Reload the `markdown-ts-mode'.
>>>
>>> And everything should be working fine :)
>>>
>>>
>>> @Philip, thanks for bringing that up! I completely agree with you;
>>> aiming for a fully-featured mode is our long-term objective.
>>>
>>> The idea here is to establish a foundation for supporting markdown files
>>> within Emacs, without relying on external packages.
>>
>> That sounds good.
>>
>>> From there, we can delve into discussions about editing and exporting
>>> features. For instance, we could consider mimicking bindings and prompts
>>> from org-mode, as well as exploring integrations if users opt to also
>>> utilize third-party markdown-mode.
>>
>> I would be interested in helping out or at the very least to comment on
>> the development going on, since I had started writing the same mode
>> myself a while back, but never got around to it since because I don't
>> understand how `treesit-font-lock-rules' works.
>>
>>> However, simply having the mode built-in reduces friction significantly
>>> for new ideas and collaborations :)
>>
>> And makes it easier for external packages to rely on the code.  Usually
>> I'd also say that it makes Emacs more usable in offline environments,
>> but the fact that the tree-sitter grammars have to for now be downloaded
>> stands in the way of that :/
>
> I agree with you Philip it is more usable in offline environments, but
> as all tree-sitter modes, they depend on those external libraries. But I
> have to say, I've been looking some distros including those libraries on
> their package repositories, so it should reduce (hopefully) some
> friction with it.
>
> ---
>
> Sorry for the long hiatus on this thread. I was actually waiting for
> more discussions but many cooler topics (and also life) got in the way :)
>
>
> I haven't made any changes on my last patch, but I am attaching it here
> to sync with this message.
>
>
> So is there anything else I could do about it?

  reply	other threads:[~2024-07-03 19:13 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-20  3:23 [PATCH] feat: add markdown-ts-mode Rahul Martim Juliato
2024-04-20  6:44 ` Eli Zaretskii
2024-04-20 17:45   ` Jostein Kjønigsen
2024-04-21  5:50     ` Rahul Martim Juliato
2024-04-22  7:02       ` Philip Kaludercic
2024-04-23  1:20         ` Rahul Martim Juliato
2024-04-27 10:18           ` Philip Kaludercic
2024-06-29  2:09             ` Rahul Martim Juliato
2024-07-03 19:13               ` Rahul Martim Juliato [this message]
2024-07-03 20:13                 ` Stefan Kangas
2024-07-04  5:17                   ` Eli Zaretskii
2024-07-04  6:23                     ` Eli Zaretskii
2024-07-04 13:19                       ` Andrea Corallo
2024-07-26  3:59                         ` Rahul Martim Juliato
2024-07-26 22:51                           ` Stefan Kangas
2024-07-04  5:08                 ` 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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87cynugufj.fsf@gmail.com \
    --to=rahuljuliato@gmail.com \
    --cc=emacs-devel@gnu.org \
    /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 external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.