From: Theodor Thornhill via "Emacs development discussions." <emacs-devel@gnu.org>
To: Yuan Fu <casouri@gmail.com>
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 20:53:03 +0200 [thread overview]
Message-ID: <87tu4btss0.fsf@thornhill.no> (raw)
In-Reply-To: <871qrf8shm.fsf@thornhill.no>
[-- Attachment #1: Type: text/plain, Size: 225 bytes --]
Theodor Thornhill <theo@thornhill.no> writes:
> Adding in the nice utility function for jumping to stuff.
>
Also, add the cookie so that the mode actually is triggered
automatically. Apologies for missing that :)
Theo
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-TypeScript-support-with-tree-sitter.patch --]
[-- Type: text/x-diff, Size: 12721 bytes --]
From 8b375a2b02283d4b72565c977f2e8b7067e5a113 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 | 362 ++++++++++++++++++++++++++++++
2 files changed, 368 insertions(+)
create mode 100644 lisp/progmodes/typescript-mode.el
diff --git a/etc/NEWS b/etc/NEWS
index 88b1431d6a..65ff7f7c92 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2774,6 +2774,12 @@ 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. Tree-Sitter is required for this mode 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..64f23507fb
--- /dev/null
+++ b/lisp/progmodes/typescript-mode.el
@@ -0,0 +1,362 @@
+;;; 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
+
+;; This file is part of GNU Emacs.
+
+;; 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)
+(require 'rx)
+
+
+(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'.")
+
+(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)
+
+ ;; TSX
+ ((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
+ )))
+
+(defvar typescript-mode--defun-type-regexp
+ (rx (or "class_declaration"
+ "method_definition"
+ "function_declaration"
+ "lexical_declaration"))
+ "Regular expression that matches type of defun nodes.
+Used in `typescript-mode--beginning-of-defun' and friends.")
+
+(defun typescript-mode--beginning-of-defun (&optional arg)
+ "Tree-sitter `beginning-of-defun' function.
+ARG is the same as in `beginning-of-defun."
+ (let ((arg (or arg 1)))
+ (if (> arg 0)
+ ;; Go backward.
+ (while (and (> arg 0)
+ (treesit-search-forward-goto
+ typescript-mode--defun-type-regexp 'start nil t))
+ (setq arg (1- arg)))
+ ;; Go forward.
+ (while (and (< arg 0)
+ (treesit-search-forward-goto
+ typescript-mode--defun-type-regexp 'start))
+ (setq arg (1+ arg))))))
+
+(defun typescript-mode--end-of-defun (&optional arg)
+ "Tree-sitter `end-of-defun' function.
+ARG is the same as in `end-of-defun."
+ (let ((arg (or arg 1)))
+ (if (< arg 0)
+ ;; Go backward.
+ (while (and (< arg 0)
+ (treesit-search-forward-goto
+ typescript-mode--defun-type-regexp 'end nil t))
+ (setq arg (1+ arg)))
+ ;; Go forward.
+ (while (and (> arg 0)
+ (treesit-search-forward-goto
+ typescript-mode--defun-type-regexp 'end))
+ (setq arg (1- arg))))))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.tsx\\'" . typescript-mode))
+
+;;;###autoload
+(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
next prev parent reply other threads:[~2022-10-10 18:53 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
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. [this message]
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=87tu4btss0.fsf@thornhill.no \
--to=emacs-devel@gnu.org \
--cc=casouri@gmail.com \
--cc=eliz@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).