@@ -3,32 +3,48 @@ local path = require("plenary.path").path
3
3
local M = {}
4
4
5
5
M .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
+
6
14
if jit and path .sep ~= [[ \]] then
7
15
local ffi = require " ffi"
8
16
ffi .cdef [[
9
17
typedef unsigned char char_u;
10
18
int linetabsize_col (int startcol , char_u * s );
11
19
]]
12
20
13
- return function (str , col )
21
+ local ffi_func = function (str , col )
14
22
str = tostring (str )
15
23
local startcol = col or 0
16
24
local s = ffi .new (" char[?]" , # str + 1 )
17
25
ffi .copy (s , str )
18
26
return ffi .C .linetabsize_col (startcol , s ) - startcol
19
27
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
27
34
end
35
+ else
36
+ return fallback
28
37
end
29
38
end )()
30
39
31
40
M .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
+
32
48
if jit and path .sep ~= [[ \]] then
33
49
local ffi = require " ffi"
34
50
ffi .cdef [[
@@ -42,6 +58,11 @@ M.strcharpart = (function()
42
58
return ffi .C .utf_ptr2len (c_str )
43
59
end
44
60
61
+ local ok = pcall (utf_ptr2len , " 🔭" )
62
+ if not ok then
63
+ return fallback
64
+ end
65
+
45
66
return function (str , nchar , charlen )
46
67
local nbyte = 0
47
68
if nchar > 0 then
@@ -83,12 +104,7 @@ M.strcharpart = (function()
83
104
return str :sub (nbyte + 1 , nbyte + len )
84
105
end
85
106
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
92
108
end
93
109
end )()
94
110
0 commit comments