From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Juri Linkov Newsgroups: gmane.emacs.devel Subject: Re: [PATCH] `completing-read`: Add `group-function` support to completion metadata (REVISED PATCH) Date: Sun, 25 Apr 2021 23:45:48 +0300 Organization: LINKOV.NET Message-ID: <87k0oqf5z7.fsf@mail.linkov.net> References: <0bbdeece-90d5-160c-07ec-2ad8edbf9872@daniel-mendler.de> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="9980"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (x86_64-pc-linux-gnu) Cc: Gregory Heytings , Dmitry Gutov , Stefan Monnier , "emacs-devel@gnu.org" To: Daniel Mendler Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sun Apr 25 22:54:52 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 1lalmG-0002Qv-19 for ged-emacs-devel@m.gmane-mx.org; Sun, 25 Apr 2021 22:54:52 +0200 Original-Received: from localhost ([::1]:51582 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lalmF-0006Dm-36 for ged-emacs-devel@m.gmane-mx.org; Sun, 25 Apr 2021 16:54:51 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:47308) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lallN-0005NA-RL for emacs-devel@gnu.org; Sun, 25 Apr 2021 16:53:57 -0400 Original-Received: from relay12.mail.gandi.net ([217.70.178.232]:50443) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lallK-0007cu-SL for emacs-devel@gnu.org; Sun, 25 Apr 2021 16:53:57 -0400 Original-Received: from mail.gandi.net (m91-129-102-166.cust.tele2.ee [91.129.102.166]) (Authenticated sender: juri@linkov.net) by relay12.mail.gandi.net (Postfix) with ESMTPSA id AEFDD200005; Sun, 25 Apr 2021 20:53:50 +0000 (UTC) In-Reply-To: <0bbdeece-90d5-160c-07ec-2ad8edbf9872@daniel-mendler.de> (Daniel Mendler's message of "Sun, 25 Apr 2021 21:38:06 +0200") Received-SPF: pass client-ip=217.70.178.232; envelope-from=juri@linkov.net; helo=relay12.mail.gandi.net X-Spam_score_int: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, 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.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:268425 Archived-At: > You can try the patch with the following settings and execute > `xref-find-references` for example (M-?). I tried and it looks really nice. One question about performance: there are 3 calls of the same function on every completion candidate: twice it's called with the nil arg, and one call with the 'transform' arg: > +(defun minibuffer--group-by (fun elems) > + (let* ((key (funcall fun cand nil)) > @@ -1780,6 +1829,12 @@ completion--insert-strings > + (let ((title (funcall group-fun (if (consp str) (car str) str) nil))) > @@ -1825,8 +1880,15 @@ completion--insert-strings > + (funcall group-fun str 'transform) > @@ -2098,15 +2171,22 @@ minibuffer-completion-help > + (minibuffer--group-by group-fun completions))) My concern is how fast it will work on a large list of candidate strings? Would it be possible to optimize it to call the group function only once on every candidate? This might require changing the data structure, for example, to an alist like is returned by `seq-group-by`. Another variant is to put additional text properties on candidate strings, e.g. a text property on redundant prefix with the group title that completion--insert-strings then could fetch from the input string.