]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new function 'string-pixel-width'
authorLars Ingebrigtsen <larsi@gnus.org>
Wed, 27 Oct 2021 13:41:18 +0000 (15:41 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 27 Oct 2021 13:41:32 +0000 (15:41 +0200)
* doc/lispref/display.texi (Size of Displayed Text): Mention it.
* lisp/emacs-lisp/shortdoc.el (string): Mention it.

* lisp/emacs-lisp/subr-x.el (string-pixel-width): New function.

doc/lispref/display.texi
etc/NEWS
lisp/emacs-lisp/shortdoc.el
lisp/emacs-lisp/subr-x.el
lisp/subr.el

index 92932af9ba1d08889392bb9ce35524e8bd501dbc..c9a9f7a2d584f784b145eaa9d5f52c9f763c8867 100644 (file)
@@ -2008,7 +2008,8 @@ The return value is an approximation: it only considers the values
 returned by @code{char-width} for the constituent characters, always
 takes a tab character as taking @code{tab-width} columns, ignores
 display properties and fonts, etc.  For these reasons, we recommend
-using @code{window-text-pixel-size}, described below, instead.
+using @code{window-text-pixel-size} or @code{string-pixel-width},
+described below, instead.
 @end defun
 
 @defun truncate-string-to-width string width &optional start-column padding ellipsis ellipsis-text-property
@@ -2190,6 +2191,11 @@ though when this function is run from an idle timer with a delay of zero
 seconds.
 @end defun
 
+@defun string-pixel-width string
+This is a convenience function that uses @code{window-text-pixel-size}
+to compute the width of @var{string} (in pixels).
+@end defun
+
 @defun line-pixel-height
 This function returns the height in pixels of the line at point in the
 selected window.  The value includes the line spacing of the line
index 093c8ac963251bade33da6ef9c8fb57d88f4ca1b..2106a62c8f517c696d9e4a5837fca95d7ead8d6a 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -397,6 +397,12 @@ syntax.
 This function returns t if point is on a valid image, and nil
 otherwise.
 
++++
+** New function 'string-pixel-width'.
+This returns the width of a string in pixels.  This can be useful when
+dealing with variable pitch fonts and glyphs that have widths that
+aren't integer multiples of the default font.
+
 \f
 * Changes in Emacs 29.1 on Non-Free Operating Systems
 
index 8f65437207996c5b555e010a1ae7e5ebd3b230be..817dfa6b71ec4e3b54ae9d097a91e24c2dd8385f 100644 (file)
@@ -242,7 +242,14 @@ There can be any number of :example/:result elements."
    :eval (number-to-string 42))
   "Data About Strings"
   (length
-   :eval (length "foo"))
+   :eval (length "foo")
+   :eval (length "avocado: ðŸ¥‘"))
+  (string-width
+   :eval (string-width "foo")
+   :eval (string-width "avocado: ðŸ¥‘"))
+  (string-pixel-width
+   :eval (string-pixel-width "foo")
+   :eval (string-pixel-width "avocado: ðŸ¥‘"))
   (string-search
    :eval (string-search "bar" "foobarzot"))
   (assoc-string
index 8d6bb19fd49527fff8003da1e70df824f85ec1c0..6f01209574d73bc31bc7bfd319206727c17b5478 100644 (file)
@@ -441,6 +441,25 @@ is inserted before adjusting the number of empty lines."
      ((< (- (point) start) lines)
       (insert (make-string (- lines (- (point) start)) ?\n))))))
 
+;;;###autoload
+(defun string-pixel-width (string)
+  "Return the width of STRING in pixels."
+  (with-temp-buffer
+    (insert string)
+    (save-window-excursion
+      (let ((dedicated (window-dedicated-p)))
+        ;; Avoid errors if the selected window is a dedicated one,
+        ;; and they just want to insert a document into it.
+        (unwind-protect
+            (progn
+              (when dedicated
+                (set-window-dedicated-p nil nil))
+              (set-window-buffer nil (current-buffer))
+              (car (window-text-pixel-size
+                    nil (line-beginning-position) (point))))
+          (when dedicated
+            (set-window-dedicated-p nil dedicated)))))))
+
 (provide 'subr-x)
 
 ;;; subr-x.el ends here
index 86460d9da6c3b547ab0bff714f0017b809974973..39676249cdd1310c3ce6321ce9f6b633be782818 100644 (file)
@@ -6734,5 +6734,4 @@ string will be displayed only if BODY takes longer than TIMEOUT seconds.
                                  (lambda ()
                                    ,@body)))
 
-
 ;;; subr.el ends here