From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Robert Weiner Newsgroups: gmane.emacs.devel Subject: Re: Feature request: Emacs 25.0.94: count-lines should offer a way to ignore invisible lines, e.g. outline mode Date: Mon, 6 Jun 2016 19:35:47 -0400 Message-ID: References: Reply-To: rswgnu@gmail.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=001a113b72a2f5d1720534a4899b X-Trace: ger.gmane.org 1465256224 18924 80.91.229.3 (6 Jun 2016 23:37:04 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 6 Jun 2016 23:37:04 +0000 (UTC) Cc: emacs-devel To: 23675@debbugs.gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Jun 07 01:37:02 2016 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1bA44q-00058Q-Vg for ged-emacs-devel@m.gmane.org; Tue, 07 Jun 2016 01:37:01 +0200 Original-Received: from localhost ([::1]:46048 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bA44p-0003sU-Ua for ged-emacs-devel@m.gmane.org; Mon, 06 Jun 2016 19:36:59 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:56485) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bA44E-0003sD-TO for emacs-devel@gnu.org; Mon, 06 Jun 2016 19:36:24 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bA44C-0004Dr-48 for emacs-devel@gnu.org; Mon, 06 Jun 2016 19:36:22 -0400 Original-Received: from fencepost.gnu.org ([2001:4830:134:3::e]:34687) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bA44B-0004De-UV for emacs-devel@gnu.org; Mon, 06 Jun 2016 19:36:20 -0400 Original-Received: from mail-oi0-f50.google.com ([209.85.218.50]:34154) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.82) (envelope-from ) id 1bA44A-0005eV-7W for emacs-devel@gnu.org; Mon, 06 Jun 2016 19:36:18 -0400 Original-Received: by mail-oi0-f50.google.com with SMTP id e72so251109591oib.1 for ; Mon, 06 Jun 2016 16:36:18 -0700 (PDT) X-Gm-Message-State: ALyK8tKdJ7sB4KYi1cErMrpHKeHE5leWQZxfvmDjiVydwaEo4rIyZV1HbAk7P/aiRKvEw9m4o4pFRV3+0W3siQ== X-Received: by 10.202.178.197 with SMTP id b188mr8629982oif.155.1465256177413; Mon, 06 Jun 2016 16:36:17 -0700 (PDT) Original-Received: by 10.202.205.17 with HTTP; Mon, 6 Jun 2016 16:35:47 -0700 (PDT) In-Reply-To: X-Gmail-Original-Message-ID: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 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.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:204213 Archived-At: --001a113b72a2f5d1720534a4899b Content-Type: multipart/alternative; boundary=001a113b72a2f5d16c0534a48999 --001a113b72a2f5d16c0534a48999 Content-Type: text/plain; charset=UTF-8 Attached is a patch to add this feature based on 25.0.94. Please consider applying it to Emacs. I have also included the full new version of the function below. --------------------- (defun count-lines (start end &optional ignore-invisible-lines-flag) "Return number of lines between START and END. This is usually the number of newlines between them, but can be one more if START is not equal to END and the greater of them is not at the start of a line. With optional IGNORE-INVISIBLE-LINES-FLAG non-nil, lines collapsed with selective-display are excluded from the line count." (save-excursion (save-restriction (narrow-to-region start end) (goto-char (point-min)) (cond ((and (not ignore-invisible-lines-flag) (eq selective-display t)) (save-match-data (let ((done 0)) (while (re-search-forward "\n\\|\r[^\n]" nil t 40) (setq done (+ 40 done))) (while (re-search-forward "\n\\|\r[^\n]" nil t 1) (setq done (+ 1 done))) (goto-char (point-max)) (if (and (/= start end) (not (bolp))) (1+ done) done)))) (ignore-invisible-lines-flag (- (buffer-size) (forward-line (buffer-size)) (let ((invisible-count 0) prop) (goto-char (point-min)) (while (re-search-forward "\n\\|\r[^\n]" nil t) (setq prop (get-char-property (1- (point)) 'invisible)) (if (if (eq buffer-invisibility-spec t) prop (or (memq prop buffer-invisibility-spec) (assq prop buffer-invisibility-spec))) (setq invisible-count (1+ invisible-count)))) invisible-count))) (t (- (buffer-size) (forward-line (buffer-size)))))))) --------------------- On Wed, Jun 1, 2016 at 10:23 AM, Robert Weiner wrote: > > Often when particular lines are hidden, one wants to count only visible lines. count-lines presently cannot do this. XEmacs has for a long-time had count-lines take an optional 3rd parameter flag which if non-nil, ignores invisible lines in the line count. This would be very helpful whenever selective-display is in use. > --001a113b72a2f5d16c0534a48999 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Attached is a patch to add this feature based on 25.0.94.= =C2=A0 Please consider applying it to Emacs.=C2=A0 I have also included the= full new version of the function below.

---------------------
<= div>(defun count-lines (start end &optional ignore-invisible-lines-flag= )
=C2=A0 "Return number of lines between START and END.
This is usually the number of newlines between them,
but ca= n be one more if START is not equal to END
and the greater of the= m is not at the start of a line.

With optional IGN= ORE-INVISIBLE-LINES-FLAG non-nil,
lines collapsed with selective-= display are excluded
from the line count."
=C2=A0 = (save-excursion
=C2=A0 =C2=A0 (save-restriction
=C2=A0 = =C2=A0 =C2=A0 (narrow-to-region start end)
=C2=A0 =C2=A0 =C2=A0 (= goto-char (point-min))
=C2=A0 =C2=A0 =C2=A0 (cond ((and (not igno= re-invisible-lines-flag) (eq selective-display t))
=C2=A0 =C2=A0 (save-match-data
<= div> =C2=A0 =C2=A0 =C2= =A0 (let ((done 0))
= (while (re-search-forward "\n\\|\r[^\n]" nil t 40)
<= div> =C2=A0 (setq done = (+ 40 done)))
(while (re-search-forward "\n\\|\r[^\n]" nil t 1)
=C2=A0 (setq done (+ 1 do= ne)))
(goto-= char (point-max))
(if (and (/=3D start end)
=C2=A0(not (bolp)))
=C2=A0 =C2=A0 (1+ done)
=C2=A0 done))))
=C2=A0 =C2=A0(ignore-invisibl= e-lines-flag
= =C2=A0 =C2=A0 (- (buffer-size) (forward-line (buffer-size))
(let ((invisible-count 0)
=C2=A0 =C2=A0 = =C2=A0prop)
= =C2=A0(goto-char (point-min))
=C2=A0(while (re-search-forward "\n\\|\r[^\n]" = nil t)
=C2= =A0 =C2=A0(setq prop (get-char-property (1- (point)) 'invisible))
=
=C2=A0 =C2=A0(if = (if (eq buffer-invisibility-spec t)
=C2=A0 =C2=A0prop
=C2=A0(or (memq prop buffer-invisibility-sp= ec)
=C2=A0 = =C2=A0 =C2=A0(assq prop buffer-invisibility-spec)))
(setq invisible-count (1+ invisib= le-count))))
= =C2=A0invisible-count)))
=C2=A0 =C2=A0(t (- (buffer-size) (forward-line (buffer-size)))= )))))

---------------------


On Wed, Jun= 1, 2016 at 10:23 AM, Robert Weiner <rsw@= gnu.org> wrote:
>
> Often when particular lines are hidd= en, one =C2=A0wants to count only visible lines. =C2=A0count-lines presentl= y cannot do this.=C2=A0 XEmacs has for a long-time had count-lines take an = optional 3rd parameter flag which if non-nil, ignores invisible lines in th= e line count.=C2=A0 This would be very helpful whenever selective-display i= s in use.
>
--001a113b72a2f5d16c0534a48999-- --001a113b72a2f5d1720534a4899b Content-Type: text/plain; charset=US-ASCII; name="count-lines-diff.txt" Content-Disposition: attachment; filename="count-lines-diff.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ip4nmaiw0 KioqIHNpbXBsZS1vcmlnLmVsCTIwMTYtMDYtMDYgMTk6MjQ6NTAuMDAwMDAwMDAwIC0wNDAwCi0t LSBzaW1wbGUuZWwJMjAxNi0wNi0wNiAxOToyNDo1MC4wMDAwMDAwMDAgLTA0MDAKKioqKioqKioq KioqKioqCioqKiAxMjE0LDEyNDEgKioqKgogIAkgIChtZXNzYWdlICJsaW5lICVkIChuYXJyb3dl ZCBsaW5lICVkKSIKICAJCSAgICgrIG4gKGxpbmUtbnVtYmVyLWF0LXBvcyBzdGFydCkgLTEpIG4p KSkpKSkKICAKISAoZGVmdW4gY291bnQtbGluZXMgKHN0YXJ0IGVuZCkKICAgICJSZXR1cm4gbnVt YmVyIG9mIGxpbmVzIGJldHdlZW4gU1RBUlQgYW5kIEVORC4KICBUaGlzIGlzIHVzdWFsbHkgdGhl IG51bWJlciBvZiBuZXdsaW5lcyBiZXR3ZWVuIHRoZW0sCiAgYnV0IGNhbiBiZSBvbmUgbW9yZSBp ZiBTVEFSVCBpcyBub3QgZXF1YWwgdG8gRU5ECiEgYW5kIHRoZSBncmVhdGVyIG9mIHRoZW0gaXMg bm90IGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuIgogICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgIChz YXZlLXJlc3RyaWN0aW9uCiAgICAgICAgKG5hcnJvdy10by1yZWdpb24gc3RhcnQgZW5kKQogICAg ICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCiEgICAgICAgKGlmIChlcSBzZWxlY3RpdmUtZGlz cGxheSB0KQohIAkgIChzYXZlLW1hdGNoLWRhdGEKISAJICAgIChsZXQgKChkb25lIDApKQohICAg ICAgICAgICAgICAgICAgICAgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIltcblxDLW1dIiBu aWwgdCA0MCkKISAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIGRvbmUgKCsgNDAgZG9uZSkp KQohICAgICAgICAgICAgICAgICAgICAgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIltcblxD LW1dIiBuaWwgdCAxKQohICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgZG9uZSAoKyAxIGRv bmUpKSkKISAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyIChwb2ludC1tYXgpKQohICAg ICAgICAgICAgICAgICAgICAgIChpZiAoYW5kICgvPSBzdGFydCBlbmQpCiEgCQkgICAgICAgKG5v dCAoYm9scCkpKQohIAkJICAoMSsgZG9uZSkKISAJCWRvbmUpKSkKISAJKC0gKGJ1ZmZlci1zaXpl KSAoZm9yd2FyZC1saW5lIChidWZmZXItc2l6ZSkpKSkpKSkKICAKICAoZGVmdW4gbGluZS1udW1i ZXItYXQtcG9zICgmb3B0aW9uYWwgcG9zKQogICAgIlJldHVybiAobmFycm93ZWQpIGJ1ZmZlciBs aW5lIG51bWJlciBhdCBwb3NpdGlvbiBQT1MuCi0tLSAxMjE0LDEyNTggLS0tLQogIAkgIChtZXNz YWdlICJsaW5lICVkIChuYXJyb3dlZCBsaW5lICVkKSIKICAJCSAgICgrIG4gKGxpbmUtbnVtYmVy LWF0LXBvcyBzdGFydCkgLTEpIG4pKSkpKSkKICAKISAoZGVmdW4gY291bnQtbGluZXMgKHN0YXJ0 IGVuZCAmb3B0aW9uYWwgaWdub3JlLWludmlzaWJsZS1saW5lcy1mbGFnKQogICAgIlJldHVybiBu dW1iZXIgb2YgbGluZXMgYmV0d2VlbiBTVEFSVCBhbmQgRU5ELgogIFRoaXMgaXMgdXN1YWxseSB0 aGUgbnVtYmVyIG9mIG5ld2xpbmVzIGJldHdlZW4gdGhlbSwKICBidXQgY2FuIGJlIG9uZSBtb3Jl IGlmIFNUQVJUIGlzIG5vdCBlcXVhbCB0byBFTkQKISBhbmQgdGhlIGdyZWF0ZXIgb2YgdGhlbSBp cyBub3QgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KISAKISBXaXRoIG9wdGlvbmFsIElHTk9SRS1J TlZJU0lCTEUtTElORVMtRkxBRyBub24tbmlsLAohIGxpbmVzIGNvbGxhcHNlZCB3aXRoIHNlbGVj dGl2ZS1kaXNwbGF5IGFyZSBleGNsdWRlZAohIGZyb20gdGhlIGxpbmUgY291bnQuIgogICAgKHNh dmUtZXhjdXJzaW9uCiAgICAgIChzYXZlLXJlc3RyaWN0aW9uCiAgICAgICAgKG5hcnJvdy10by1y ZWdpb24gc3RhcnQgZW5kKQogICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCiEgICAgICAg KGNvbmQgKChhbmQgKG5vdCBpZ25vcmUtaW52aXNpYmxlLWxpbmVzLWZsYWcpIChlcSBzZWxlY3Rp dmUtZGlzcGxheSB0KSkKISAJICAgICAoc2F2ZS1tYXRjaC1kYXRhCiEgCSAgICAgICAobGV0ICgo ZG9uZSAwKSkKISAJCSAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJcblxcfFxyW15cbl0iIG5p bCB0IDQwKQohIAkJICAgKHNldHEgZG9uZSAoKyA0MCBkb25lKSkpCiEgCQkgKHdoaWxlIChyZS1z ZWFyY2gtZm9yd2FyZCAiXG5cXHxcclteXG5dIiBuaWwgdCAxKQohIAkJICAgKHNldHEgZG9uZSAo KyAxIGRvbmUpKSkKISAJCSAoZ290by1jaGFyIChwb2ludC1tYXgpKQohIAkJIChpZiAoYW5kICgv PSBzdGFydCBlbmQpCiEgCQkJICAobm90IChib2xwKSkpCiEgCQkgICAgICgxKyBkb25lKQohIAkJ ICAgZG9uZSkpKSkKISAJICAgIChpZ25vcmUtaW52aXNpYmxlLWxpbmVzLWZsYWcKISAJICAgICAo LSAoYnVmZmVyLXNpemUpIChmb3J3YXJkLWxpbmUgKGJ1ZmZlci1zaXplKSkKISAJCShsZXQgKChp bnZpc2libGUtY291bnQgMCkKISAJCSAgICAgIHByb3ApCiEgCQkgIChnb3RvLWNoYXIgKHBvaW50 LW1pbikpCiEgCQkgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIlxuXFx8XHJbXlxuXSIgbmls IHQpCiEgCQkgICAgKHNldHEgcHJvcCAoZ2V0LWNoYXItcHJvcGVydHkgKDEtIChwb2ludCkpICdp bnZpc2libGUpKQohIAkJICAgIChpZiAoaWYgKGVxIGJ1ZmZlci1pbnZpc2liaWxpdHktc3BlYyB0 KQohIAkJCSAgICBwcm9wCiEgCQkJICAob3IgKG1lbXEgcHJvcCBidWZmZXItaW52aXNpYmlsaXR5 LXNwZWMpCiEgCQkJICAgICAgKGFzc3EgcHJvcCBidWZmZXItaW52aXNpYmlsaXR5LXNwZWMpKSkK ISAJCQkoc2V0cSBpbnZpc2libGUtY291bnQgKDErIGludmlzaWJsZS1jb3VudCkpKSkKISAJCSAg aW52aXNpYmxlLWNvdW50KSkpCiEgCSAgICAodCAoLSAoYnVmZmVyLXNpemUpIChmb3J3YXJkLWxp bmUgKGJ1ZmZlci1zaXplKSkpKSkpKSkKICAKICAoZGVmdW4gbGluZS1udW1iZXItYXQtcG9zICgm b3B0aW9uYWwgcG9zKQogICAgIlJldHVybiAobmFycm93ZWQpIGJ1ZmZlciBsaW5lIG51bWJlciBh dCBwb3NpdGlvbiBQT1MuCg== --001a113b72a2f5d1720534a4899b--