module

Tui::Unicode

Constants

EMOJI_WIDE = [{9728, 10175}]

Emoji-like symbols that many terminals render as wide even when wcwidth reports 1. This avoids right-edge overflow in modern terminals (iTerm2, kitty, wezterm).

WIDE_CHARS = [{4352, 4447}, {8986, 8987}, {9001, 9002}, {9193, 9203}, {9208, 9210}, {9725, 9726}, {10548, 10549}, {11013, 11015}, {11035, 11036}, {11088, 11088}, {11093, 11093}, {11904, 11929}, {11931, 12019}, {12032, 12245}, {12272, 12287}, {12288, 12350}, {12353, 12438}, {12443, 12543}, {12549, 12591}, {12593, 12686}, {12688, 12771}, {12784, 12830}, {12832, 12871}, {12880, 19903}, {19968, 42124}, {42128, 42182}, {43360, 43388}, {44032, 55203}, {63744, 64255}, {65040, 65049}, {65072, 65106}, {65108, 65126}, {65128, 65131}, {65281, 65376}, {65504, 65510}, {94176, 94180}, {94192, 94193}, {94208, 100343}, {100352, 101589}, {101632, 101640}, {110576, 110579}, {110581, 110587}, {110589, 110590}, {110592, 110882}, {110898, 110898}, {110928, 110930}, {110933, 110933}, {110948, 110951}, {110960, 111355}, {126980, 126980}, {127183, 127183}, {127374, 127374}, {127377, 127386}, {127462, 127487}, {127488, 127490}, {127504, 127547}, {127552, 127560}, {127568, 127569}, {127584, 127589}, {127744, 127776}, {127789, 127797}, {127799, 127868}, {127870, 127891}, {127904, 127946}, {127951, 127955}, {127968, 127984}, {127988, 127988}, {127992, 128062}, {128064, 128064}, {128066, 128252}, {128255, 128317}, {128331, 128334}, {128336, 128359}, {128378, 128378}, {128405, 128406}, {128420, 128420}, {128507, 128591}, {128640, 128709}, {128716, 128716}, {128720, 128722}, {128725, 128727}, {128732, 128735}, {128736, 128746}, {128747, 128748}, {128756, 128764}, {128992, 129003}, {129008, 129008}, {129292, 129338}, {129340, 129349}, {129351, 129535}, {129536, 129619}, {129632, 129645}, {129648, 129660}, {129664, 129672}, {129680, 129725}, {129727, 129733}, {129742, 129755}, {129760, 129768}, {129776, 129784}, {131072, 196605}, {196608, 262141}]

Wide (double-width) character ranges From wcwidth table_wide.py + emoji ranges for modern terminal compatibility

