From: "Marvin Gülker" <post+ebugs@guelker.eu>
To: Michael Heerdegen <michael_heerdegen@web.de>
Cc: 41706@debbugs.gnu.org
Subject: bug#41706: 26.1; sort-subr predicate cannot be set successfully
Date: Thu, 4 Jun 2020 21:05:26 +0200 [thread overview]
Message-ID: <20200604190526.GA14104@atlantis> (raw)
In-Reply-To: <87pnafxc7e.fsf@web.de>
Am 04. Juni 2020 um 14:11 Uhr +0200 schrieb Michael Heerdegen:
>I think you use it wrong: the keys are not strings but cons cells. So
>the predicate function should be something like
>`compare-buffer-substrings'.
You are correct. Your comment put me on the right track (but see below).
This version works and sorts the lines according to the locale's rules:
(defun my-sort-lines-collate (reverse beg end)
(interactive "P\nr")
(save-excursion
(save-restriction
(narrow-to-region beg end)
(goto-char (point-min))
(let ;; To make `end-of-line' and etc. to ignore fields.
((inhibit-field-text-motion t))
(sort-subr
reverse 'forward-line 'end-of-line nil nil
(lambda (a b) (string-collate-lessp (buffer-substring (car a) (cdr a)) (buffer-substring (car b) (cdr b)))))))))
I have broken it slightly different for readability. The change I did was
to use `buffer-substring' in the predicate lambda. It was not clear to me
that the arguments given to the predicate function are actually buffer
positions and not the buffer substrings themselves as I expected. This
is not explained in the manual (section § 32.15) on `sort-subr').
>To understand how ‘sort-subr’ works, consider the whole accessible
>portion of the buffer as being divided into disjoint pieces called
>“sort records”. The records may or may not be contiguous, but they
>must not overlap. A portion of each sort record (perhaps all of
>it) is designated as the sort key. [...]
>The argument PREDICATE is the function to use to compare keys. If
>keys are numbers, it defaults to ‘<’; otherwise it defaults to
>string<’.
No further mention of how to use PREDICATE is made, and the manual
continues with reproducing the source code of `sort-lines'. I took that
section to mean that the PREDICATE is in the default case `<' and
with strings `string<'. From the manual's text it became not clear to me
under which condition the keys are not strings, and I assumed they will
normally always be strings as buffer substrings are always strings.
Now I see that the documentation for the `sort-subr' function is a
little more specific, but still it doesn't really make clear which kind
of "key" is received as arguments in the PREDICATE under which
conditions. The call above appearently yields cons cell keys whose CAR
and CDR correspond to buffer positions, but the documentation makes me
suspect that calling `sort-subr' differently will yield other kinds of
keys.
I would suggest to amend the manual to be more precise about the
arguments that PREDICATE receives, and perhaps add an example.
Thank you for your explanation.
--
Blog: https://mg.guelker.eu
next prev parent reply other threads:[~2020-06-04 19:05 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-04 11:09 bug#41706: 26.1; sort-subr predicate cannot be set successfully Marvin Gülker
2020-06-04 12:11 ` Michael Heerdegen
2020-06-04 19:05 ` Marvin Gülker [this message]
2020-06-05 8:32 ` Eli Zaretskii
2020-06-05 9:43 ` Michael Heerdegen
2020-06-05 11:43 ` Eli Zaretskii
2020-06-10 18:59 ` Michael Heerdegen
2020-06-10 19:08 ` Eli Zaretskii
2020-06-11 12:55 ` Michael Heerdegen
2020-06-11 13:39 ` Eli Zaretskii
2020-06-11 13:59 ` Michael Heerdegen
2020-06-11 16:36 ` Eli Zaretskii
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200604190526.GA14104@atlantis \
--to=post+ebugs@guelker.eu \
--cc=41706@debbugs.gnu.org \
--cc=michael_heerdegen@web.de \
/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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.