Fixed cursor movement.
This commit is contained in:
parent
d352eb1cb9
commit
1d61cf989f
|
@ -333,21 +333,20 @@ function Doc:raw_insert(line, col, text, undo_stack, time)
|
||||||
|
|
||||||
-- splice lines into line array
|
-- splice lines into line array
|
||||||
common.splice(self.lines, line, 1, lines)
|
common.splice(self.lines, line, 1, lines)
|
||||||
|
|
||||||
|
-- keep cursors where they should be
|
||||||
|
for idx, cline1, ccol1, cline2, ccol2 in self:get_selections(true, true) do
|
||||||
|
if cline1 < line then break end
|
||||||
|
local line_addition = (line < cline1 or col < ccol1) and #lines - 1 or 0
|
||||||
|
local column_addition = line == cline1 and ccol1 > col and len or 0
|
||||||
|
self:set_selections(idx, cline1 + line_addition, ccol1 + column_addition, cline2 + line_addition, ccol2 + column_addition)
|
||||||
|
end
|
||||||
|
|
||||||
-- push undo
|
-- push undo
|
||||||
local line2, col2 = self:position_offset(line, col, #text)
|
local line2, col2 = self:position_offset(line, col, #text)
|
||||||
push_undo(undo_stack, time, "selection", unpack(self.selections))
|
push_undo(undo_stack, time, "selection", unpack(self.selections))
|
||||||
push_undo(undo_stack, time, "remove", line, col, line2, col2)
|
push_undo(undo_stack, time, "remove", line, col, line2, col2)
|
||||||
|
|
||||||
-- keep cursors where they should be
|
|
||||||
for idx, cline1, ccol1, cline2, ccol2 in self:get_selections(true) do
|
|
||||||
if cline1 >= line then
|
|
||||||
local line_addition = line > cline1 or ccol1 > col and #lines - 1 or 0
|
|
||||||
local column_addition = line == cline1 and ccol1 > col and len or 0
|
|
||||||
self:set_selections(idx, cline1 + line_addition, ccol1 + column_addition, cline2 + line_addition, ccol2 + column_addition)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- update highlighter and assure selection is in bounds
|
-- update highlighter and assure selection is in bounds
|
||||||
self.highlighter:invalidate(line)
|
self.highlighter:invalidate(line)
|
||||||
self:sanitize_selection()
|
self:sanitize_selection()
|
||||||
|
@ -368,12 +367,11 @@ function Doc:raw_remove(line1, col1, line2, col2, undo_stack, time)
|
||||||
common.splice(self.lines, line1, line2 - line1 + 1, { before .. after })
|
common.splice(self.lines, line1, line2 - line1 + 1, { before .. after })
|
||||||
|
|
||||||
-- move all cursors back if they share a line with the removed text
|
-- move all cursors back if they share a line with the removed text
|
||||||
for idx, cline1, ccol1, cline2, ccol2 in self:get_selections(true) do
|
for idx, cline1, ccol1, cline2, ccol2 in self:get_selections(true, true) do
|
||||||
if cline1 >= line2 then
|
if cline1 < line2 then break end
|
||||||
local line_removal = line2 - line1
|
local line_removal = line2 - line1
|
||||||
local column_removal = line2 == cline2 and col2 < ccol1 and (line2 == line1 and col2 - col1 or col2) or 0
|
local column_removal = line2 == cline2 and col2 < ccol1 and (line2 == line1 and col2 - col1 or col2) or 0
|
||||||
self:set_selections(idx, cline1 - line_removal, ccol1 - column_removal, cline2 - line_removal, ccol2 - column_removal)
|
self:set_selections(idx, cline1 - line_removal, ccol1 - column_removal, cline2 - line_removal, ccol2 - column_removal)
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- update highlighter and assure selection is in bounds
|
-- update highlighter and assure selection is in bounds
|
||||||
|
@ -411,7 +409,7 @@ end
|
||||||
|
|
||||||
|
|
||||||
function Doc:text_input(text, idx)
|
function Doc:text_input(text, idx)
|
||||||
for sidx, line1, col1, line2, col2 in self:get_selections(true, idx) do
|
for sidx, line1, col1, line2, col2 in self:get_selections(true, idx or true) do
|
||||||
if line1 ~= line2 or col1 ~= col2 then
|
if line1 ~= line2 or col1 ~= col2 then
|
||||||
self:delete_to_cursor(sidx)
|
self:delete_to_cursor(sidx)
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue