unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Yuan Fu <casouri@gmail.com>
To: Theodor Thornhill <theo@thornhill.no>
Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org
Subject: Re: TypeScript support for tree-sitter (was Re: Call for volunteers: add tree-sitter support to major modes)
Date: Mon, 10 Oct 2022 10:07:07 -0700	[thread overview]
Message-ID: <C81EE705-8241-489C-B024-A71541C25E16@gmail.com> (raw)
In-Reply-To: <87bkqj8w8n.fsf@thornhill.no>



> On Oct 10, 2022, at 9:43 AM, Theodor Thornhill <theo@thornhill.no> wrote:
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
>>> From: Theodor Thornhill <theo@thornhill.no>
>>> Cc: Yuan Fu <casouri@gmail.com>
>>> Date: Mon, 10 Oct 2022 17:28:11 +0200
>>> 
>>> Here's support for TypeScript with tree-sitter.
>> 
>> Thanks, please announce in NEWS.
> 
> 
> See attached patch.  I believe this should adhere to Yuan Fu's standards
> aswell.
> 
> Thanks,
> 
> Theodor
> 
> <0001-Add-TypeScript-support-with-tree-sitter.patch>

Thanks! Some very minor comments:

From 92138c19ca09b08f7b8aff964542b2c440c7bb8e Mon Sep 17 00:00:00 2001
From: Theodor Thornhill <theo@thornhill.no>
Date: Mon, 10 Oct 2022 17:23:59 +0200
Subject: [PATCH] Add TypeScript support with tree-sitter

* lisp/progmodes/typescript-mode.el (typescript-mode): New major mode
for TypeScript with support for tree-sitter
---
 etc/NEWS                          |   6 +
 lisp/progmodes/typescript-mode.el | 320 ++++++++++++++++++++++++++++++
 2 files changed, 326 insertions(+)
 create mode 100644 lisp/progmodes/typescript-mode.el

diff --git a/etc/NEWS b/etc/NEWS
index 88b1431d6a..e1f816d4db 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2774,3 +2774,9 @@ Emacs buffers, like indentation and the like.  The new ert function
 This is a lightweight variant of 'js-mode' that is used by default
 when visiting JSON files.
 
+\f
+** New mode 'typescript-mode'.
+Support is added for TypeScript, based on the new integration with
+Tree-Sitter. There's support for font-locking, indentation and
+navigation.
+

I think we should menntion that this mode requires tree-sitter to function.

 \f
 * Incompatible Lisp Changes in Emacs 29.1
 
diff --git a/lisp/progmodes/typescript-mode.el b/lisp/progmodes/typescript-mode.el
new file mode 100644
index 0000000000..363f7d150d
--- /dev/null
+++ b/lisp/progmodes/typescript-mode.el
@@ -0,0 +1,8 @@
+;;; typescript-mode.el --- tree sitter support for Typescript  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Author     : Theodor Thornhill <theo@thornhill.no>
+;; Maintainer : Theodor Thornhill <theo@thornhill.no>
+;; Created    : April 2022
+;; Keywords   : typescript languages tree-sitter

I think we're suppose to add "This file is part of GNU Emacs" in the
header.