ZERO_WIDTH = [{768, 879}, {1155, 1161}, {1425, 1469}, {1471, 1471}, {1473, 1474}, {1476, 1477}, {1479, 1479}, {1536, 1541}, {1552, 1562}, {1564, 1564}, {1611, 1631}, {1648, 1648}, {1750, 1757}, {1759, 1764}, {1767, 1768}, {1770, 1773}, {1807, 1807}, {1809, 1809}, {1840, 1866}, {1958, 1968}, {2027, 2035}, {2045, 2045}, {2070, 2073}, {2075, 2083}, {2085, 2087}, {2089, 2093}, {2137, 2139}, {2192, 2193}, {2199, 2207}, {2250, 2273}, {2275, 2307}, {2362, 2364}, {2366, 2383}, {2385, 2391}, {2402, 2403}, {2433, 2435}, {2492, 2492}, {2494, 2500}, {2503, 2504}, {2507, 2509}, {2519, 2519}, {2530, 2531}, {2558, 2558}, {2561, 2563}, {2620, 2620}, {2622, 2626}, {2631, 2632}, {2635, 2637}, {2641, 2641}, {2672, 2673}, {2677, 2677}, {2689, 2691}, {2748, 2748}, {2750, 2757}, {2759, 2761}, {2763, 2765}, {2786, 2787}, {2810, 2815}, {2817, 2819}, {2876, 2876}, {2878, 2884}, {2887, 2888}, {2891, 2893}, {2901, 2903}, {2914, 2915}, {2946, 2946}, {3006, 3010}, {3014, 3016}, {3018, 3021}, {3031, 3031}, {3072, 3076}, {3132, 3132}, {3134, 3140}, {3142, 3144}, {3146, 3149}, {3157, 3158}, {3170, 3171}, {3201, 3203}, {3260, 3260}, {3262, 3268}, {3270, 3272}, {3274, 3277}, {3285, 3286}, {3298, 3299}, {3315, 3315}, {3328, 3331}, {3387, 3388}, {3390, 3396}, {3398, 3400}, {3402, 3405}, {3415, 3415}, {3426, 3427}, {3457, 3459}, {3530, 3530}, {3535, 3540}, {3542, 3542}, {3544, 3551}, {3570, 3571}, {3633, 3633}, {3636, 3642}, {3655, 3662}, {3761, 3761}, {3764, 3772}, {3784, 3790}, {3864, 3865}, {3893, 3893}, {3895, 3895}, {3897, 3897}, {3953, 3966}, {3968, 3972}, {3974, 3975}, {3981, 3991}, {3993, 4028}, {4038, 4038}, {4139, 4158}, {4182, 4185}, {4190, 4192}, {4194, 4196}, {4199, 4205}, {4209, 4212}, {4226, 4237}, {4239, 4239}, {4250, 4253}, {4957, 4959}, {5906, 5909}, {5938, 5940}, {5970, 5971}, {6002, 6003}, {6068, 6099}, {6109, 6109}, {6155, 6159}, {6277, 6278}, {6313, 6313}, {6432, 6443}, {6448, 6459}, {6679, 6683}, {6741, 6750}, {6752, 6780}, {6783, 6783}, {6832, 6862}, {6912, 6916}, {6964, 6980}, {7019, 7027}, {7040, 7042}, {7073, 7085}, {7142, 7155}, {7204, 7223}, {7376, 7378}, {7380, 7400}, {7405, 7405}, {7412, 7412}, {7415, 7417}, {7616, 7679}, {8203, 8207}, {8232, 8238}, {8288, 8303}, {8400, 8432}, {11503, 11505}, {11647, 11647}, {11744, 11775}, {12330, 12335}, {12441, 12442}, {42607, 42610}, {42612, 42621}, {42654, 42655}, {42736, 42737}, {43010, 43010}, {43014, 43014}, {43019, 43019}, {43043, 43047}, {43052, 43052}, {43136, 43137}, {43188, 43205}, {43232, 43249}, {43263, 43263}, {43302, 43309}, {43335, 43347}, {43392, 43395}, {43443, 43456}, {43493, 43493}, {43561, 43574}, {43587, 43587}, {43596, 43597}, {43643, 43645}, {43696, 43696}, {43698, 43700}, {43703, 43704}, {43710, 43711}, {43713, 43713}, {43755, 43759}, {43765, 43766}, {44003, 44010}, {44012, 44013}, {64286, 64286}, {65024, 65039}, {65056, 65071}, {65279, 65279}, {65529, 65531}, {66045, 66045}, {66272, 66272}, {66422, 66426}, {68097, 68099}, {68101, 68102}, {68108, 68111}, {68152, 68154}, {68159, 68159}, {68325, 68326}, {68900, 68903}, {69291, 69292}, {69373, 69375}, {69446, 69456}, {69506, 69509}, {69632, 69634}, {69688, 69702}, {69744, 69744}, {69747, 69748}, {69759, 69762}, {69808, 69818}, {69826, 69826}, {69888, 69890}, {69927, 69940}, {69957, 69958}, {70016, 70018}, {70067, 70080}, {70089, 70092}, {70094, 70095}, {70188, 70199}, {70206, 70206}, {70209, 70209}, {70367, 70378}, {70400, 70403}, {70459, 70460}, {70462, 70468}, {70471, 70472}, {70475, 70477}, {70487, 70487}, {70498, 70499}, {70502, 70508}, {70512, 70516}, {70709, 70726}, {70750, 70750}, {70832, 70851}, {71087, 71093}, {71096, 71104}, {71132, 71133}, {71216, 71232}, {71339, 71351}, {71453, 71467}, {71724, 71738}, {71984, 71989}, {71991, 71992}, {71995, 71998}, {72000, 72000}, {72002, 72003}, {72145, 72151}, {72154, 72160}, {72164, 72164}, {72193, 72202}, {72243, 72249}, {72251, 72254}, {72263, 72263}, {72273, 72283}, {72330, 72345}, {72751, 72758}, {72760, 72767}, {72850, 72871}, {72873, 72886}, {73009, 73014}, {73018, 73018}, {73020, 73021}, {73023, 73029}, {73031, 73031}, {73098, 73102}, {73104, 73105}, {73107, 73111}, {73459, 73462}, {73472, 73473}, {73475, 73475}, {73524, 73530}, {73534, 73538}, {78896, 78911}, {78912, 78912}, {78919, 78933}, {92912, 92916}, {92976, 92982}, {94031, 94031}, {94033, 94087}, {94095, 94098}, {94180, 94180}, {113821, 113822}, {118528, 118573}, {118576, 118598}, {119141, 119145}, {119149, 119170}, {119173, 119179}, {119210, 119213}, {119362, 119364}, {121344, 121398}, {121403, 121452}, {121461, 121461}, {121476, 121476}, {121499, 121503}, {121505, 121519}, {122880, 122886}, {122888, 122904}, {122907, 122913}, {122915, 122916}, {122918, 122922}, {123023, 123023}, {123184, 123190}, {123566, 123566}, {123628, 123631}, {124140, 124143}, {125136, 125142}, {125252, 125258}, {917505, 917505}, {917536, 917631}, {917760, 917999}]

Zero-width character ranges (combining marks, control chars, format chars) From wcwidth table_zero.py

Class methods

ambiguous_wide=(value : Bool) : Bool
Source
ambiguous_wide?
Source
char_width(char : Char) : Int32

Get display width of a single character

Source
display_width(text : String) : Int32

Get display width of a string

Source
grapheme_width(grapheme : String) : Int32

Get display width of a grapheme cluster (string)

Source
truncate(text : String, max_width : Int32, suffix : String = "…") : String

Truncate string to fit display width, adding suffix if truncated

Source