Index | Thread | Search

From:
Paco Esteban <paco@e1e0.net>
Subject:
Re: Emacs: fix issue with tree-sitter modes
To:
ports <ports@openbsd.org>
Date:
Wed, 29 Apr 2026 17:25:36 +0200

Download raw body.

Thread
Paco Esteban <paco@e1e0.net> writes:

> [...]
> Also, I'm not entirely sure about the changes 'make update-plist' made.  It
> removes some folders, but there are entries for regular files inside those
> folders, so I guess it's fine (?).

Updated diff with the PLIST change removed, as per jca@'s request.

diff --git editors/emacs/Makefile editors/emacs/Makefile
index 69d2eee9ebb..73ea617544a 100644
--- editors/emacs/Makefile
+++ editors/emacs/Makefile
@@ -2,7 +2,7 @@ COMMENT=		GNU editor: extensible, customizable, self-documenting
 
 VERSION=		30.2
 DISTNAME=		emacs-${VERSION}
-REVISION=		1
+REVISION=		2
 
 CATEGORIES=		editors
 
diff --git editors/emacs/patches/patch-src_treesit_c editors/emacs/patches/patch-src_treesit_c
index f9f4a62e640..80a04de9ea6 100644
--- editors/emacs/patches/patch-src_treesit_c
+++ editors/emacs/patches/patch-src_treesit_c
@@ -2,6 +2,12 @@ Fix linkage with treesitter-0.26.
 
 https://github.com/msys2/MINGW-packages/blob/master/mingw-w64-emacs/006-tree-sitter-0.26.patch
 
+Also:
+The tree-sitter library throws a syntax error if the
+predicate names in a query don't end with question mark
+
+https://github.com/emacs-mirror/emacs/commit/b01435306a36e4e75671fbe7bacea351f89947d5
+
 Index: src/treesit.c
 --- src/treesit.c.orig
 +++ src/treesit.c
@@ -53,6 +59,30 @@ Index: src/treesit.c
  #define ts_node_child fn_ts_node_child
  #define ts_node_child_by_field_name fn_ts_node_child_by_field_name
  #define ts_node_child_count fn_ts_node_child_count
