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.bugs Subject: bug#47712: 27.1; Provide `string-display-width` function, which takes properties into account, `substring-width` Date: Tue, 13 Apr 2021 14:25:18 +0200 Message-ID: References: <642c8a37-31c7-2723-12af-06cd7f120c2f@daniel-mendler.de> <83r1jg2q72.fsf@gnu.org> <87h7kbzxwh.fsf@gnus.org> <7c96d858-7947-0cca-60fc-1f6d027bb909@daniel-mendler.de> <87k0p6sjef.fsf@gnus.org> <83wnt61jj0.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="18139"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 47712@debbugs.gnu.org To: Eli Zaretskii , Lars Ingebrigtsen Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Tue Apr 13 14:26:44 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1lWI7w-0004bZ-0Y for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 13 Apr 2021 14:26:44 +0200 Original-Received: from localhost ([::1]:36194 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lWI7u-0004Qs-Cm for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 13 Apr 2021 08:26:43 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:53494) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lWI7G-0004P8-QD for bug-gnu-emacs@gnu.org; Tue, 13 Apr 2021 08:26:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:47609) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lWI7G-00065W-0k for bug-gnu-emacs@gnu.org; Tue, 13 Apr 2021 08:26:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lWI7F-0002as-TN for bug-gnu-emacs@gnu.org; Tue, 13 Apr 2021 08:26:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Daniel Mendler Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 13 Apr 2021 12:26:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 47712 X-GNU-PR-Package: emacs Original-Received: via spool by 47712-submit@debbugs.gnu.org id=B47712.16183167309932 (code B ref 47712); Tue, 13 Apr 2021 12:26:01 +0000 Original-Received: (at 47712) by debbugs.gnu.org; 13 Apr 2021 12:25:30 +0000 Original-Received: from localhost ([127.0.0.1]:59154 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lWI6j-0002a8-RH for submit@debbugs.gnu.org; Tue, 13 Apr 2021 08:25:30 -0400 Original-Received: from server.qxqx.de ([178.63.65.180]:48549 helo=mail.qxqx.de) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lWI6g-0002Zt-ST for 47712@debbugs.gnu.org; Tue, 13 Apr 2021 08:25:28 -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:From:References:Cc:To: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=e4egiQNdlRuuQgG/T7FPV90pvAtR8EnMasE1MQQfmZ0=; b=Eq0+0ZL6xUH1RETZ4Z+rDxXRTD U8F0+NGS+bo94pF89zOIRkkYYymjT/wJ/x6cp4vz491b5W9wY5Or/q0AvV9As5TznRrJfu3FfXW7n UMovtQkzjXzn2SWfPLAxlxj67o985TEWO4LslBgFafh98AgIpCDRfTIQ9Q6g5myBuerI=; In-Reply-To: <83wnt61jj0.fsf@gnu.org> Content-Language: en-US X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:203959 Archived-At: On 4/13/21 2:00 PM, Eli Zaretskii wrote: >> From: Lars Ingebrigtsen >>> Note that I would like to have an implementation of >>> `substring-width`/`string-display-width`/`substring-display-width` >>> which does not allocate, since this reduces the GC pressure when >>> formatting many items. How do you think about this? >> >> Sure; I think a non-allocating function to count monospaced string width >> would be useful. > > I won't mount the barricades over this, but please keep in mind that > even with fixed-pitch fonts this will not always produce correct > results, because on GUI frames the "double-width" characters not > always take exactly two columns (it depends on the font). So this > function will only work reliably on text-mode (a.k.a. TTY) frames and > for Latin characters on GUI frames. > > If you still think we should have such a semi-broken function, at > least include some warning in its doc string, so that users wouldn't > be unpleasantly surprised. Yes, `string-width` is broken for face-dependent purposes. However there are still these handful of use cases which will probably not go away (org-mode table, formatting monospaced text, ...). In those existing cases the `string-width` function is often used in combination with `substring`, i.e., `(string-width (substring str beg end)`. Therefore I would be happy with the following resolution: 1. Add two arguments begin and end to `string-width` to improve the current uses of `string-width`. 2. Document the caveats of `string-width` in the docstring (works only reliable in text mode for multi-width chars) and maybe mention `window-text-pixel-size` or the `string-pixel-width` function by Martin. ---- (defun string-pixel-width (string) (let ((buffer (get-buffer-create " *string-pixel-width*")) (old-buffer (window-buffer))) (unwind-protect (with-current-buffer buffer (erase-buffer) (insert string) (set-window-buffer (selected-window) buffer) (car (window-text-pixel-size nil (point-min) (point-max)))) (set-window-buffer (selected-window) old-buffer)))) (I don't think it is needed to add the `string-pixel-width` function to the core. The function or some variant of it is easy enough for packages to include and it cannot be used in this form since it leads to these temporary buffers lying around.)