From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Constantin Kulikov Newsgroups: gmane.emacs.devel Subject: Re: [External] : Re: [PATCH] Make rectangle-select able to skip lines(empty one, for example) Date: Thu, 2 Feb 2023 21:26:05 +0300 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="000000000000adb87d05f3bbb354" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="24850"; mail-complaints-to="usenet@ciao.gmane.io" To: emacs-devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Thu Feb 02 19:27:19 2023 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pNeIp-0006Hk-HY for ged-emacs-devel@m.gmane-mx.org; Thu, 02 Feb 2023 19:27:19 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pNeI3-0007dK-L7; Thu, 02 Feb 2023 13:26:31 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pNeHz-0007ce-Kz for emacs-devel@gnu.org; Thu, 02 Feb 2023 13:26:28 -0500 Original-Received: from mail-ej1-x630.google.com ([2a00:1450:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pNeHx-0005oO-Iw for emacs-devel@gnu.org; Thu, 02 Feb 2023 13:26:27 -0500 Original-Received: by mail-ej1-x630.google.com with SMTP id ud5so8533622ejc.4 for ; Thu, 02 Feb 2023 10:26:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=krDyqKux3Q4MproLv35FsDnzXN+3DxtPuazOTI4clPo=; b=lDItuTkxAp1lxPG8SdePd0aSMI8DSEaEJq8szPR+A9eoDYO9LHZLj2kthh6Mr0+1wH SGIC/X3leQnI3OzUcwebppJDypVdrWOPwMjRVYLJYy9vYwlGMvAlBWHFkQGabwkN7IC3 z002Z2pvdTaJHt1u7wT4yKnk9K2FJKPpAP36DvdYFBZZ3PDrvtEVi1BnqNpM6a/myRA2 51XQYrAlDZ7nRyCBOV274FRWwbRa97Sce1jX92WqCtFpd1t46d8d/kOzGWeUv27vBzsC JTvMoBanMw2ApoyQx5CPlZR656WoNjY0CPeeiF7fJ4bXpdA0oOBQPjgQhtMEd34CqQ8y LXGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=krDyqKux3Q4MproLv35FsDnzXN+3DxtPuazOTI4clPo=; b=3XVLV6TTZqGfv1yR9q5ZhVZcVSO3NzGQnm/+FeaP/yF01w1KNu6pX3ZzxwdJwOIPaU hPmLdCPGtnEEnUWcySJGacsmAOT63nTZVfSQE+NlkWqbMVGNHf3ZStfNMKsGo/QgBGuC GslbfWpkqCtnyoeliTqdyCAbQsq1BY9yp8b6RwtVDYA2ys0Eo8omK2Sz0pSg4GK054Sd VT6ZjlSkdWoEMDkCWpn6mlZavmWThs0zEye7xwgnjH4XeG3jgOQ5PYYmd+q46dFIMkTo Zgw6xWyeMCKJSNQt4RetrDPjVC+REuUobMOM3gfibntl9fCHsonh03y3SN1bHUXfi65R 4wNg== X-Gm-Message-State: AO0yUKWdWsoNXnQ54gV1VdEmEIK60w43NbZnprZHthwRm9q6jPYFbVIX BUwCAuBsjQBFhS+/n5Dc0ympUXjyjGYtbz2XSZ74M4JPD20= X-Google-Smtp-Source: AK7set+pqfUr/YCLg6xJNgrh01pXvjA+ABAinI9pnOPJF1+F9ptW1NO1/yom/ZhnI5bFIfqSovWwk/hihJmU2Bk7oOA= X-Received: by 2002:a17:907:1248:b0:88a:9e08:330f with SMTP id wc8-20020a170907124800b0088a9e08330fmr1906780ejb.3.1675362382488; Thu, 02 Feb 2023 10:26:22 -0800 (PST) In-Reply-To: Received-SPF: pass client-ip=2a00:1450:4864:20::630; envelope-from=zxnotdead@gmail.com; helo=mail-ej1-x630.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:302910 Archived-At: --000000000000adb87d05f3bbb354 Content-Type: multipart/alternative; boundary="000000000000adb87c05f3bbb352" --000000000000adb87c05f3bbb352 Content-Type: text/plain; charset="UTF-8" > 1. Lose the *...* earmuffs. Elisp doesn't embrace that CL convention for defvars. I wonder, is it because Emacs had only dynamic binding? Maybe now the "*..*" can be helpful to distinguish dynamic vars from lexical. > 2. The var's doc should say what it means by "skip". Apparently it means (only) that function `apply-on-rectangle' doesn't apply its FUNCTION arg to empty lines. I think it's important to say that the var affects (only) that function's behavior. I think the application of FUNCTION is the main part of `apply-on-rectangle', so it is more or less obvious. And you can easily see the effect in GUI, when using `rectangle-mark-mode' (C-x SPC). I'm not quite sure how to name the var. *What it does:* For example you have a buffer "env.sh" with content: *"FOO=1BAR=2"* Now if you do `M-<' beginning-of-buffer `C-x SPC' rectangle-mark-mode `C-n' next-line `C-n' next-line `C-t' string-rectangle `export RET' With standard rect.el you will get: *"export FOO=1export export BAR=2"* With patched version and `rectangle-select-skip-line'(new name of var) set to `t': *"export FOO=1export BAR=2"* *New version of patch:* --- rect-orig.el 2023-01-31 17:25:08.498658466 +0300 +++ rect-patched.el 2023-02-02 20:21:11.041198925 +0300 @@ -144,11 +144,18 @@ ;;; Rectangle operations. +(defvar rectangle-select-skip-line nil + "Control the `apply-on-rectangle' execution. +`nil' -- apply action to selected lines, `t' -- skip empty lines, +`function' -- skip line if it return non-`nil'. +The function get all arguments of `apply-on-rectangle' as input.") + (defun apply-on-rectangle (function start end &rest args) "Call FUNCTION for each line of rectangle with corners at START, END. FUNCTION is called with two arguments: the start and end columns of the rectangle, plus ARGS extra arguments. Point is at the beginning of line when the function is called. +The `rectangle-select-skip-line' variable allow to skip lines. The final point after the last operation will be returned." (save-excursion (let* ((cols (rectangle--pos-cols start end)) @@ -166,7 +173,14 @@ (goto-char startpt) (while (progn - (apply function startcol endcol args) + (when (cond + ((null rectangle-select-skip-line) + t) + ((functionp rectangle-select-skip-line) + (apply rectangle-select-skip-line function start end args)) + (t + (not (string-match-p "\\`\\s-*$" (thing-at-point 'line))))) + (apply function startcol endcol args)) (setq final-point (point)) (and (zerop (forward-line 1)) (bolp) (<= (point) endpt)))) On Tue, 31 Jan 2023 at 19:18, Drew Adams wrote: > > --000000000000adb87c05f3bbb352 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
> 1. Lose the *...* earmuffs.=C2=A0 Elisp doesn= 9;t embrace that CL convention for defvars.

<= /div>
I wonder,=C2=A0is it because Emacs had only dynamic b= inding? Maybe now the "*..*" can be helpful to distinguish=C2=A0d= ynamic vars from lexical.=C2=A0

> 2. The var's doc should say= what it means by "skip".=C2=A0 Apparently it means (only) that f= unction `apply-on-rectangle' doesn't apply
its FUNCTION arg to e= mpty lines.=C2=A0 I think it's important to say that the var affects (o= nly)=C2=A0that function's behavior.

I think the=C2=A0application of FUNCTION is the main part of `apply-on-re= ctangle', so it is more or less obvious.
And you can easily= =C2=A0see the effect=C2=A0in GUI, when using `rectangle-mark-mode' (C-x= SPC).

I'm not quite sure how to n= ame the var.
=C2=A0

What it does= :

For example you have a buffer "env.sh&q= uot; with content:
"
FOO=3D1

BAR=3D2
"

=
Now if you do
`M-<'=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 beginning-of-buffer
`C-x SPC'=C2=A0 =C2=A0 =C2=A0 = rectangle-mark-mode
`C-n'=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 next-lin= e
`C-n'=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 next-line
`C-t'=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 string-rectangle
`export RET'
=

With standard rect.el you will get:
"
export FOO=3D1<= br>export
export BAR=3D2
"

