Merge pull request #12935 from vigoux/byte-change-lines

buf_updates: fix wrong updates on linewise change
This commit is contained in:
Björn Linse
2020-09-19 11:02:32 +02:00
committed by GitHub
3 changed files with 68 additions and 28 deletions

View File

@@ -68,6 +68,10 @@
# define LOG_CALLSTACK_TO_FILE(fp) log_callstack_to_file(fp, __func__, __LINE__) # define LOG_CALLSTACK_TO_FILE(fp) log_callstack_to_file(fp, __func__, __LINE__)
#endif #endif
#if defined(__has_include) && __has_include("sanitizer/asan_interface.h")
# include "sanitizer/asan_interface.h"
#endif
#ifdef INCLUDE_GENERATED_DECLARATIONS #ifdef INCLUDE_GENERATED_DECLARATIONS
# include "log.h.generated.h" # include "log.h.generated.h"
#endif #endif

View File

@@ -1544,10 +1544,10 @@ int op_delete(oparg_T *oap)
oap->line_count = 0; // no lines deleted oap->line_count = 0; // no lines deleted
} else if (oap->motion_type == kMTLineWise) { } else if (oap->motion_type == kMTLineWise) {
if (oap->op_type == OP_CHANGE) { if (oap->op_type == OP_CHANGE) {
/* Delete the lines except the first one. Temporarily move the // Delete the lines except the first one. Temporarily move the
* cursor to the next line. Save the current line number, if the // cursor to the next line. Save the current line number, if the
* last line is deleted it may be changed. // last line is deleted it may be changed.
*/
if (oap->line_count > 1) { if (oap->line_count > 1) {
lnum = curwin->w_cursor.lnum; lnum = curwin->w_cursor.lnum;
++curwin->w_cursor.lnum; ++curwin->w_cursor.lnum;
@@ -1560,12 +1560,21 @@ int op_delete(oparg_T *oap)
beginline(BL_WHITE); // cursor on first non-white beginline(BL_WHITE); // cursor on first non-white
did_ai = true; // delete the indent when ESC hit did_ai = true; // delete the indent when ESC hit
ai_col = curwin->w_cursor.col; ai_col = curwin->w_cursor.col;
} else } else {
beginline(0); /* cursor in column 0 */ beginline(0); // cursor in column 0
truncate_line(FALSE); /* delete the rest of the line */ }
/* leave cursor past last char in line */
if (oap->line_count > 1) int old_len = (int)STRLEN(ml_get(curwin->w_cursor.lnum));
u_clearline(); /* "U" command not possible after "2cc" */ truncate_line(false); // delete the rest of the line
extmark_splice_cols(curbuf,
(int)curwin->w_cursor.lnum-1, curwin->w_cursor.col,
old_len - curwin->w_cursor.col, 0, kExtmarkUndo);
// leave cursor past last char in line
if (oap->line_count > 1) {
u_clearline(); // "U" command not possible after "2cc"
}
} else { } else {
del_lines(oap->line_count, TRUE); del_lines(oap->line_count, TRUE);
beginline(BL_WHITE | BL_FIX); beginline(BL_WHITE | BL_FIX);

View File

@@ -287,8 +287,17 @@ describe('lua: nvim_buf_attach on_bytes', function()
fail(msg) fail(msg)
end end
if verify then if not verify then
return
end
for _, event in ipairs(events) do for _, event in ipairs(events) do
for _, elem in ipairs(event) do
if type(elem) == "number" and elem < 0 then
fail(string.format("Received event has negative values"))
end
end
if event[1] == verify_name and event[2] == "bytes" then if event[1] == verify_name and event[2] == "bytes" then
local _, _, _, _, _, _, start_byte, _, _, old_byte, _, _, new_byte = unpack(event) local _, _, _, _, _, _, start_byte, _, _, old_byte, _, _, new_byte = unpack(event)
local before = string.sub(shadowbytes, 1, start_byte) local before = string.sub(shadowbytes, 1, start_byte)
@@ -299,8 +308,10 @@ describe('lua: nvim_buf_attach on_bytes', function()
shadowbytes = before .. unknown .. after shadowbytes = before .. unknown .. after
end end
end end
local text = meths.buf_get_lines(0, 0, -1, true) local text = meths.buf_get_lines(0, 0, -1, true)
local bytes = table.concat(text, '\n') .. '\n' local bytes = table.concat(text, '\n') .. '\n'
eq(string.len(bytes), string.len(shadowbytes), '\non_bytes: total bytecount of buffer is wrong') eq(string.len(bytes), string.len(shadowbytes), '\non_bytes: total bytecount of buffer is wrong')
for i = 1, string.len(shadowbytes) do for i = 1, string.len(shadowbytes) do
local shadowbyte = string.sub(shadowbytes, i, i) local shadowbyte = string.sub(shadowbytes, i, i)
@@ -309,7 +320,6 @@ describe('lua: nvim_buf_attach on_bytes', function()
end end
end end
end end
end
return check_events return check_events
end end
@@ -411,6 +421,23 @@ describe('lua: nvim_buf_attach on_bytes', function()
{ "test1", "bytes", 1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 1 }; { "test1", "bytes", 1, 3, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
} }
end) end)
it("changing lines", function()
local check_events = setup_eventcheck(verify, origlines)
feed "cc"
check_events {
{ "test1", "bytes", 1, 4, 0, 0, 0, 0, 15, 15, 0, 0, 0 };
}
feed "<ESC>"
check_events {}
feed "c3j"
check_events {
{ "test1", "bytes", 1, 4, 1, 0, 1, 3, 0, 48, 0, 0, 0 };
}
end)
end end
describe('(with verify) handles', function() describe('(with verify) handles', function()