@@ -3,32 +3,48 @@ local path = require("plenary.path").path
33local M = {}
44
55M .strdisplaywidth = (function ()
6+ local fallback = function (str , col )
7+ str = tostring (str )
8+ if vim .in_fast_event () then
9+ return # str - (col or 0 )
10+ end
11+ return vim .fn .strdisplaywidth (str , col )
12+ end
13+
614 if jit and path .sep ~= [[ \]] then
715 local ffi = require " ffi"
816 ffi .cdef [[
917 typedef unsigned char char_u;
1018 int linetabsize_col (int startcol , char_u * s );
1119 ]]
1220
13- return function (str , col )
21+ local ffi_func = function (str , col )
1422 str = tostring (str )
1523 local startcol = col or 0
1624 local s = ffi .new (" char[?]" , # str + 1 )
1725 ffi .copy (s , str )
1826 return ffi .C .linetabsize_col (startcol , s ) - startcol
1927 end
20- else
21- return function (str , col )
22- str = tostring (str )
23- if vim .in_fast_event () then
24- return # str - (col or 0 )
25- end
26- return vim .fn .strdisplaywidth (str , col )
28+
29+ local ok = pcall (ffi_func , " hello" )
30+ if ok then
31+ return ffi_func
32+ else
33+ return fallback
2734 end
35+ else
36+ return fallback
2837 end
2938end )()
3039
3140M .strcharpart = (function ()
41+ local fallback = function (str , nchar , charlen )
42+ if vim .in_fast_event () then
43+ return str :sub (nchar + 1 , charlen )
44+ end
45+ return vim .fn .strcharpart (str , nchar , charlen )
46+ end
47+
3248 if jit and path .sep ~= [[ \]] then
3349 local ffi = require " ffi"
3450 ffi .cdef [[
@@ -42,6 +58,11 @@ M.strcharpart = (function()
4258 return ffi .C .utf_ptr2len (c_str )
4359 end
4460
61+ local ok = pcall (utf_ptr2len , " 🔭" )
62+ if not ok then
63+ return fallback
64+ end
65+
4566 return function (str , nchar , charlen )
4667 local nbyte = 0
4768 if nchar > 0 then
@@ -83,12 +104,7 @@ M.strcharpart = (function()
83104 return str :sub (nbyte + 1 , nbyte + len )
84105 end
85106 else
86- return function (str , nchar , charlen )
87- if vim .in_fast_event () then
88- return str :sub (nchar + 1 , charlen )
89- end
90- return vim .fn .strcharpart (str , nchar , charlen )
91- end
107+ return fallback
92108 end
93109end )()
94110
0 commit comments