With patche= d version and `rectangle-select-skip-line'(new name of var) set to `t&#= 39;:
"
export FOO=3D1

export BAR=3D2
"

=

New version of patch:

=
--- rect-orig.el 2023-01-31 17:25:08.49= 8658466 +0300
+++ rect-patched.el 2023-02-02 20:21:11.041198925 +0300@@ -144,11 +144,18 @@
=C2=A0
=C2=A0;;; Rectangle operations.
=C2= =A0
+(defvar rectangle-select-skip-line nil
+ =C2=A0"Control the= `apply-on-rectangle' execution.
+`nil' -- apply action to selec= ted lines, `t' -- skip empty lines,
+`function' -- skip line if = it return non-`nil'.
+The function get all arguments of `apply-on-re= ctangle' as input.")
+
=C2=A0(defun apply-on-rectangle (func= tion start end &rest args)
=C2=A0 =C2=A0"Call FUNCTION for each= line of rectangle with corners at START, END.
=C2=A0FUNCTION is called = with two arguments: the start and end columns of the
=C2=A0rectangle, pl= us ARGS extra arguments.=C2=A0 Point is at the beginning of line when
= =C2=A0the function is called.
+The `rectangle-select-skip-line' vari= able allow to skip lines.
=C2=A0The final point after the last operation= will be returned."
=C2=A0 =C2=A0(save-excursion
=C2=A0 =C2=A0 = =C2=A0(let* ((cols (rectangle--pos-cols start end))
@@ -166,7 +173,14 @@=
=C2=A0 =C2=A0 =C2=A0 =C2=A0(goto-char startpt)
=C2=A0 =C2=A0 =C2=A0 = =C2=A0(while
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(progn
- =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(apply function startcol endcol args)+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(when (cond
+ =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((null rectangle-select-sk= ip-line)
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0t)
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 ((functionp rectangle-select-skip-line)
+ =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(apply rectangle-select-ski= p-line function start end args))
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 (t
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(not (string-match-p "\\`\\s-*$" (= thing-at-point 'line)))))
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(apply function startcol endcol args))
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0(setq final-point (point))
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(and (zerop (forward-line 1)) (bolp)
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (<=3D (point= ) endpt))))


On = Tue, 31 Jan 2023 at 19:18, Drew Adams <drew.adams@oracle.com> wrote:

--000000000000adb87c05f3bbb352-- --000000000000adb87d05f3bbb354 Content-Type: text/plain; charset="US-ASCII"; name="rect.el.patch.txt" Content-Disposition: attachment; filename="rect.el.patch.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ldne1vkt0 LS0tIHJlY3Qtb3JpZy5lbAkyMDIzLTAxLTMxIDE3OjI1OjA4LjQ5ODY1ODQ2NiArMDMwMAorKysg cmVjdC1wYXRjaGVkLmVsCTIwMjMtMDItMDIgMjA6MjE6MTEuMDQxMTk4OTI1ICswMzAwCkBAIC0x NDQsMTEgKzE0NCwxOCBAQAogCiA7OzsgUmVjdGFuZ2xlIG9wZXJhdGlvbnMuCiAKKyhkZWZ2YXIg cmVjdGFuZ2xlLXNlbGVjdC1za2lwLWxpbmUgbmlsCisgICJDb250cm9sIHRoZSBgYXBwbHktb24t cmVjdGFuZ2xlJyBleGVjdXRpb24uCitgbmlsJyAtLSBhcHBseSBhY3Rpb24gdG8gc2VsZWN0ZWQg bGluZXMsIGB0JyAtLSBza2lwIGVtcHR5IGxpbmVzLAorYGZ1bmN0aW9uJyAtLSBza2lwIGxpbmUg aWYgaXQgcmV0dXJuIG5vbi1gbmlsJy4KK1RoZSBmdW5jdGlvbiBnZXQgYWxsIGFyZ3VtZW50cyBv ZiBgYXBwbHktb24tcmVjdGFuZ2xlJyBhcyBpbnB1dC4iKQorCiAoZGVmdW4gYXBwbHktb24tcmVj dGFuZ2xlIChmdW5jdGlvbiBzdGFydCBlbmQgJnJlc3QgYXJncykKICAgIkNhbGwgRlVOQ1RJT04g Zm9yIGVhY2ggbGluZSBvZiByZWN0YW5nbGUgd2l0aCBjb3JuZXJzIGF0IFNUQVJULCBFTkQuCiBG VU5DVElPTiBpcyBjYWxsZWQgd2l0aCB0d28gYXJndW1lbnRzOiB0aGUgc3RhcnQgYW5kIGVuZCBj b2x1bW5zIG9mIHRoZQogcmVjdGFuZ2xlLCBwbHVzIEFSR1MgZXh0cmEgYXJndW1lbnRzLiAgUG9p bnQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBsaW5lIHdoZW4KIHRoZSBmdW5jdGlvbiBpcyBjYWxs ZWQuCitUaGUgYHJlY3RhbmdsZS1zZWxlY3Qtc2tpcC1saW5lJyB2YXJpYWJsZSBhbGxvdyB0byBz a2lwIGxpbmVzLgogVGhlIGZpbmFsIHBvaW50IGFmdGVyIHRoZSBsYXN0IG9wZXJhdGlvbiB3aWxs IGJlIHJldHVybmVkLiIKICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgKGxldCogKChjb2xzIChyZWN0 YW5nbGUtLXBvcy1jb2xzIHN0YXJ0IGVuZCkpCkBAIC0xNjYsNyArMTczLDE0IEBACiAgICAgICAo Z290by1jaGFyIHN0YXJ0cHQpCiAgICAgICAod2hpbGUKICAgICAgICAgICAocHJvZ24KLSAgICAg ICAgICAgIChhcHBseSBmdW5jdGlvbiBzdGFydGNvbCBlbmRjb2wgYXJncykKKyAgICAgICAgICAg ICh3aGVuIChjb25kCisgICAgICAgICAgICAgICAgICAgKChudWxsIHJlY3RhbmdsZS1zZWxlY3Qt c2tpcC1saW5lKQorICAgICAgICAgICAgICAgICAgICB0KQorICAgICAgICAgICAgICAgICAgICgo ZnVuY3Rpb25wIHJlY3RhbmdsZS1zZWxlY3Qtc2tpcC1saW5lKQorICAgICAgICAgICAgICAgICAg ICAoYXBwbHkgcmVjdGFuZ2xlLXNlbGVjdC1za2lwLWxpbmUgZnVuY3Rpb24gc3RhcnQgZW5kIGFy Z3MpKQorICAgICAgICAgICAgICAgICAgICh0CisgICAgICAgICAgICAgICAgICAgIChub3QgKHN0 cmluZy1tYXRjaC1wICJcXGBcXHMtKiQiICh0aGluZy1hdC1wb2ludCAnbGluZSkpKSkpCisgICAg ICAgICAgICAgIChhcHBseSBmdW5jdGlvbiBzdGFydGNvbCBlbmRjb2wgYXJncykpCiAgICAgICAg ICAgICAoc2V0cSBmaW5hbC1wb2ludCAocG9pbnQpKQogICAgICAgICAgICAgKGFuZCAoemVyb3Ag KGZvcndhcmQtbGluZSAxKSkgKGJvbHApCiAgICAgICAgICAgICAgICAgICg8PSAocG9pbnQpIGVu ZHB0KSkpKQo= --000000000000adb87d05f3bbb354--