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: Thu, 29 Apr 2021 19:20:04 +0300 Organization: LINKOV.NET Message-ID: <87czudm7bv.fsf@mail.linkov.net> References: <0bbdeece-90d5-160c-07ec-2ad8edbf9872@daniel-mendler.de> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="29355"; 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 Thu Apr 29 19:09:13 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 1lcAA5-0007WD-PA for ged-emacs-devel@m.gmane-mx.org; Thu, 29 Apr 2021 19:09:13 +0200 Original-Received: from localhost ([::1]:36998 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lcAA4-0006yL-Sb for ged-emacs-devel@m.gmane-mx.org; Thu, 29 Apr 2021 13:09:12 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:48798) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lc9ZU-0000Q2-4Q for emacs-devel@gnu.org; Thu, 29 Apr 2021 12:31:24 -0400 Original-Received: from relay5-d.mail.gandi.net ([217.70.183.197]:53655) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lc9ZL-00082r-3P for emacs-devel@gnu.org; Thu, 29 Apr 2021 12:31:23 -0400 X-Originating-IP: 91.129.102.166 Original-Received: from mail.gandi.net (m91-129-102-166.cust.tele2.ee [91.129.102.166]) (Authenticated sender: juri@linkov.net) by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id 148741C0002; Thu, 29 Apr 2021 16:31:08 +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.183.197; envelope-from=juri@linkov.net; helo=relay5-d.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_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_FILL_THIS_FORM_SHORT=0.01 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:268621 Archived-At: --=-=-= Content-Type: text/plain > You can try the patch with the following settings and execute > `xref-find-references` for example (M-?). I tried to use your patch to implement grouping for read-char-by-name. It helped to greatly reduce the size of mule--ucs-names-group from 30 lines to just 3 lines that is a big win. OTOH, it highlighted the shortcomings of amalgamating both grouping and transforming in the same function: mule--ucs-names-group doesn't need to provide transformation, because the same affixation-function is used for both grouping and non-grouping completions. So for such cases handling an additional arg `transform` is an extra burden: --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=read-char-by-name-group-function.patch diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el index b99db46e45..cb5770bdbe 100644 --- a/lisp/international/mule-cmds.el +++ b/lisp/international/mule-cmds.el @@ -3088,35 +3088,11 @@ mule--ucs-names-affixation (list name (concat (if char (list char) " ") "\t") ""))) names)) -(defun mule--ucs-names-group (names) - (let* ((codes-and-names - (mapcar (lambda (name) (cons (gethash name ucs-names) name)) names)) - (grouped - (seq-group-by - (lambda (code-name) - (let ((script (aref char-script-table (car code-name)))) - (if script (symbol-name script) "ungrouped"))) - codes-and-names)) - names-with-header header) - (dolist (group (sort grouped (lambda (a b) (string< (car a) (car b))))) - (setq header t) - (dolist (code-name (cdr group)) - (push (list - (cdr code-name) - (concat - (if header - (progn - (setq header nil) - (concat "\n" (propertize - (format "* %s\n" (car group)) - 'face 'header-line))) - "") - ;; prefix - (if (car code-name) (format "%c" (car code-name)) " ") "\t") - ;; suffix - "") - names-with-header))) - (nreverse names-with-header))) +(defun mule--ucs-names-group (name transform) + (if transform + name + (let ((script (aref char-script-table (gethash name ucs-names)))) + (if script (symbol-name script) "ungrouped")))) (defun char-from-name (string &optional ignore-case) "Return a character as a number from its Unicode name STRING. @@ -3148,7 +3124,7 @@ read-char-by-name-sort :group 'mule :version "28.1") -(defcustom read-char-by-name-group nil +(defcustom read-char-by-name-group t "How to group characters for `read-char-by-name' completion. When t, split characters to sections of Unicode blocks sorted alphabetically." @@ -3180,6 +3156,8 @@ read-char-by-name (let* ((enable-recursive-minibuffers t) (completion-ignore-case t) (completion-tab-width 4) + (completions-group read-char-by-name-group) + (completions-format (if read-char-by-name-group 'one-column completions-format)) (input (completing-read prompt @@ -3189,10 +3167,11 @@ read-char-by-name (display-sort-function . ,(when (eq read-char-by-name-sort 'code) #'mule--ucs-names-sort-by-code)) + (group-function + . ,(when read-char-by-name-group + #'mule--ucs-names-group)) (affixation-function - . ,(if read-char-by-name-group - #'mule--ucs-names-group - #'mule--ucs-names-affixation)) + . ,#'mule--ucs-names-affixation) (category . unicode-name)) (complete-with-action action (ucs-names) string pred))))) (char --=-=-=--