+
+;; This program 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.
+
+;; This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+
+(require 'treesit)
+
+
+(defcustom typescript-mode-indent-offset 2
+  "Number of spaces for each indentation step in `typescript-mode'."
+  :type 'integer
+  :safe 'integerp
+  :group 'typescript)
+
+(defvar typescript-mode--syntax-table
+  (let ((table (make-syntax-table)))
+    ;; Taken from the cc-langs version
+    (modify-syntax-entry ?_  "_"     table)
+    (modify-syntax-entry ?$ "_"      table)
+    (modify-syntax-entry ?\\ "\\"    table)
+    (modify-syntax-entry ?+  "."     table)
+    (modify-syntax-entry ?-  "."     table)
+    (modify-syntax-entry ?=  "."     table)
+    (modify-syntax-entry ?%  "."     table)
+    (modify-syntax-entry ?<  "."     table)
+    (modify-syntax-entry ?>  "."     table)
+    (modify-syntax-entry ?&  "."     table)
+    (modify-syntax-entry ?|  "."     table)
+    (modify-syntax-entry ?` "\""     table)
+    (modify-syntax-entry ?\240 "."   table)
+    table)
+  "Syntax table for `typescript-mode'.")
+

Regarding below: again, sorry for the nitpick, but could you wrap lines
to 70 columns?

+(defvar typescript-mode--indent-rules
+  `((tsx
+     ((node-is "}") parent-bol 0)
+     ((node-is ")") parent-bol 0)
+     ((node-is "]") parent-bol 0)
+     ((node-is ">") parent-bol 0)
+     ((node-is ".") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "ternary_expression") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "named_imports") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "statement_block") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "type_arguments") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "variable_declarator") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "arguments") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "array") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "formal_parameters") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "template_substitution") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "object_pattern") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "object") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "object_type") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "enum_body") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "arrow_function") parent-bol ,typescript-mode-indent-offset)
+     ((parent-is "parenthesized_expression") parent-bol ,typescript-mode-indent-offset)
+
+     ;; JSX
+     ((parent-is "jsx_opening_element") parent ,typescript-mode-indent-offset)
+     ((node-is "jsx_closing_element") parent 0)
+     ((parent-is "jsx_element") parent ,typescript-mode-indent-offset)
+     ((node-is "/") parent 0)
+     ((parent-is "jsx_self_closing_element") parent ,typescript-mode-indent-offset)
+     (no-node parent-bol 0))))
+
+(defvar typescript-mode--settings
+  (treesit-font-lock-rules
+   :language 'tsx
+   :override t
+   '(
+     (template_string) @font-lock-string-face
+
+     ((identifier) @font-lock-constant-face
+      (:match "^[A-Z_][A-Z_\\d]*$" @font-lock-constant-face))
+
+     (nested_type_identifier module: (identifier) @font-lock-type-face)
+     (type_identifier) @font-lock-type-face
+     (predefined_type) @font-lock-type-face
+
+     (new_expression
+      constructor: (identifier) @font-lock-type-face)
+
+     (function
+      name: (identifier) @font-lock-function-name-face)
+
+     (function_declaration
+      name: (identifier) @font-lock-function-name-face)
+
+     (method_definition
+      name: (property_identifier) @font-lock-function-name-face)
+
+     (variable_declarator
+      name: (identifier) @font-lock-function-name-face
+      value: [(function) (arrow_function)])
+
+     (variable_declarator
+      name: (array_pattern
+             (identifier)
+             (identifier) @font-lock-function-name-face)
+      value: (array (number) (function)))
+
+     (assignment_expression
+      left: [(identifier) @font-lock-function-name-face
+             (member_expression
+              property: (property_identifier) @font-lock-function-name-face)]
+      right: [(function) (arrow_function)])
+
+     (call_expression
+      function:
+      [(identifier) @font-lock-function-name-face
+       (member_expression
+        property: (property_identifier) @font-lock-function-name-face)])
+
+     (variable_declarator
+      name: (identifier) @font-lock-variable-name-face)
+
+     (enum_declaration (identifier) @font-lock-type-face)
+
+     (enum_body (property_identifier) @font-lock-type-face)
+
+     (enum_assignment name: (property_identifier) @font-lock-type-face)
+
+     (assignment_expression
+      left: [(identifier) @font-lock-variable-name-face
+             (member_expression
+              property: (property_identifier) @font-lock-variable-name-face)])
+
+     (for_in_statement
+      left: (identifier) @font-lock-variable-name-face)
+
+     (arrow_function
+      parameter: (identifier) @font-lock-variable-name-face)
+
+     (arrow_function
+      parameters: [(_ (identifier) @font-lock-variable-name-face)
+                   (_ (_ (identifier) @font-lock-variable-name-face))
+                   (_ (_ (_ (identifier) @font-lock-variable-name-face)))])
+
+
+     (pair key: (property_identifier) @font-lock-variable-name-face)
+
+     (pair value: (identifier) @font-lock-variable-name-face)
+
+     (pair
+      key: (property_identifier) @font-lock-function-name-face
+      value: [(function) (arrow_function)])
+
+     (property_signature
+      name: (property_identifier) @font-lock-variable-name-face)
+
+     ((shorthand_property_identifier) @font-lock-variable-name-face)
+
+     (pair_pattern key: (property_identifier) @font-lock-variable-name-face)
+
+     ((shorthand_property_identifier_pattern) @font-lock-variable-name-face)
+
+     (array_pattern (identifier) @font-lock-variable-name-face)
+
+     (jsx_opening_element
+      [(nested_identifier (identifier)) (identifier)]
+      @font-lock-function-name-face)
+
+     (jsx_closing_element
+      [(nested_identifier (identifier)) (identifier)]
+      @font-lock-function-name-face)
+
+     (jsx_self_closing_element
+      [(nested_identifier (identifier)) (identifier)]
+      @font-lock-function-name-face)
+
+     (jsx_attribute (property_identifier) @font-lock-constant-face)
+
+     [(this) (super)] @font-lock-keyword-face
+
+     [(true) (false) (null)] @font-lock-constant-face
+     (regex pattern: (regex_pattern)) @font-lock-string-face
+     (number) @font-lock-constant-face
+
+     (string) @font-lock-string-face
+     (template_string) @font-lock-string-face
+
+     (template_substitution
+      ["${" "}"] @font-lock-constant-face)
+
+     ["!"
+      "abstract"
+      "as"
+      "async"
+      "await"
+      "break"
+      "case"
+      "catch"
+      "class"
+      "const"
+      "continue"
+      "debugger"
+      "declare"
+      "default"
+      "delete"
+      "do"
+      "else"
+      "enum"
+      "export"
+      "extends"
+      "finally"
+      "for"
+      "from"
+      "function"
+      "get"
+      "if"
+      "implements"
+      "import"
+      "in"
+      "instanceof"
+      "interface"
+      "keyof"
+      "let"
+      "namespace"
+      "new"
+      "of"
+      "private"
+      "protected"
+      "public"
+      "readonly"
+      "return"
+      "set"
+      "static"
+      "switch"
+      "target"
+      "throw"
+      "try"
+      "type"
+      "typeof"
+      "var"
+      "void"
+      "while"
+      "with"
+      "yield"
+      ] @font-lock-keyword-face
+
+     (comment) @font-lock-comment-face
+     )))
+
+(defun typescript-mode--move-to-node (fn)
+  (when-let ((found-node
+              (treesit-parent-until
+               (treesit-node-at (point))
+               (lambda (parent)
+                 (treesit-query-capture
+                  parent
+                  typescript-mode--defun-query)))))
+    (goto-char (funcall fn found-node))))
+
+(defun typescript-mode--beginning-of-defun (&optional _arg)
+  (typescript-mode--move-to-node #'treesit-node-start))
+
+(defun typescript-mode--end-of-defun (&optional _arg)
+  (typescript-mode--move-to-node #'treesit-node-end))
+
+(defvar typescript-mode--defun-query
+  (treesit-query-compile
+   'tsx
+   "[(import_statement)
+    (function_declaration)
+    (type_alias_declaration)
+    (interface_declaration)
+    (lexical_declaration)] @defun"))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.tsx\\'" . typescript-mode))
+
+(define-derived-mode typescript-mode prog-mode "TypeScript"
+  "Major mode for editing typescript."
+  :group 'typescript
+  :syntax-table typescript-mode--syntax-table
+
+  (unless (or (treesit-can-enable-p)
+              (treesit-language-available-p 'tsx))
+    (error "Tree sitter for TypeScript isn't available."))
+
+  ;; Comments
+  (setq-local comment-start "// ")
+  (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
+  (setq-local comment-end "")
+
+  (setq-local treesit-simple-indent-rules typescript-mode--indent-rules)
+  (setq-local indent-line-function #'treesit-indent)
+
+  (setq-local beginning-of-defun-function #'typescript-mode--beginning-of-defun)
+  (setq-local end-of-defun-function #'typescript-mode--end-of-defun)
+
+  (unless font-lock-defaults
+    (setq font-lock-defaults '(nil t)))
+
+  (setq-local treesit-font-lock-settings typescript-mode--settings)
+
+  (treesit-font-lock-enable))
+
+(provide 'typescript-mode)
+
+;;; typescript-mode.el ends here
-- 
2.34.1





  reply	other threads:[~2022-10-10 17:07 UTC|newest]

Thread overview: 191+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-09  9:03 Call for volunteers: add tree-sitter support to major modes Eli Zaretskii
2022-10-09  9:47 ` Theodor Thornhill
2022-10-09 12:21   ` Eli Zaretskii
2022-10-09 12:41     ` Theodor Thornhill
2022-10-09 14:04       ` Eli Zaretskii
2022-10-09 15:18         ` Theodor Thornhill
2022-10-09 15:36           ` Eli Zaretskii
2022-10-09 19:25             ` Theodor Thornhill
2022-10-09 21:21               ` Theodor Thornhill
2022-10-09 22:03                 ` Emanuel Berg
2022-10-10  6:35                   ` Theodor Thornhill
2022-10-09 22:39                 ` Yuan Fu
2022-10-10  4:05                   ` Yuan Fu
2022-10-10  6:28                     ` Eli Zaretskii
2022-10-10  6:35                       ` Theodor Thornhill
2022-10-10  8:11                         ` Eli Zaretskii
2022-10-10  6:46                       ` Yuan Fu
2022-10-10  8:16                         ` Eli Zaretskii
2022-10-10  7:08                   ` Theodor Thornhill
2022-10-10 15:48                     ` Yuan Fu
2022-10-10 16:29                       ` Theodor Thornhill
2022-10-10 17:16                         ` Yuan Fu
2022-10-10 17:53                           ` Yuan Fu
2022-10-10 18:04                             ` Theodor Thornhill
2022-10-11  6:53                     ` Jostein Kjønigsen
2022-10-11  7:16                       ` Theodor Thornhill
2022-10-09 14:08       ` Dmitry Gutov
2022-10-09 12:26 ` Philip Kaludercic
2022-10-09 12:27   ` Po Lu
2022-10-09 13:27     ` Eli Zaretskii
2022-10-09 14:01       ` Po Lu
2022-10-09 14:07         ` Eli Zaretskii
2022-10-09 13:25   ` Eli Zaretskii
2022-10-10  6:39     ` Turing on tree-sitter (was: Call for volunteers: add tree-sitter support to major modes) Eli Zaretskii
2022-10-10  6:46       ` Theodor Thornhill
2022-10-10  6:54         ` Yuan Fu
2022-10-10  7:26           ` Turing on tree-sitter Philip Kaludercic
2022-10-10  8:22             ` Eli Zaretskii
2022-10-10 14:52               ` Stefan Monnier
2022-10-10 15:29                 ` Daniel Martín
2022-10-10 16:04                 ` Eli Zaretskii
2022-10-10 16:06                 ` Yuan Fu
2022-10-10 16:24                   ` Philip Kaludercic
2022-10-10 16:54                     ` Yuan Fu
2022-10-10 17:05                       ` Theodor Thornhill
2022-10-10 20:56                         ` Buliding with tree-sitter (Was: Turing on tree-sitter) Jostein Kjønigsen
2022-10-10 21:34                           ` Jostein Kjønigsen
2022-10-10 22:54                       ` Turing on tree-sitter Daniel Martín
2022-10-10  8:19           ` Turing on tree-sitter (was: Call for volunteers: add tree-sitter support to major modes) Eli Zaretskii
2022-10-10  8:18         ` Eli Zaretskii
2022-10-10  6:59       ` Turing on tree-sitter Lars Ingebrigtsen
2022-10-09 14:36 ` Call for volunteers: add tree-sitter support to major modes Brian
2022-10-09 14:53   ` Eli Zaretskii
2022-10-09 15:20     ` Brian
2022-10-09 15:39       ` Eli Zaretskii
2022-10-09 16:03         ` Brian
2022-10-09 17:23           ` Eli Zaretskii
2022-10-09 23:45           ` Yuan Fu
2022-10-10  9:34             ` Brian
2022-10-10 10:10               ` Po Lu
2022-10-10 10:27                 ` Brian
2022-10-10 15:53               ` Yuan Fu
2022-10-10  3:04       ` Stefan Monnier
2022-10-10  6:25         ` Eli Zaretskii
2022-10-10  9:23           ` Brian
2022-10-09 20:01 ` Theodor Thornhill
2022-10-09 20:54   ` Stefan Kangas
2022-10-09 21:12     ` Theodor Thornhill
2022-10-10  0:01   ` Yuan Fu
2022-10-10 19:44     ` Alan Mackenzie
2022-10-10 20:54       ` Yuan Fu
2022-10-17 17:59       ` Eli Zaretskii
2022-10-17 18:47         ` Alan Mackenzie
2022-10-17 22:04           ` Stefan Monnier
2022-10-18 13:47             ` Ketevan Lomidze
2022-10-18  3:24           ` Po Lu
2022-10-18  4:42             ` Yuan Fu
2022-10-18  6:35               ` Po Lu
2022-10-18  9:45                 ` Eli Zaretskii
2022-10-18 10:36                   ` Po Lu
2022-10-18 14:52                     ` Eli Zaretskii
2022-10-20  0:19                       ` Po Lu
2022-10-20  1:15                         ` Stefan Monnier
2022-10-20  6:16                           ` Eli Zaretskii
2022-10-21 19:19                           ` Jostein Kjønigsen
2022-10-20  6:12                         ` Eli Zaretskii
2022-10-18 13:53             ` Stefan Monnier
2022-10-19  8:03             ` Jostein Kjønigsen
2022-10-10  5:55   ` Eli Zaretskii
2022-10-10  6:44     ` Theodor Thornhill
2022-10-10  8:15       ` Eli Zaretskii
2022-10-10  9:04         ` Theodor Thornhill
2022-10-10  9:10           ` Eli Zaretskii
2022-10-10  9:20             ` Theodor Thornhill
2022-10-10  9:39               ` Eli Zaretskii
2022-10-10  9:44                 ` Theodor Thornhill
2022-10-11 21:38           ` Stefan Monnier
2022-10-11 21:45             ` Theodor Thornhill
2022-10-11  0:34         ` Lars Ingebrigtsen
2022-10-11  6:30           ` Eli Zaretskii
2022-10-11  6:41             ` Theodor Thornhill
2022-10-11  6:51               ` Eli Zaretskii
2022-10-11  7:23                 ` Theodor Thornhill
2022-10-11  7:36                   ` Eli Zaretskii
2022-10-11  7:41                     ` Theodor Thornhill
2022-10-11  8:15                     ` Jostein Kjønigsen
2022-10-11  9:54                       ` Stefan Kangas
2022-10-11  9:58                         ` Theodor Thornhill
2022-10-11  6:58               ` Jostein Kjønigsen
2022-10-11  7:13                 ` Theodor Thornhill
2022-10-11 18:31                   ` Lars Ingebrigtsen
2022-10-11 18:43                     ` Theodor Thornhill
2022-10-11 18:54                       ` Lars Ingebrigtsen
2022-10-11 18:57                         ` Theodor Thornhill
2022-10-11 19:01                         ` Theodor Thornhill
2022-10-11 19:30                           ` Lars Ingebrigtsen
2022-10-11 20:36                             ` Theodor Thornhill
2022-10-11 20:49                               ` Lars Ingebrigtsen
2022-10-11 21:01                                 ` Theodor Thornhill
2022-10-11 21:44                             ` Stefan Monnier
2022-10-12 10:58                               ` Lars Ingebrigtsen
2022-10-11 19:20                     ` Philip Kaludercic
2022-10-11 19:28                       ` Theodor Thornhill
2022-10-11  4:43       ` Po Lu
2022-10-11  5:14         ` Yuan Fu
2022-10-11  5:33           ` Theodor Thornhill
2022-10-11  6:45             ` Eli Zaretskii
2022-10-11  6:50               ` Theodor Thornhill
2022-10-11  5:47           ` Po Lu
2022-10-11  7:18             ` Eli Zaretskii
2022-10-11  7:50               ` Po Lu
2022-10-11  8:06                 ` Eli Zaretskii
2022-10-11  8:23                   ` Po Lu
2022-10-11  8:40                     ` Eli Zaretskii
2022-10-11  8:51                       ` Po Lu
2022-10-11 10:09                     ` Stefan Kangas
2022-10-11 12:49                   ` Visuwesh
2022-10-11 16:56                     ` Daniel Martín
2022-10-11 18:18                       ` Yuan Fu
2022-10-11  7:13           ` Eli Zaretskii
2022-10-11  7:35             ` Po Lu
2022-10-11  7:47               ` Theodor Thornhill
2022-10-11  8:17                 ` Po Lu
2022-10-11  8:40                   ` Theodor Thornhill
2022-10-11 10:46                     ` Po Lu
2022-10-11  8:51             ` Yuan Fu
2022-10-11  7:10         ` Eli Zaretskii
2022-10-11  7:31           ` Po Lu
2022-10-11  7:56             ` Eli Zaretskii
2022-10-11  8:15               ` Po Lu
2022-10-11  8:34                 ` Eli Zaretskii
2022-10-11  8:47                   ` Po Lu
2022-10-11 10:17                     ` Daniel Martín
2022-10-11  8:43             ` Jostein Kjønigsen
2022-10-11 16:01             ` Dmitry Gutov
2022-10-11 21:14         ` Stefan Monnier
2022-10-11 21:49           ` Lars Ingebrigtsen
2022-10-11 22:00             ` Stefan Monnier
2022-10-11 22:49               ` Lars Ingebrigtsen
2022-10-12  0:41                 ` Po Lu
2022-10-12  9:51                   ` Stefan Kangas
2022-10-12 10:47                     ` Po Lu
2022-10-12  5:30               ` Eli Zaretskii
2022-10-12  0:26           ` Po Lu
2022-10-12  3:31             ` João Paulo Labegalini de Carvalho
2022-10-12  4:27               ` Po Lu
2022-10-12  9:51                 ` Stefan Kangas
2022-10-12 10:48                   ` Po Lu
2022-10-11 21:29       ` Stefan Monnier
2022-10-10  7:34   ` Roman Rudakov
2022-10-10  7:48     ` Theodor Thornhill
2022-10-10  7:53       ` Roman Rudakov
2022-10-10  9:04         ` Theodor Thornhill
2022-10-11 20:44       ` Roman Rudakov
2022-10-11 21:00         ` Theodor Thornhill
2022-10-11 21:52         ` Stefan Monnier
2022-10-10 15:28 ` TypeScript support for tree-sitter (was Re: Call for volunteers: add tree-sitter support to major modes) Theodor Thornhill
2022-10-10 16:13   ` Eli Zaretskii
2022-10-10 16:43     ` Theodor Thornhill via Emacs development discussions.
2022-10-10 17:07       ` Yuan Fu [this message]
2022-10-10 17:48         ` Theodor Thornhill via Emacs development discussions.
2022-10-10 18:04           ` Theodor Thornhill via Emacs development discussions.
2022-10-10 18:53             ` Theodor Thornhill via Emacs development discussions.
2022-10-11 20:07               ` Theodor Thornhill via Emacs development discussions.
2022-10-11 20:22                 ` Theodor Thornhill via Emacs development discussions.
2022-10-12  6:51                   ` Yuan Fu
2022-10-12  7:11                     ` Theodor Thornhill
2022-10-11  8:25         ` Po Lu
2022-10-11  8:42           ` Theodor Thornhill
2022-10-11 13:26       ` Stefan Monnier
2022-10-11 13:48         ` Theodor Thornhill

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=C81EE705-8241-489C-B024-A71541C25E16@gmail.com \
    --to=casouri@gmail.com \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=theo@thornhill.no \
    /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).