]> git.eshelyaron.com Git - emacs.git/commitdiff
Make 'string-width' auto-composition aware
authorEli Zaretskii <eliz@gnu.org>
Wed, 26 May 2021 17:08:47 +0000 (20:08 +0300)
committerEli Zaretskii <eliz@gnu.org>
Wed, 26 May 2021 17:08:47 +0000 (20:08 +0300)
* src/composite.c (find_automatic_composition): Now extern.
(char_composable_p): Don't assume 'unicode-category-table' is
always available.
* src/composite.h (find_automatic_composition): Add prototype.
* src/character.c (lisp_string_width): Support automatic
compositions; call 'find_automatic_composition' when
'auto-composition-mode' is ON.

src/character.c
src/composite.c
src/composite.h

index 41abb83a48bcb4d28f20304196a6a051232c3bed..e0978bb39fa9a5d5e692aa9b6d69e33e58c45eef 100644 (file)
@@ -361,6 +361,23 @@ lisp_string_width (Lisp_Object string, ptrdiff_t from, ptrdiff_t to,
          chars = end - i;
          bytes = string_char_to_byte (string, end) - i_byte;
        }
+      else if (!NILP (BVAR (current_buffer, enable_multibyte_characters))
+              && ! NILP (Vauto_composition_mode)
+              && find_automatic_composition (i, -1, &ignore, &end, &val, string)
+              && end > i)
+       {
+         int j;
+         for (thiswidth = 0, j = 0; j < LGSTRING_GLYPH_LEN (val); j++)
+           {
+             Lisp_Object g = LGSTRING_GLYPH (val, j);
+
+             if (NILP (g))
+               break;
+             thiswidth += char_width (LGLYPH_CHAR (g), dp);
+           }
+         chars = end - i;
+         bytes = string_char_to_byte (string, end) - i_byte;
+       }
       else
        {
          int c;
index f1c011223b2c38c751397e47d224dbc6bb5b16e1..17d5914e6344c1100c805a7d36373e86d65de155 100644 (file)
@@ -953,8 +953,12 @@ char_composable_p (int c)
   Lisp_Object val;
   return (c >= ' '
          && (c == ZERO_WIDTH_NON_JOINER || c == ZERO_WIDTH_JOINER
-             || (val = CHAR_TABLE_REF (Vunicode_category_table, c),
-                 (FIXNUMP (val) && (XFIXNUM (val) <= UNICODE_CATEGORY_Zs)))));
+             /* unicode-category-table may not be available during
+                dumping.  */
+             || (CHAR_TABLE_P (Vunicode_category_table)
+                 && (val = CHAR_TABLE_REF (Vunicode_category_table, c),
+                     (FIXNUMP (val)
+                      && (XFIXNUM (val) <= UNICODE_CATEGORY_Zs))))));
 }
 
 /* Update cmp_it->stop_pos to the next position after CHARPOS (and
@@ -1475,7 +1479,7 @@ struct position_record
    representing the composition, and return true.  Otherwise, *GSTRING to
    Qnil, and return false.  */
 
-static bool
+bool
 find_automatic_composition (ptrdiff_t pos, ptrdiff_t limit,
                            ptrdiff_t *start, ptrdiff_t *end,
                            Lisp_Object *gstring, Lisp_Object string)
index c5d3c0faabbbde23708d48984bdb6ad8ed820d12..75e5f9b9ecb96aa05838c7084be2481d8bc031ae 100644 (file)
@@ -320,6 +320,10 @@ extern bool composition_gstring_p (Lisp_Object);
 extern int composition_gstring_width (Lisp_Object, ptrdiff_t, ptrdiff_t,
                                       struct font_metrics *);
 
+extern bool find_automatic_composition (ptrdiff_t, ptrdiff_t, ptrdiff_t *,
+                                       ptrdiff_t *, Lisp_Object *,
+                                       Lisp_Object);
+
 extern void composition_compute_stop_pos (struct composition_it *,
                                           ptrdiff_t, ptrdiff_t, ptrdiff_t,
                                           Lisp_Object);