fix(lua): on_yank error with blockwise multibyte region #20162

Prevent out of range error when calling `str_byteindex`.
Use `vim.str_byteindex(bufline, #bufline)` to cacluate utf length of `bufline`.
fix #20161
This commit is contained in:
Daniel Zhang
2022-10-14 17:12:46 +08:00
committed by GitHub
parent 9931db2e3f
commit 81986a7349
2 changed files with 20 additions and 9 deletions

View File

@@ -416,11 +416,16 @@ function vim.region(bufnr, pos1, pos2, regtype, inclusive)
c2 = c1 + regtype:sub(2)
-- and adjust for non-ASCII characters
bufline = vim.api.nvim_buf_get_lines(bufnr, l, l + 1, true)[1]
if c1 < #bufline then
local utflen = vim.str_utfindex(bufline, #bufline)
if c1 <= utflen then
c1 = vim.str_byteindex(bufline, c1)
else
c1 = #bufline + 1
end
if c2 < #bufline then
if c2 <= utflen then
c2 = vim.str_byteindex(bufline, c2)
else
c2 = #bufline + 1
end
else
c1 = (l == pos1[1]) and pos1[2] or 0

View File

@@ -2227,13 +2227,19 @@ describe('lua stdlib', function()
eq(true, exec_lua[[return vim.g.test]])
end)
it('vim.region', function()
insert(helpers.dedent( [[
text tααt tααt text
text tαxt txtα tex
text tαxt tαxt
]]))
eq({5,15}, exec_lua[[ return vim.region(0,{1,5},{1,14},'v',true)[1] ]])
describe('vim.region', function()
it('charwise', function()
insert(helpers.dedent( [[
text tααt tααt text
text tαxt txtα tex
text tαxt tαxt
]]))
eq({5,15}, exec_lua[[ return vim.region(0,{1,5},{1,14},'v',true)[1] ]])
end)
it('blockwise', function()
insert([[αα]])
eq({0,5}, exec_lua[[ return vim.region(0,{0,0},{0,4},'3',true)[0] ]])
end)
end)
describe('vim.on_key', function()