all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
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





  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.