Ruijie Yu <rui...@netyu.xyz> writes: > Just had a try at this, fully untested code (other than starting a > LANG=zh_CN.UTF-8 Emacs session and running this substring function to > see its effects).
Thanks! > +(defun org-columns--substring-below-width (string start width) > + "Similar to `substring', but use `string-width' to check width. This is not really similar to `substring' as `substring' has totally different third argument. > +The returned value is a substring of STRING, starting at START, > +and is the largest possible substring whose width does not exceed > +WIDTH." > + (let ((end (min (+ start width) (length string))) res) > + (while (and end (>= end start)) > + (let* ((curr (string-width string start end)) > + (excess (- curr width))) > + (if (cl-plusp excess) Why not simply (> excess 0)? `cl-plusp' is a bit confusing - we generally avoid cl-lib functions unless necessary. (I've never seen `cl-plusp' used frequently) > (defun org-columns-add-ellipses (string width) > "Truncate STRING with WIDTH characters, with ellipses." > (cond > - ((<= (length string) width) string) > - ((<= width (length org-columns-ellipses)) > - (substring org-columns-ellipses 0 width)) > - (t (concat (substring string 0 (- width (length org-columns-ellipses))) > - org-columns-ellipses)))) > + ((<= (string-width string) width) string) > + ((<= width (string-width org-columns-ellipses)) > + (org-columns--substring-below-width org-columns-ellipses 0 width)) > + (t (concat > + (org-columns--substring-below-width > + string 0 (- width (length org-columns-ellipses))) > + org-columns-ellipses)))) It will be best to write dedicated tests here that will clearly indicate issues when some non-standard LANG environment is used. The current failure is rather difficult to debug. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92>