fix: left an right movements jump to selection boundary
When there is an active selection, basic left and right movements should cancel the selection and place the cursor on the left/right of where the selection was. closes #244
This commit is contained in:
parent
1eb36696d2
commit
6618a2d84d
1 changed files with 29 additions and 5 deletions
|
@ -3042,17 +3042,41 @@ pub const Editor = struct {
|
|||
}
|
||||
pub const join_next_line_meta: Meta = .{ .description = "Join next line", .arguments = &.{.integer} };
|
||||
|
||||
pub fn move_left(self: *Self, ctx: Context) Result {
|
||||
fn move_cursors_or_collapse_selection(
|
||||
self: *Self,
|
||||
direction: enum { left, right },
|
||||
ctx: Context,
|
||||
) error{Stop}!void {
|
||||
const root = try self.buf_root();
|
||||
self.with_cursors_const_repeat(root, move_cursor_left, ctx) catch {};
|
||||
var repeat: usize = 1;
|
||||
_ = ctx.args.match(.{tp.extract(&repeat)}) catch false;
|
||||
while (repeat > 0) : (repeat -= 1) {
|
||||
for (self.cursels.items) |*cursel_| if (cursel_.*) |*cursel| {
|
||||
if (cursel.selection) |*sel| {
|
||||
cursel.cursor = switch (direction) {
|
||||
.left => if (sel.is_reversed()) sel.end else sel.begin,
|
||||
.right => if (sel.is_reversed()) sel.begin else sel.end,
|
||||
};
|
||||
cursel.disable_selection(root, self.metrics);
|
||||
} else {
|
||||
try with_cursor_const(root, switch (direction) {
|
||||
.left => move_cursor_left,
|
||||
.right => move_cursor_right,
|
||||
}, cursel, self.metrics);
|
||||
}
|
||||
};
|
||||
self.collapse_cursors();
|
||||
}
|
||||
self.clamp();
|
||||
}
|
||||
|
||||
pub fn move_left(self: *Self, ctx: Context) Result {
|
||||
self.move_cursors_or_collapse_selection(.left, ctx) catch {};
|
||||
}
|
||||
pub const move_left_meta: Meta = .{ .description = "Move cursor left", .arguments = &.{.integer} };
|
||||
|
||||
pub fn move_right(self: *Self, ctx: Context) Result {
|
||||
const root = try self.buf_root();
|
||||
self.with_cursors_const_repeat(root, move_cursor_right, ctx) catch {};
|
||||
self.clamp();
|
||||
self.move_cursors_or_collapse_selection(.right, ctx) catch {};
|
||||
}
|
||||
pub const move_right_meta: Meta = .{ .description = "Move cursor right", .arguments = &.{.integer} };
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue