From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Daniel Mendler Newsgroups: gmane.emacs.devel Subject: Re: [PATCH] `completing-read`: Add `group-function` support to completion metadata (REVISED PATCH VERSION 2) Date: Sat, 8 May 2021 08:24:05 +0200 Message-ID: References: <0bbdeece-90d5-160c-07ec-2ad8edbf9872@daniel-mendler.de> <87czudm7bv.fsf@mail.linkov.net> <976056e8-3d46-db27-32c2-ddf3ca32d5a7@daniel-mendler.de> <878s5090e9.fsf@mail.linkov.net> <69fd42ed-a1a0-adcb-ac8b-caad80cb0967@daniel-mendler.de> <878s4zzpvc.fsf@mail.linkov.net> <95ac7ef3-5e8c-fc58-b316-544096c82aa0@daniel-mendler.de> <87o8dus00b.fsf@mail.linkov.net> <6718c89f-88a0-b529-1676-7e89fc152f00@daniel-mendler.de> <878s4w3law.fsf@mail.linkov.net> <87sg2ymq6j.fsf@mail.linkov.net> <78bb0663-80ef-a68f-c582-cd7cc0436c29@daniel-mendler.de> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="15539"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Gregory Heytings , Dmitry Gutov , Stefan Monnier , "emacs-devel@gnu.org" To: Juri Linkov Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sat May 08 08:29:39 2021 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 1lfGT3-0003sN-MN for ged-emacs-devel@m.gmane-mx.org; Sat, 08 May 2021 08:29:37 +0200 Original-Received: from localhost ([::1]:36232 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lfGSz-0004rJ-6x for ged-emacs-devel@m.gmane-mx.org; Sat, 08 May 2021 02:29:34 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:53920) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lfGNp-0008Ng-St for emacs-devel@gnu.org; Sat, 08 May 2021 02:24:13 -0400 Original-Received: from server.qxqx.de ([2a01:4f8:121:346::180]:55415 helo=mail.qxqx.de) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lfGNm-0002QR-J7 for emacs-devel@gnu.org; Sat, 08 May 2021 02:24:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=qxqx.de; s=mail1392553390; h=Content-Transfer-Encoding:Content-Type:In-Reply-To: MIME-Version:Date:Message-ID:References:Cc:To:From:Subject:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=wk003E1Ve9GbWKeb3fRTpdZc9wlM8QBqGFpxXEYVtNM=; b=f5adujpPozFUD1w92fgUDvZ8bt d9O/96P1QLluzI8zgdzqf9unEMiadxlqIQOl0Vxxzk/NP9twrXmef7J5P1jv8c2lj/JczUt84w7JL kzb8x5jbjhmN4JCBwh+06cVOIbxjjVZmI8Jh4CLpD0bOE/xr8oEPMAH3p6DeI8mnvjck=; In-Reply-To: <78bb0663-80ef-a68f-c582-cd7cc0436c29@daniel-mendler.de> Content-Language: en-US Received-SPF: pass client-ip=2a01:4f8:121:346::180; envelope-from=mail@daniel-mendler.de; helo=mail.qxqx.de X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_PASS=-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.23 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" Xref: news.gmane.io gmane.emacs.devel:269019 Archived-At: On 5/7/21 7:55 PM, Daniel Mendler wrote: > On 5/7/21 7:03 PM, Juri Linkov wrote: >> I tried to remove `read-char-by-name-group`, but it has a feature >> currently not supported by `group-function`: >> >> (defcustom read-char-by-name-group nil >> "How to group characters for `read-char-by-name' completion. >> When t, split characters to sections of Unicode blocks >> sorted alphabetically." >> ===================== >> >> It seems a new function is needed to sort groups, e.g. `group-sort-function`. >> >> Maybe better to push your current patches, so it would be easier >> to base the next patches on master? > > My original thoughts for a `group-function` proposal were such that the > `group-function` had the capability to sort the groups. During the > previous discussion with Stefan and Dmitry we somehow agreed that it is > better to keep things simple and to not allow the `group-function` to > sort the groups. Instead, sorting should only be provided by the > `cycle/display-sort-functions`. I should add to my last mail: Dmitry also proposed adding an additional `group-sort-function`, which allows sorting the groups, on top of the `group-function` as provided by my patches (See comment https://github.com/minad/consult/issues/283#issuecomment-825891569). I had hoped that the complication of such a function can be avoided. But if you want to have it in any case I think it is better to reconsider the whole design and in particular look at my original implementation of the group function (point 4 below). In my patches we have a single `group-function : string -> bool -> string`, where the second argument determines if the group title should be returned (nil) or the candidate should be transformed (non-nil). If we add the `group-sort-function` we have this: 1. Current patch + group-sort-function 1.1 group-function: string -> bool -> string (title/transform) 1.2 group-sort-function: list string -> list string This does not look particularly coherent to me. I would not use a single function for transformation/title and another function only for sorting. There are the following alternatives to consider, if one takes a step back: 2. Use separate functions 2.1 group-title-function : string -> string 2.2 group-transform-function : string -> string 2.3 group-sort-function : list string -> list string For 2.3, Dmitry proposed a more complicated sorting function which allows weighting the candidates. I am not in favor of that, I prefer a simpler design, see https://github.com/minad/consult/issues/283#issuecomment-825891569. 3. Use a single function with an action argument 3.1 group-function : (action=title) -> string -> string 3.2 group-function : (action=transform) -> string -> string 3.3 group-function : (action=sort) -> list string -> list string With this single action argument a minimal group-function implementation can still pass through the second argument when action/=title. 4. Use a single function with a type-based operation 4.1 group-function : string -> string (return transformed candidate) 4.2 group-function : list string -> list (list string) (return grouped candidates, group function determines the order of the groups) This was my original implementation, see https://github.com/minad/consult/issues/283#issuecomment-825749551. Daniel