unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Theodor Thornhill via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
To: Yuan Fu <casouri@gmail.com>, Mickey Petersen <mickey@masteringemacs.org>
Cc: 60654@debbugs.gnu.org
Subject: bug#60654: 30.0.50; tree-sitter: `transpose-sexps-function' uses a lambda in a defvar
Date: Mon, 09 Jan 2023 07:57:11 +0100	[thread overview]
Message-ID: <87lemctcu0.fsf@thornhill.no> (raw)
In-Reply-To: <111EEEA5-B5FC-4C45-99A9-06B4C63713A8@thornhill.no>

[-- Attachment #1: Type: text/plain, Size: 808 bytes --]

Theodor Thornhill <theo@thornhill.no> writes:

> On 9 January 2023 04:39:34 CET, Yuan Fu <casouri@gmail.com> wrote:
>>
>>Mickey Petersen <mickey@masteringemacs.org> writes:
>>
>>> The defvar `transpose-sexps-function' holds on to a lambda function.
>>> Would it be possible to make it an actual function? Its purpose is
>>> rather important as it is the default transposition function that was
>>> moved out of `transpose-sexps'. Being able to reliably access it when
>>> `transpose-sexps-function' is overriden is useful.
>>
>>CC’d Theo.
>>
>>Yuan
>
> Thanks yuan.
>
> Yeah I'll make this change and call the new function transpose-sexps-default-function.
>
> Apologies for any inconvenience :)
>
> Theo 


How about this, Mickey.  Is this something you can work with?

Theo


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-named-defun-for-transpose-sexps-default-function.patch --]
[-- Type: text/x-patch, Size: 4355 bytes --]

From 442cb4676d359faf23abb15799338f2025c797cb Mon Sep 17 00:00:00 2001
From: Theodor Thornhill <theo@thornhill.no>
Date: Mon, 9 Jan 2023 07:52:38 +0100
Subject: [PATCH] Add named defun for transpose-sexps-default-function
 (bug#60654)

* lisp/simple.el (transpose-sexps-default-function): Move the lambda
into its own function.
(transpose-sexps-function): Refer to it by name.
* etc/NEWS: Mention the change.
---
 etc/NEWS       |  4 ++++
 lisp/simple.el | 64 ++++++++++++++++++++++++++------------------------
 2 files changed, 37 insertions(+), 31 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 60dab575da6..3aa8f2abb77 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -57,6 +57,10 @@ trash when deleting.  Default is nil.
 Emacs now can set this variable to customize the behavior of the
 'transpose-sexps' function.
 
+** New function 'transpose-sexps-default-function'.
+The previous implementation is moved into its own function, to be
+bound by transpose-sexps-function'.
+
 ** New function 'treesit-transpose-sexps'.
 treesit.el now unconditionally sets 'transpose-sexps-function' for all
 Tree-sitter modes.  This functionality utilizes the new
diff --git a/lisp/simple.el b/lisp/simple.el
index 690968ca938..c8c5542caee 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -8436,37 +8436,39 @@ transpose-words
   (interactive "*p")
   (transpose-subr 'forward-word arg))
 
-(defvar transpose-sexps-function
-  (lambda (arg)
-    ;; Here we should try to simulate the behavior of
-    ;; (cons (progn (forward-sexp x) (point))
-    ;;       (progn (forward-sexp (- x)) (point)))
-    ;; Except that we don't want to rely on the second forward-sexp
-    ;; putting us back to where we want to be, since forward-sexp-function
-    ;; might do funny things like infix-precedence.
-    (if (if (> arg 0)
-	    (looking-at "\\sw\\|\\s_")
-	  (and (not (bobp))
-	       (save-excursion
-                 (forward-char -1)
-                 (looking-at "\\sw\\|\\s_"))))
-        ;; Jumping over a symbol.  We might be inside it, mind you.
-	(progn (funcall (if (> arg 0)
-			    #'skip-syntax-backward #'skip-syntax-forward)
-			"w_")
-	       (cons (save-excursion (forward-sexp arg) (point)) (point)))
-      ;; Otherwise, we're between sexps.  Take a step back before jumping
-      ;; to make sure we'll obey the same precedence no matter which
-      ;; direction we're going.
-      (funcall (if (> arg 0) #'skip-syntax-backward #'skip-syntax-forward)
-               " .")
-      (cons (save-excursion (forward-sexp arg) (point))
-	    (progn (while (or (forward-comment (if (> arg 0) 1 -1))
-			      (not (zerop (funcall (if (> arg 0)
-						       #'skip-syntax-forward
-						     #'skip-syntax-backward)
-						   ".")))))
-		   (point)))))
+(defun transpose-sexps-default-function (arg)
+  "Default method to locate a pair of points for transpose-sexps."
+  ;; Here we should try to simulate the behavior of
+  ;; (cons (progn (forward-sexp x) (point))
+  ;;       (progn (forward-sexp (- x)) (point)))
+  ;; Except that we don't want to rely on the second forward-sexp
+  ;; putting us back to where we want to be, since forward-sexp-function
+  ;; might do funny things like infix-precedence.
+  (if (if (> arg 0)
+	  (looking-at "\\sw\\|\\s_")
+	(and (not (bobp))
+	     (save-excursion
+               (forward-char -1)
+               (looking-at "\\sw\\|\\s_"))))
+      ;; Jumping over a symbol.  We might be inside it, mind you.
+      (progn (funcall (if (> arg 0)
+			  #'skip-syntax-backward #'skip-syntax-forward)
+		      "w_")
+	     (cons (save-excursion (forward-sexp arg) (point)) (point)))
+    ;; Otherwise, we're between sexps.  Take a step back before jumping
+    ;; to make sure we'll obey the same precedence no matter which
+    ;; direction we're going.
+    (funcall (if (> arg 0) #'skip-syntax-backward #'skip-syntax-forward)
+             " .")
+    (cons (save-excursion (forward-sexp arg) (point))
+	  (progn (while (or (forward-comment (if (> arg 0) 1 -1))
+			    (not (zerop (funcall (if (> arg 0)
+						     #'skip-syntax-forward
+						   #'skip-syntax-backward)
+						 ".")))))
+		 (point)))))
+
+(defvar transpose-sexps-function #'transpose-sexps-default-function
   "If non-nil, `transpose-sexps' delegates to this function.
 
 This function takes one argument ARG, a number.  Its expected
-- 
2.34.1


  reply	other threads:[~2023-01-09  6:57 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-08 10:46 bug#60654: 30.0.50; tree-sitter: `transpose-sexps-function' uses a lambda in a defvar Mickey Petersen
2023-01-09  3:39 ` Yuan Fu
2023-01-09  6:23   ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-09  6:57     ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors [this message]
2023-01-09  8:47       ` Mickey Petersen
2023-01-09 12:20         ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-01-09 20:35 ` Yuan Fu

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=87lemctcu0.fsf@thornhill.no \
    --to=bug-gnu-emacs@gnu.org \
    --cc=60654@debbugs.gnu.org \
    --cc=casouri@gmail.com \
    --cc=mickey@masteringemacs.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).