From: Randy Taylor <dev@rjt.dev>
To: 60105@debbugs.gnu.org
Cc: casouri@gmail.com
Subject: bug#60105: [PATCH] Add yaml-ts-mode
Date: Thu, 15 Dec 2022 22:19:58 +0000 [thread overview]
Message-ID: <GRGdue7WG79pSYxHsUAbhTqQEUogQs5ellMAM7ccpaRJeSBC0Y53ceOeBRsaRsBmDy0AHfiajrk2eLvzm4uX6ICyZfgCJFaGMiFCT9viQks=@rjt.dev> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 31 bytes --]
X-Debbugs-CC: casouri@gmail.com
[-- Attachment #1.2: Type: text/html, Size: 606 bytes --]
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-yaml-ts-mode.patch --]
[-- Type: text/x-patch; name=0001-Add-yaml-ts-mode.patch, Size: 7915 bytes --]
From 13d3115e7217ebcc5d17a9557a4b8b0c5ae99215 Mon Sep 17 00:00:00 2001
From: Randy Taylor <dev@rjt.dev>
Date: Tue, 13 Dec 2022 09:41:01 -0500
Subject: [PATCH] Add yaml-ts-mode
* admin/notes/tree-sitter/build-module/batch.sh:
* admin/notes/tree-sitter/build-module/build.sh: Add yaml support.
* etc/NEWS: Mention it.
* lisp/textmodes/yaml-ts-mode.el: New major mode with
tree-sitter support.
* lisp/progmodes/eglot.el (eglot-server-programs): Add it.
---
admin/notes/tree-sitter/build-module/batch.sh | 1 +
admin/notes/tree-sitter/build-module/build.sh | 3 +
etc/NEWS | 5 +
lisp/progmodes/eglot.el | 2 +-
lisp/textmodes/yaml-ts-mode.el | 151 ++++++++++++++++++
5 files changed, 161 insertions(+), 1 deletion(-)
create mode 100644 lisp/textmodes/yaml-ts-mode.el
diff --git a/admin/notes/tree-sitter/build-module/batch.sh b/admin/notes/tree-sitter/build-module/batch.sh
index e7ef45cf57..40756c2203 100755
--- a/admin/notes/tree-sitter/build-module/batch.sh
+++ b/admin/notes/tree-sitter/build-module/batch.sh
@@ -17,6 +17,7 @@ languages=
'toml'
'tsx'
'typescript'
+ 'yaml'
)
for language in "${languages[@]}"
diff --git a/admin/notes/tree-sitter/build-module/build.sh b/admin/notes/tree-sitter/build-module/build.sh
index 4195ea58c3..895f5ed9e6 100755
--- a/admin/notes/tree-sitter/build-module/build.sh
+++ b/admin/notes/tree-sitter/build-module/build.sh
@@ -35,6 +35,9 @@ grammardir=
sourcedir="tree-sitter-typescript/tsx/src"
grammardir="tree-sitter-typescript/tsx"
;;
+ "yaml")
+ org="ikatyang"
+ ;;
esac
git clone "https://github.com/${org}/${repo}.git" \
diff --git a/etc/NEWS b/etc/NEWS
index 701e414fdb..8b4fb37585 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -3081,6 +3081,11 @@ A major mode based on the tree-sitter library for editing files
written in TOML, a format for writing configuration files. It is
auto-enabled for files with the ".toml" extension.
+*** New major mode 'yaml-ts-mode'.
+A major mode based on the tree-sitter library for editing files
+written in YAML. It is auto-enabled for files with the ".yaml" or
+".yml" extensions.
+
\f
* Incompatible Lisp Changes in Emacs 29.1
diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index 9c5a361df7..4319623e64 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -224,7 +224,7 @@ eglot-server-programs
((tex-mode context-mode texinfo-mode bibtex-mode)
. ,(eglot-alternatives '("digestif" "texlab")))
(erlang-mode . ("erlang_ls" "--transport" "stdio"))
- (yaml-mode . ("yaml-language-server" "--stdio"))
+ ((yaml-mode yaml-ts-mode) . ("yaml-language-server" "--stdio"))
(nix-mode . ,(eglot-alternatives '("nil" "rnix-lsp")))
(gdscript-mode . ("localhost" 6008))
((fortran-mode f90-mode) . ("fortls"))
diff --git a/lisp/textmodes/yaml-ts-mode.el b/lisp/textmodes/yaml-ts-mode.el
new file mode 100644
index 0000000000..6ef6dabb3a
--- /dev/null
+++ b/lisp/textmodes/yaml-ts-mode.el
@@ -0,0 +1,151 @@
+;;; yaml-ts-mode.el --- tree-sitter support for YAML -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Author : Randy Taylor <dev@rjt.dev>
+;; Maintainer : Randy Taylor <dev@rjt.dev>
+;; Created : December 2022
+;; Keywords : yaml 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)
+
+(declare-function treesit-parser-create "treesit.c")
+
+(defvar yaml-ts-mode--syntax-table
+ (let ((table (make-syntax-table)))
+ (modify-syntax-entry ?# "<" table)
+ (modify-syntax-entry ?\n ">" table)
+ (modify-syntax-entry ?& "." table)
+ (modify-syntax-entry ?* "." table)
+ (modify-syntax-entry ?\( "." table)
+ (modify-syntax-entry ?\) "." table)
+ (modify-syntax-entry ?\' "\"" table)
+ table)
+ "Syntax table for `yaml-ts-mode'.")
+
+(defvar yaml-ts-mode--font-lock-settings
+ (treesit-font-lock-rules
+ :language 'yaml
+ :feature 'bracket
+ '((["[" "]" "{" "}"]) @font-lock-bracket-face)
+
+ :language 'yaml
+ :feature 'comment
+ '((comment) @font-lock-comment-face)
+
+ :language 'yaml
+ :feature 'constant
+ '([(boolean_scalar)
+ (null_scalar)
+ (reserved_directive)
+ (tag_directive)
+ (yaml_directive)] @font-lock-constant-face)
+
+ :language 'yaml
+ :feature 'delimiter
+ '((["," ":" "-" ">" "?" "|"]) @font-lock-delimiter-face)
+
+ :language 'yaml
+ :feature 'misc-punctuation
+ '((["---" "..." "&" "*"]) @font-lock-misc-punctuation-face)
+
+ :language 'yaml
+ :feature 'number
+ '([(float_scalar) (integer_scalar)] @font-lock-number-face)
+
+ :language 'yaml
+ :feature 'type
+ '([(alias_name) (anchor_name) (tag)] @font-lock-type-face)
+
+ :language 'yaml
+ :feature 'string
+ :override t
+ '([(block_scalar)
+ (double_quote_scalar)
+ (single_quote_scalar)
+ (string_scalar)] @font-lock-string-face)
+
+ :language 'yaml
+ :feature 'escape-sequence
+ :override t
+ '((escape_sequence) @font-lock-escape-face)
+
+ :language 'yaml
+ :feature 'property
+ :override t
+ '((block_mapping_pair
+ key: (flow_node (plain_scalar (string_scalar) @font-lock-property-face)))
+ (block_mapping_pair
+ key: (flow_node
+ [(double_quote_scalar) (single_quote_scalar)] @font-lock-property-face))
+ (flow_mapping
+ (_ key: (flow_node (plain_scalar (string_scalar) @font-lock-property-face))))
+ (flow_mapping
+ (_ key:
+ (flow_node
+ [(double_quote_scalar) (single_quote_scalar)] @font-lock-property-face)))
+ (flow_sequence
+ (_ key: (flow_node (plain_scalar (string_scalar) @font-lock-property-face))))
+ (flow_sequence
+ (_ key:
+ (flow_node
+ [(double_quote_scalar) (single_quote_scalar)] @font-lock-property-face))))
+
+ :language 'yaml
+ :feature 'error
+ :override t
+ '((ERROR) @font-lock-warning-face))
+ "Tree-sitter font-lock settings for `yaml-ts-mode'.")
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.ya?ml\\'" . yaml-ts-mode))
+
+;;;###autoload
+(define-derived-mode yaml-ts-mode text-mode "YAML"
+ "Major mode for editing YAML, powered by tree-sitter."
+ :group 'yaml
+ :syntax-table yaml-ts-mode--syntax-table
+
+ (when (treesit-ready-p 'yaml)
+ (treesit-parser-create 'yaml)
+
+ ;; Comments.
+ (setq-local comment-start "# ")
+ (setq-local comment-end "")
+
+ ;; Indentation.
+ (setq-local indent-tabs-mode nil)
+
+ ;; Font-lock.
+ (setq-local treesit-font-lock-settings yaml-ts-mode--font-lock-settings)
+ (setq-local treesit-font-lock-feature-list
+ '((comment)
+ (string type)
+ (constant escape-sequence number property)
+ (bracket delimiter error misc-punctuation)))
+
+ (treesit-major-mode-setup)))
+
+(provide 'yaml-ts-mode)
+
+;;; yaml-ts-mode.el ends here
--
2.39.0
next reply other threads:[~2022-12-15 22:19 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-15 22:19 Randy Taylor [this message]
2022-12-16 0:20 ` bug#60105: [PATCH] Add yaml-ts-mode Stefan Kangas
2022-12-16 2:01 ` Randy Taylor
2022-12-16 22:55 ` Yuan Fu
2023-01-02 18:52 ` Juri Linkov
2023-01-02 21:58 ` Randy Taylor
2023-01-03 18:21 ` Juri Linkov
2023-01-04 23:30 ` Dmitry Gutov
2023-01-05 18:09 ` Juri Linkov
2023-01-06 1:55 ` Dmitry Gutov
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='GRGdue7WG79pSYxHsUAbhTqQEUogQs5ellMAM7ccpaRJeSBC0Y53ceOeBRsaRsBmDy0AHfiajrk2eLvzm4uX6ICyZfgCJFaGMiFCT9viQks=@rjt.dev' \
--to=dev@rjt.dev \
--cc=60105@debbugs.gnu.org \
--cc=casouri@gmail.com \
/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.