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: Mon, 12 Apr 2021 16:05:41 +0200 Message-ID: References: <642c8a37-31c7-2723-12af-06cd7f120c2f@daniel-mendler.de> <83r1jg2q72.fsf@gnu.org> <83lf9n3d7x.fsf@gnu.org> <1c8f7066-3da2-d960-11e7-a42f567432bd@daniel-mendler.de> <83im4r3agk.fsf@gnu.org> <83czuz39jw.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="16111"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 47712@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Mon Apr 12 16:06:11 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 1lVxCd-00043S-4A for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 12 Apr 2021 16:06:11 +0200 Original-Received: from localhost ([::1]:53394 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lVxCb-0005h1-QO for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 12 Apr 2021 10:06:09 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:36500) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lVxCU-0005gR-6r for bug-gnu-emacs@gnu.org; Mon, 12 Apr 2021 10:06:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:46085) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lVxCT-0007tM-Vr for bug-gnu-emacs@gnu.org; Mon, 12 Apr 2021 10:06:01 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lVxCT-0008PM-OF for bug-gnu-emacs@gnu.org; Mon, 12 Apr 2021 10:06: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: Mon, 12 Apr 2021 14:06: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.161823635232304 (code B ref 47712); Mon, 12 Apr 2021 14:06:01 +0000 Original-Received: (at 47712) by debbugs.gnu.org; 12 Apr 2021 14:05:52 +0000 Original-Received: from localhost ([127.0.0.1]:57631 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lVxCK-0008Ox-5D for submit@debbugs.gnu.org; Mon, 12 Apr 2021 10:05:52 -0400 Original-Received: from server.qxqx.de ([178.63.65.180]:57611 helo=mail.qxqx.de) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lVxCI-0008Ok-25 for 47712@debbugs.gnu.org; Mon, 12 Apr 2021 10:05:50 -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=bBWSU3M2wVGPk5qdZApeHZsZ1WFRUQVLVcvcxsX/stk=; b=aM+m1CsFlUY64r/fKzqooLEYso XIkcJ5un+R4vhYAFxA8g5QLusVC/kad8Q47L60zCMFMbR7V1zAvx0HUHxZQW+8azp3cGr0gmUpIR5 v0nfxxHY4u5U3FIK6O0VgwlLFwc7MMcKHXnb0lQASGsAaY8kCzenJt/J47b+Fgqsx/rQ=; In-Reply-To: <83czuz39jw.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:203902 Archived-At: I gave it a quick test. See the function `string-pixel-width` below. It seems that it does not take 'invisible and 'display into account. I probably have to change something to ensure that the properties are not ignored. But for we can still look at the micro benchmark. The `string-width` function is 200 times faster than the `string-pixel-width` function. This is a huge difference, but as usual with microbenchmarks, one can argue that the difference will be less pronounced in a realistic computation. I am still not happy with replacing `string-width` with something so much slower. However `window-text-pixel-size` also gives a different, much more precise result since it takes everything into account (or at least it should, invisible and display properties included). In the uses cases I mentioned one relies on monospace faces and formatting. (defmacro bench (&rest body) (let ((start (make-symbol "t"))) `(let (,start) (setq ,start (current-time)) ,@body (float-time (time-since ,start))))) (defun string-pixel-width (string) (with-temp-buffer (insert string) (car (window-text-pixel-size nil (point-min) (point-max))))) ;; returns 56 for all of the following strings, which is wrong (string-pixel-width "1234") (string-pixel-width (propertize "1234" 'invisible t)) (string-pixel-width (propertize "1234" 'display " ")) (defvar test-string (concat "some string with " (propertize "invisible substring" 'invisible t) " and " (propertize "a displayed substring" 'display "an overwritten substring"))) ;; 5s (bench (dotimes (_ 10000) (string-pixel-width test-string))) ;; 2.5s (bench (dotimes (_ 1000000) (string-width test-string))) ;; 3.5s (bench (dotimes (_ 1000000) (consult--display-width test-string)))