emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-29 4f9bccef55: Add yaml-ts-mode (Bug#60105)


From: Yuan Fu
Subject: emacs-29 4f9bccef55: Add yaml-ts-mode (Bug#60105)
Date: Fri, 16 Dec 2022 18:03:09 -0500 (EST)

branch: emacs-29
commit 4f9bccef556d57590444e384b16d94c81e5323c9
Author: Randy Taylor <dev@rjt.dev>
Commit: Yuan Fu <casouri@gmail.com>

    Add yaml-ts-mode (Bug#60105)
    
    * 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(-)

diff --git a/admin/notes/tree-sitter/build-module/batch.sh 
b/admin/notes/tree-sitter/build-module/batch.sh
index c50b9df37e..58272c7454 100755
--- a/admin/notes/tree-sitter/build-module/batch.sh
+++ b/admin/notes/tree-sitter/build-module/batch.sh
@@ -18,6 +18,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 b6c83ea9b9..f096294028 100755
--- a/admin/notes/tree-sitter/build-module/build.sh
+++ b/admin/notes/tree-sitter/build-module/build.sh
@@ -40,6 +40,9 @@ case "${lang}" in
         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 157fe98c98..6d28bef409 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -3094,6 +3094,11 @@ the Go language.  It is auto-enabled for files with the 
".go" extension.
 A major mode based on the tree-sitter library for editing "go.mod"
 files.  It is auto-enabled for files which are named "go.mod".
 
+*** 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.
+
 
 * Incompatible Lisp Changes in Emacs 29.1
 
diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index 20534cfa1c..5b9277d73f 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -225,7 +225,7 @@ chosen (interactively or automatically)."
                                 ((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-ts-mode yaml-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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]