mirror of
https://github.com/neovim/neovim.git
synced 2025-09-13 14:58:18 +00:00
make get_region_bytecount end-exclusive
This commit is contained in:
@@ -442,7 +442,7 @@ void nvim_buf_set_lines(uint64_t channel_id,
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
bcount_t deleted_bytes = MAX(get_region_bytecount(start, end, 0, 0)-1, 0);
|
bcount_t deleted_bytes = get_region_bytecount(curbuf, start, end, 0, 0);
|
||||||
|
|
||||||
// If the size of the range is reducing (ie, new_len < old_len) we
|
// If the size of the range is reducing (ie, new_len < old_len) we
|
||||||
// need to delete some old_len. We do this at the start, by
|
// need to delete some old_len. We do this at the start, by
|
||||||
|
@@ -1677,8 +1677,8 @@ int op_delete(oparg_T *oap)
|
|||||||
curbuf_splice_pending++;
|
curbuf_splice_pending++;
|
||||||
pos_T startpos = curwin->w_cursor; // start position for delete
|
pos_T startpos = curwin->w_cursor; // start position for delete
|
||||||
bcount_t deleted_bytes = get_region_bytecount(
|
bcount_t deleted_bytes = get_region_bytecount(
|
||||||
startpos.lnum, oap->end.lnum, startpos.col,
|
curbuf, startpos.lnum, oap->end.lnum, startpos.col,
|
||||||
oap->end.col) - !oap->inclusive;
|
oap->end.col) + oap->inclusive;
|
||||||
truncate_line(true); // delete from cursor to end of line
|
truncate_line(true); // delete from cursor to end of line
|
||||||
|
|
||||||
curpos = curwin->w_cursor; // remember curwin->w_cursor
|
curpos = curwin->w_cursor; // remember curwin->w_cursor
|
||||||
@@ -6300,19 +6300,32 @@ bool op_reg_set_previous(const char name)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bcount_t get_region_bytecount(linenr_T start_lnum, linenr_T end_lnum,
|
/// Get the byte count of buffer region. End-exclusive.
|
||||||
colnr_T start_col, colnr_T end_col)
|
///
|
||||||
|
/// @return number of bytes
|
||||||
|
bcount_t get_region_bytecount(buf_T *buf, linenr_T start_lnum,
|
||||||
|
linenr_T end_lnum, colnr_T start_col,
|
||||||
|
colnr_T end_col)
|
||||||
{
|
{
|
||||||
const char *first = (const char *)ml_get(start_lnum);
|
linenr_T max_lnum = buf->b_ml.ml_line_lnum;
|
||||||
|
if (start_lnum > max_lnum) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (start_lnum == end_lnum) {
|
||||||
|
return end_col - start_col;
|
||||||
|
}
|
||||||
|
const char *first = (const char *)ml_get_buf(buf, start_lnum, false);
|
||||||
bcount_t deleted_bytes = (bcount_t)STRLEN(first) - start_col + 1;
|
bcount_t deleted_bytes = (bcount_t)STRLEN(first) - start_col + 1;
|
||||||
|
|
||||||
if (start_lnum == end_lnum) {
|
|
||||||
return deleted_bytes - ((bcount_t)STRLEN(first) - end_col + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (linenr_T i = 1; i <= end_lnum-start_lnum-1; i++) {
|
for (linenr_T i = 1; i <= end_lnum-start_lnum-1; i++) {
|
||||||
|
if (start_lnum + i > max_lnum) {
|
||||||
|
return deleted_bytes;
|
||||||
|
}
|
||||||
deleted_bytes += (bcount_t)STRLEN(
|
deleted_bytes += (bcount_t)STRLEN(
|
||||||
ml_get(start_lnum + i)) + 1;
|
ml_get_buf(buf, start_lnum + i, false)) + 1;
|
||||||
}
|
}
|
||||||
return deleted_bytes + end_col + 1;
|
if (end_lnum > max_lnum) {
|
||||||
|
return deleted_bytes;
|
||||||
|
}
|
||||||
|
return deleted_bytes + end_col;
|
||||||
}
|
}
|
||||||
|
@@ -962,20 +962,20 @@ describe('lua: nvim_buf_attach on_bytes', function()
|
|||||||
local check_events = setup_eventcheck(verify, {"AAA", "BBB"})
|
local check_events = setup_eventcheck(verify, {"AAA", "BBB"})
|
||||||
|
|
||||||
-- delete
|
-- delete
|
||||||
command("lua vim.api.nvim_buf_set_lines(0, 0, 1, true, {})")
|
meths.buf_set_lines(0, 0, 1, true, {})
|
||||||
|
|
||||||
check_events {
|
check_events {
|
||||||
{ "test1", "bytes", 1, 3, 0, 0, 0, 1, 0, 4, 0, 0, 0 };
|
{ "test1", "bytes", 1, 3, 0, 0, 0, 1, 0, 4, 0, 0, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
-- add
|
-- add
|
||||||
command("lua vim.api.nvim_buf_set_lines(0, 0, 0, true, {'asdf'})")
|
meths.buf_set_lines(0, 0, 0, true, {'asdf'})
|
||||||
check_events {
|
check_events {
|
||||||
{ "test1", "bytes", 1, 4, 0, 0, 0, 0, 0, 0, 1, 0, 5 };
|
{ "test1", "bytes", 1, 4, 0, 0, 0, 0, 0, 0, 1, 0, 5 };
|
||||||
}
|
}
|
||||||
|
|
||||||
-- replace
|
-- replace
|
||||||
command("lua vim.api.nvim_buf_set_lines(0, 0, 1, true, {'asdf', 'fdsa'})")
|
meths.buf_set_lines(0, 0, 1, true, {'asdf', 'fdsa'})
|
||||||
check_events {
|
check_events {
|
||||||
{ "test1", "bytes", 1, 5, 0, 0, 0, 1, 0, 5, 2, 0, 10 };
|
{ "test1", "bytes", 1, 5, 0, 0, 0, 1, 0, 5, 2, 0, 10 };
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user