mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	buf_updates: fix wrong updates on linewise change
This commit is contained in:
		| @@ -1544,15 +1544,19 @@ 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; | ||||||
|         del_lines(oap->line_count - 1, TRUE); |         del_lines(oap->line_count - 1, TRUE); | ||||||
|         curwin->w_cursor.lnum = lnum; |         curwin->w_cursor.lnum = lnum; | ||||||
|  |  | ||||||
|  |         extmark_adjust(curbuf, curwin->w_cursor.lnum, | ||||||
|  |                        curwin->w_cursor.lnum + oap->line_count - 1, | ||||||
|  |                        MAXLNUM, 0, kExtmarkUndo); | ||||||
|       } |       } | ||||||
|       if (u_save_cursor() == FAIL) |       if (u_save_cursor() == FAIL) | ||||||
|         return FAIL; |         return FAIL; | ||||||
| @@ -1561,9 +1565,16 @@ int op_delete(oparg_T *oap) | |||||||
|         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 */ |       int old_len = (int)STRLEN(ml_get(curwin->w_cursor.lnum)); | ||||||
|  |       truncate_line(FALSE);         // delete the rest of the line | ||||||
|  |  | ||||||
|  |       extmark_splice_cols(curbuf, | ||||||
|  |                           (int)curwin->w_cursor.lnum, curwin->w_cursor.col, | ||||||
|  |                           old_len - curwin->w_cursor.col, 0, kExtmarkUndo); | ||||||
|  |  | ||||||
|  |                                     // leave cursor past last char in line | ||||||
|       if (oap->line_count > 1) |       if (oap->line_count > 1) | ||||||
|         u_clearline();              /* "U" command not possible after "2cc" */ |         u_clearline();              /* "U" command not possible after "2cc" */ | ||||||
|     } else { |     } else { | ||||||
|   | |||||||
| @@ -289,6 +289,12 @@ describe('lua: nvim_buf_attach on_bytes', function() | |||||||
|  |  | ||||||
|       if verify then |       if verify then | ||||||
|         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) | ||||||
| @@ -411,6 +417,24 @@ 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, 1, 0, 1, 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 }; | ||||||
|  |         { "test1", "bytes", 1, 5, 0, 0, 0, 4, 0, 0, 4, 0, 51 }; | ||||||
|  |       } | ||||||
|  |     end) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   describe('(with verify) handles', function() |   describe('(with verify) handles', function() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Thomas Vigouroux
					Thomas Vigouroux