+@@ -415,17 +431,17 @@ static Lisp_Object Vtreesit_str_dot;
+ static Lisp_Object Vtreesit_str_question_mark;
+ static Lisp_Object Vtreesit_str_star;
+ static Lisp_Object Vtreesit_str_plus;
+-static Lisp_Object Vtreesit_str_pound_equal;
+-static Lisp_Object Vtreesit_str_pound_match;
+-static Lisp_Object Vtreesit_str_pound_pred;
++static Lisp_Object Vtreesit_str_pound_eq_question_mark;
++static Lisp_Object Vtreesit_str_pound_match_question_mark;
++static Lisp_Object Vtreesit_str_pound_pred_question_mark;
+ static Lisp_Object Vtreesit_str_open_bracket;
+ static Lisp_Object Vtreesit_str_close_bracket;
+ static Lisp_Object Vtreesit_str_open_paren;
+ static Lisp_Object Vtreesit_str_close_paren;
+ static Lisp_Object Vtreesit_str_space;
+-static Lisp_Object Vtreesit_str_equal;
+-static Lisp_Object Vtreesit_str_match;
+-static Lisp_Object Vtreesit_str_pred;
++static Lisp_Object Vtreesit_str_eq_question_mark;
++static Lisp_Object Vtreesit_str_match_question_mark;
++static Lisp_Object Vtreesit_str_pred_question_mark;
+ static Lisp_Object Vtreesit_str_empty;
+ 
+ /* This is the limit on recursion levels for some tree-sitter
 @@ -632,6 +648,22 @@ treesit_load_language_push_for_each_suffix (Lisp_Objec
      }
  }
@@ -94,3 +124,146 @@ Index: src/treesit.c
        return make_fixnum((ptrdiff_t) version);
      }
  }
+@@ -2604,12 +2636,12 @@ See Info node `(elisp)Pattern Matching' for detailed e
+     return Vtreesit_str_star;
+   if (BASE_EQ (pattern, QCplus))
+     return Vtreesit_str_plus;
+-  if (BASE_EQ (pattern, QCequal))
+-    return Vtreesit_str_pound_equal;
+-  if (BASE_EQ (pattern, QCmatch))
+-    return Vtreesit_str_pound_match;
+-  if (BASE_EQ (pattern, QCpred))
+-    return Vtreesit_str_pound_pred;
++  if (BASE_EQ (pattern, QCequal) || BASE_EQ (pattern, QCeq_q))
++    return Vtreesit_str_pound_eq_question_mark;
++  if (BASE_EQ (pattern, QCmatch) || BASE_EQ (pattern, QCmatch_q))
++    return Vtreesit_str_pound_match_question_mark;
++  if (BASE_EQ (pattern, QCpred) || BASE_EQ (pattern, QCpred_q))
++    return Vtreesit_str_pound_pred_question_mark;
+   Lisp_Object opening_delimeter
+     = VECTORP (pattern)
+       ? Vtreesit_str_open_bracket : Vtreesit_str_open_paren;
+@@ -2640,7 +2672,9 @@ A PATTERN in QUERY can be
+     :*
+     :+
+     :equal
++    :eq?
+     :match
++    :match?
+     (TYPE PATTERN...)
+     [PATTERN...]
+     FIELD-NAME:
+@@ -2803,7 +2837,7 @@ treesit_predicate_equal (Lisp_Object args, struct capt
+   return !NILP (Fstring_equal (text1, text2));
+ }
+ 
+-/* Handles predicate (#match "regexp" @node).  Return true if "regexp"
++/* Handles predicate (#match? "regexp" @node).  Return true if "regexp"
+    matches the text spanned by @node; return false otherwise.
+    Matching is case-sensitive.  If everything goes fine, don't touch
+    SIGNAL_DATA; if error occurs, set it to a suitable signal data.  */
+@@ -2813,26 +2847,24 @@ treesit_predicate_match (Lisp_Object args, struct capt
+ {
+   if (list_length (args) != 2)
+     {
+-      *signal_data = list2 (build_string ("Predicate `match' requires two "
++      *signal_data = list2 (build_string ("Predicate `match?' requires two "
+ 					  "arguments but got"),
+ 			    Flength (args));
+       return false;
+     }
+-  Lisp_Object regexp = XCAR (args);
+-  Lisp_Object capture_name = XCAR (XCDR (args));
++  Lisp_Object arg1 = XCAR (args);
++  Lisp_Object arg2 = XCAR (XCDR (args));
++  Lisp_Object regexp = SYMBOLP (arg2) ? arg1 : arg2;
++  Lisp_Object capture_name = SYMBOLP (arg2) ? arg2 : arg1;
+ 
+-  /* It's probably common to get the argument order backwards.  Catch
+-     this mistake early and show helpful explanation, because Emacs
+-     loves you.  (We put the regexp first because that's what
+-     string-match does.)  */
+-  if (!STRINGP (regexp))
+-    xsignal1 (Qtreesit_query_error,
+-	      build_string ("The first argument to `match' should "
+-		            "be a regexp string, not a capture name"));
+-  if (!SYMBOLP (capture_name))
+-    xsignal1 (Qtreesit_query_error,
+-	      build_string ("The second argument to `match' should "
+-		            "be a capture name, not a string"));
++  if (!STRINGP (regexp) || !SYMBOLP (capture_name))
++    {
++      *signal_data = list2 (build_string ("Predicate `match?' takes a regexp "
++	                                  "and a node capture (order doesn't "
++					  "matter), but got"),
++			    Flength (args));
++      return false;
++    }
+ 
+   Lisp_Object node = Qnil;
+   if (!treesit_predicate_capture_name_to_node (capture_name, captures, &node,
+@@ -2916,11 +2948,11 @@ treesit_eval_predicates (struct capture_range captures
+       Lisp_Object predicate = XCAR (tail);
+       Lisp_Object fn = XCAR (predicate);
+       Lisp_Object args = XCDR (predicate);
+-      if (!NILP (Fstring_equal (fn, Vtreesit_str_equal)))
++      if (!NILP (Fstring_equal (fn, Vtreesit_str_eq_question_mark)))
+ 	pass &= treesit_predicate_equal (args, captures, signal_data);
+-      else if (!NILP (Fstring_equal (fn, Vtreesit_str_match)))
++      else if (!NILP (Fstring_equal (fn, Vtreesit_str_match_question_mark)))
+ 	pass &= treesit_predicate_match (args, captures, signal_data);
+-      else if (!NILP (Fstring_equal (fn, Vtreesit_str_pred)))
++      else if (!NILP (Fstring_equal (fn, Vtreesit_str_pred_question_mark)))
+ 	pass &= treesit_predicate_pred (args, captures, signal_data);
+       else
+ 	{
+@@ -4192,8 +4224,11 @@ syms_of_treesit (void)
+   DEFSYM (QCstar, ":*");
+   DEFSYM (QCplus, ":+");
+   DEFSYM (QCequal, ":equal");
++  DEFSYM (QCeq_q, ":eq?");
+   DEFSYM (QCmatch, ":match");
++  DEFSYM (QCmatch_q, ":match?");
+   DEFSYM (QCpred, ":pred");
++  DEFSYM (QCpred_q, ":pred?");
+ 
+   DEFSYM (Qnot_found, "not-found");
+   DEFSYM (Qsymbol_error, "symbol-error");
+@@ -4324,12 +4359,12 @@ the symbol of that THING.  For example, (or sexp sente
+   Vtreesit_str_star = build_pure_c_string ("*");
+   staticpro (&Vtreesit_str_plus);
+   Vtreesit_str_plus = build_pure_c_string ("+");
+-  staticpro (&Vtreesit_str_pound_equal);
+-  Vtreesit_str_pound_equal = build_pure_c_string ("#equal");
+-  staticpro (&Vtreesit_str_pound_match);
+-  Vtreesit_str_pound_match = build_pure_c_string ("#match");
+-  staticpro (&Vtreesit_str_pound_pred);
+-  Vtreesit_str_pound_pred = build_pure_c_string ("#pred");
++  staticpro (&Vtreesit_str_pound_eq_question_mark);
++  Vtreesit_str_pound_eq_question_mark = build_string ("#eq?");
++  staticpro (&Vtreesit_str_pound_match_question_mark);
++  Vtreesit_str_pound_match_question_mark = build_string ("#match?");
++  staticpro (&Vtreesit_str_pound_pred_question_mark);
++  Vtreesit_str_pound_pred_question_mark = build_string ("#pred?");
+   staticpro (&Vtreesit_str_open_bracket);
+   Vtreesit_str_open_bracket = build_pure_c_string ("[");
+   staticpro (&Vtreesit_str_close_bracket);
+@@ -4340,12 +4375,12 @@ the symbol of that THING.  For example, (or sexp sente
+   Vtreesit_str_close_paren = build_pure_c_string (")");
+   staticpro (&Vtreesit_str_space);
+   Vtreesit_str_space = build_pure_c_string (" ");
+-  staticpro (&Vtreesit_str_equal);
+-  Vtreesit_str_equal = build_pure_c_string ("equal");
+-  staticpro (&Vtreesit_str_match);
+-  Vtreesit_str_match = build_pure_c_string ("match");
+-  staticpro (&Vtreesit_str_pred);
+-  Vtreesit_str_pred = build_pure_c_string ("pred");
++  staticpro (&Vtreesit_str_eq_question_mark);
++  Vtreesit_str_eq_question_mark = build_string ("eq?");
++  staticpro (&Vtreesit_str_match_question_mark);
++  Vtreesit_str_match_question_mark = build_string ("match?");
++  staticpro (&Vtreesit_str_pred_question_mark);
++  Vtreesit_str_pred_question_mark = build_string ("pred?");
+   staticpro (&Vtreesit_str_empty);
+   Vtreesit_str_empty = build_pure_c_string ("");
+ 
diff --git editors/emacs/patches/patch-test_src_treesit-tests_el editors/emacs/patches/patch-test_src_treesit-tests_el
new file mode 100644
index 00000000000..17561ae9d98
--- /dev/null
+++ editors/emacs/patches/patch-test_src_treesit-tests_el
@@ -0,0 +1,22 @@
+The tree-sitter library throws a syntax error if the
+predicate names in a query don't end with question mark.
+
+https://github.com/emacs-mirror/emacs/commit/b01435306a36e4e75671fbe7bacea351f89947d5
+
+Index: test/src/treesit-tests.el
+--- test/src/treesit-tests.el.orig
++++ test/src/treesit-tests.el
+@@ -434,10 +434,10 @@ BODY is the test body."
+                ;; String query.
+                '("(string) @string
+ (pair key: (_) @keyword)
+-((_) @bob (#match \"\\\\`B.b\\\\'\" @bob))
++((_) @bob (#match? \"\\\\`B.b\\\\'\" @bob))
+ (number) @number
+-((number) @n3 (#equal \"3\" @n3))
+-((number) @n3p (#pred treesit--ert-pred-last-sibling @n3p))"
++((number) @n3 (#eq? \"3\" @n3))
++((number) @n3p (#pred? treesit--ert-pred-last-sibling @n3p))"
+                  ;; Sexp query.
+                  ((string) @string
+                   (pair key: (_) @keyword)


-- 
Paco Esteban
0x5818130B8A6DBC03