refactor: make Editor.enable_selection infallible again
As a concept, it should not be possible for enable_selection to fail. Even for inclusive selections. Having enable_selection possibly return an error introduces lots of complexity that is not useful.
This commit is contained in:
parent
ab3373ab33
commit
5ffd34680e
2 changed files with 46 additions and 46 deletions
|
|
@ -115,8 +115,8 @@ pub const CurSel = struct {
|
||||||
self.* = .{};
|
self.* = .{};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn enable_selection(self: *Self, root: Buffer.Root, metrics: Buffer.Metrics) !*Selection {
|
pub fn enable_selection(self: *Self, root: Buffer.Root, metrics: Buffer.Metrics) *Selection {
|
||||||
self.selection = try self.to_selection(root, metrics);
|
self.selection = self.to_selection(root, metrics);
|
||||||
return if (self.selection) |*sel| sel else unreachable;
|
return if (self.selection) |*sel| sel else unreachable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -125,10 +125,10 @@ pub const CurSel = struct {
|
||||||
return if (self.selection) |*sel| sel else unreachable;
|
return if (self.selection) |*sel| sel else unreachable;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_selection(self: *const Self, root: Buffer.Root, metrics: Buffer.Metrics) !Selection {
|
pub fn to_selection(self: *const Self, root: Buffer.Root, metrics: Buffer.Metrics) Selection {
|
||||||
return switch (tui.get_selection_style()) {
|
return switch (tui.get_selection_style()) {
|
||||||
.normal => self.to_selection_normal(),
|
.normal => self.to_selection_normal(),
|
||||||
.inclusive => try self.to_selection_inclusive(root, metrics),
|
.inclusive => self.to_selection_inclusive(root, metrics),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -136,12 +136,12 @@ pub const CurSel = struct {
|
||||||
return if (self.selection) |sel| sel else Selection.from_cursor(&self.cursor);
|
return if (self.selection) |sel| sel else Selection.from_cursor(&self.cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_selection_inclusive(self: *const Self, root: Buffer.Root, metrics: Buffer.Metrics) !Selection {
|
fn to_selection_inclusive(self: *const Self, root: Buffer.Root, metrics: Buffer.Metrics) Selection {
|
||||||
return if (self.selection) |sel|
|
return if (self.selection) |sel|
|
||||||
sel
|
sel
|
||||||
else cod: {
|
else cod: {
|
||||||
var sel = Selection.from_cursor(&self.cursor);
|
var sel = Selection.from_cursor(&self.cursor);
|
||||||
try sel.end.move_right(root, metrics);
|
sel.end.move_right(root, metrics) catch {};
|
||||||
break :cod sel;
|
break :cod sel;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -177,8 +177,8 @@ pub const CurSel = struct {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expand_selection_to_line(self: *Self, root: Buffer.Root, metrics: Buffer.Metrics) !*Selection {
|
fn expand_selection_to_line(self: *Self, root: Buffer.Root, metrics: Buffer.Metrics) *Selection {
|
||||||
const sel = try self.enable_selection(root, metrics);
|
const sel = self.enable_selection(root, metrics);
|
||||||
sel.normalize();
|
sel.normalize();
|
||||||
sel.begin.move_begin();
|
sel.begin.move_begin();
|
||||||
if (!(sel.end.row > sel.begin.row and sel.end.col == 0)) {
|
if (!(sel.end.row > sel.begin.row and sel.end.col == 0)) {
|
||||||
|
|
@ -2008,7 +2008,7 @@ pub const Editor = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_selection_const(root: Buffer.Root, move: cursor_operator_const, cursel: *CurSel, metrics: Buffer.Metrics) error{Stop}!void {
|
pub fn with_selection_const(root: Buffer.Root, move: cursor_operator_const, cursel: *CurSel, metrics: Buffer.Metrics) error{Stop}!void {
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
try move(root, &sel.end, metrics);
|
try move(root, &sel.end, metrics);
|
||||||
cursel.cursor = sel.end;
|
cursel.cursor = sel.end;
|
||||||
cursel.check_selection(root, metrics);
|
cursel.check_selection(root, metrics);
|
||||||
|
|
@ -2040,7 +2040,7 @@ pub const Editor = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_selection_const_arg(root: Buffer.Root, move: cursor_operator_const_arg, cursel: *CurSel, ctx: Context, metrics: Buffer.Metrics) error{Stop}!void {
|
fn with_selection_const_arg(root: Buffer.Root, move: cursor_operator_const_arg, cursel: *CurSel, ctx: Context, metrics: Buffer.Metrics) error{Stop}!void {
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
try move(root, &sel.end, ctx, metrics);
|
try move(root, &sel.end, ctx, metrics);
|
||||||
cursel.cursor = sel.end;
|
cursel.cursor = sel.end;
|
||||||
cursel.check_selection(root, metrics);
|
cursel.check_selection(root, metrics);
|
||||||
|
|
@ -2057,7 +2057,7 @@ pub const Editor = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_selection_and_view_const(root: Buffer.Root, move: cursor_view_operator_const, cursel: *CurSel, view: *const View, metrics: Buffer.Metrics) error{Stop}!void {
|
fn with_selection_and_view_const(root: Buffer.Root, move: cursor_view_operator_const, cursel: *CurSel, view: *const View, metrics: Buffer.Metrics) error{Stop}!void {
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
try move(root, &sel.end, view, metrics);
|
try move(root, &sel.end, view, metrics);
|
||||||
cursel.cursor = sel.end;
|
cursel.cursor = sel.end;
|
||||||
}
|
}
|
||||||
|
|
@ -2529,7 +2529,7 @@ pub const Editor = struct {
|
||||||
const x_ = if (x < 0) 0 else x;
|
const x_ = if (x < 0) 0 else x;
|
||||||
const primary = self.get_primary();
|
const primary = self.get_primary();
|
||||||
const root = self.buf_root() catch return;
|
const root = self.buf_root() catch return;
|
||||||
const sel = primary.enable_selection(root, self.metrics) catch return;
|
const sel = primary.enable_selection(root, self.metrics);
|
||||||
sel.end.move_abs(root, &self.view, @intCast(y_), @intCast(x_), self.metrics) catch return;
|
sel.end.move_abs(root, &self.view, @intCast(y_), @intCast(x_), self.metrics) catch return;
|
||||||
const initial = self.selection_drag_initial orelse sel.*;
|
const initial = self.selection_drag_initial orelse sel.*;
|
||||||
switch (self.selection_mode) {
|
switch (self.selection_mode) {
|
||||||
|
|
@ -2900,7 +2900,7 @@ pub const Editor = struct {
|
||||||
const primary = self.get_primary();
|
const primary = self.get_primary();
|
||||||
const root = self.buf_root() catch return;
|
const root = self.buf_root() catch return;
|
||||||
if (primary.selection) |_| {} else {
|
if (primary.selection) |_| {} else {
|
||||||
const sel = primary.enable_selection(root, self.metrics) catch return;
|
const sel = primary.enable_selection(root, self.metrics);
|
||||||
try move_cursor_begin(root, &sel.begin, self.metrics);
|
try move_cursor_begin(root, &sel.begin, self.metrics);
|
||||||
try move_cursor_end(root, &sel.end, self.metrics);
|
try move_cursor_end(root, &sel.end, self.metrics);
|
||||||
try move_cursor_right(root, &sel.end, self.metrics);
|
try move_cursor_right(root, &sel.end, self.metrics);
|
||||||
|
|
@ -3646,7 +3646,7 @@ pub const Editor = struct {
|
||||||
pub const add_cursor_all_matches_meta: Meta = .{ .description = "Add cursors to all highlighted matches" };
|
pub const add_cursor_all_matches_meta: Meta = .{ .description = "Add cursors to all highlighted matches" };
|
||||||
|
|
||||||
fn add_cursors_to_cursel_line_ends(self: *Self, root: Buffer.Root, cursel: *CurSel) !void {
|
fn add_cursors_to_cursel_line_ends(self: *Self, root: Buffer.Root, cursel: *CurSel) !void {
|
||||||
const sel = try cursel.enable_selection(root, self.metrics);
|
const sel = cursel.enable_selection(root, self.metrics);
|
||||||
sel.normalize();
|
sel.normalize();
|
||||||
var row = sel.begin.row;
|
var row = sel.begin.row;
|
||||||
while (row <= sel.end.row) : (row += 1) {
|
while (row <= sel.end.row) : (row += 1) {
|
||||||
|
|
@ -3676,7 +3676,7 @@ pub const Editor = struct {
|
||||||
fn pull_cursel_up(self: *Self, root_: Buffer.Root, cursel: *CurSel, allocator: Allocator) error{Stop}!Buffer.Root {
|
fn pull_cursel_up(self: *Self, root_: Buffer.Root, cursel: *CurSel, allocator: Allocator) error{Stop}!Buffer.Root {
|
||||||
var root = root_;
|
var root = root_;
|
||||||
const saved = cursel.*;
|
const saved = cursel.*;
|
||||||
const sel = cursel.expand_selection_to_line(root, self.metrics) catch return error.Stop;
|
const sel = cursel.expand_selection_to_line(root, self.metrics);
|
||||||
var sfa = std.heap.stackFallback(4096, self.allocator);
|
var sfa = std.heap.stackFallback(4096, self.allocator);
|
||||||
const sfa_allocator = sfa.get();
|
const sfa_allocator = sfa.get();
|
||||||
const cut_text = copy_selection(root, sel.*, sfa_allocator, self.metrics) catch return error.Stop;
|
const cut_text = copy_selection(root, sel.*, sfa_allocator, self.metrics) catch return error.Stop;
|
||||||
|
|
@ -3704,7 +3704,7 @@ pub const Editor = struct {
|
||||||
fn pull_cursel_down(self: *Self, root_: Buffer.Root, cursel: *CurSel, allocator: Allocator) error{Stop}!Buffer.Root {
|
fn pull_cursel_down(self: *Self, root_: Buffer.Root, cursel: *CurSel, allocator: Allocator) error{Stop}!Buffer.Root {
|
||||||
var root = root_;
|
var root = root_;
|
||||||
const saved = cursel.*;
|
const saved = cursel.*;
|
||||||
const sel = cursel.expand_selection_to_line(root, self.metrics) catch return error.Stop;
|
const sel = cursel.expand_selection_to_line(root, self.metrics);
|
||||||
var sfa = std.heap.stackFallback(4096, self.allocator);
|
var sfa = std.heap.stackFallback(4096, self.allocator);
|
||||||
const sfa_allocator = sfa.get();
|
const sfa_allocator = sfa.get();
|
||||||
const cut_text = copy_selection(root, sel.*, sfa_allocator, self.metrics) catch return error.Stop;
|
const cut_text = copy_selection(root, sel.*, sfa_allocator, self.metrics) catch return error.Stop;
|
||||||
|
|
@ -3852,7 +3852,7 @@ pub const Editor = struct {
|
||||||
fn toggle_cursel_prefix(self: *Self, root_: Buffer.Root, cursel: *CurSel, allocator: Allocator) error{Stop}!Buffer.Root {
|
fn toggle_cursel_prefix(self: *Self, root_: Buffer.Root, cursel: *CurSel, allocator: Allocator) error{Stop}!Buffer.Root {
|
||||||
var root = root_;
|
var root = root_;
|
||||||
const saved = cursel.*;
|
const saved = cursel.*;
|
||||||
const sel = cursel.expand_selection_to_line(root, self.metrics) catch return error.Stop;
|
const sel = cursel.expand_selection_to_line(root, self.metrics);
|
||||||
var sfa = std.heap.stackFallback(4096, self.allocator);
|
var sfa = std.heap.stackFallback(4096, self.allocator);
|
||||||
const sfa_allocator = sfa.get();
|
const sfa_allocator = sfa.get();
|
||||||
const text = copy_selection(root, sel.*, sfa_allocator, self.metrics) catch return error.Stop;
|
const text = copy_selection(root, sel.*, sfa_allocator, self.metrics) catch return error.Stop;
|
||||||
|
|
@ -3933,7 +3933,7 @@ pub const Editor = struct {
|
||||||
if (first == 0) return root;
|
if (first == 0) return root;
|
||||||
const off = first % self.indent_size;
|
const off = first % self.indent_size;
|
||||||
const cols = if (off == 0) self.indent_size else off;
|
const cols = if (off == 0) self.indent_size else off;
|
||||||
const sel = cursel.enable_selection(root, self.metrics) catch return error.Stop;
|
const sel = cursel.enable_selection(root, self.metrics);
|
||||||
try sel.begin.move_to(root, sel.begin.row, first, self.metrics);
|
try sel.begin.move_to(root, sel.begin.row, first, self.metrics);
|
||||||
try sel.end.move_to(root, sel.end.row, first - cols, self.metrics);
|
try sel.end.move_to(root, sel.end.row, first - cols, self.metrics);
|
||||||
var saved = false;
|
var saved = false;
|
||||||
|
|
@ -4159,7 +4159,7 @@ pub const Editor = struct {
|
||||||
|
|
||||||
pub fn enable_selection(self: *Self, _: Context) Result {
|
pub fn enable_selection(self: *Self, _: Context) Result {
|
||||||
const root = try self.buf_root();
|
const root = try self.buf_root();
|
||||||
_ = try self.get_primary().enable_selection(root, self.metrics);
|
_ = self.get_primary().enable_selection(root, self.metrics);
|
||||||
}
|
}
|
||||||
pub const enable_selection_meta: Meta = .{ .description = "Enable selection" };
|
pub const enable_selection_meta: Meta = .{ .description = "Enable selection" };
|
||||||
|
|
||||||
|
|
@ -4388,7 +4388,7 @@ pub const Editor = struct {
|
||||||
self.cancel_all_selections();
|
self.cancel_all_selections();
|
||||||
const primary = self.get_primary();
|
const primary = self.get_primary();
|
||||||
const root = try self.buf_root();
|
const root = try self.buf_root();
|
||||||
const sel = try primary.enable_selection(root, self.metrics);
|
const sel = primary.enable_selection(root, self.metrics);
|
||||||
try expand_selection_to_all(root, sel, self.metrics);
|
try expand_selection_to_all(root, sel, self.metrics);
|
||||||
primary.cursor = sel.end;
|
primary.cursor = sel.end;
|
||||||
self.clamp();
|
self.clamp();
|
||||||
|
|
@ -4398,7 +4398,7 @@ pub const Editor = struct {
|
||||||
|
|
||||||
fn select_word_at_cursor(self: *Self, cursel: *CurSel) !*Selection {
|
fn select_word_at_cursor(self: *Self, cursel: *CurSel) !*Selection {
|
||||||
const root = try self.buf_root();
|
const root = try self.buf_root();
|
||||||
const sel = try cursel.enable_selection(root, self.metrics);
|
const sel = cursel.enable_selection(root, self.metrics);
|
||||||
defer cursel.check_selection(root, self.metrics);
|
defer cursel.check_selection(root, self.metrics);
|
||||||
sel.normalize();
|
sel.normalize();
|
||||||
try move_cursor_word_begin(root, &sel.begin, self.metrics);
|
try move_cursor_word_begin(root, &sel.begin, self.metrics);
|
||||||
|
|
@ -4408,7 +4408,7 @@ pub const Editor = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn select_line_at_cursor(self: *Self, root: Buffer.Root, cursel: *CurSel, mode: enum { include_eol, exclude_eol, hold_cursor }) !void {
|
pub fn select_line_at_cursor(self: *Self, root: Buffer.Root, cursel: *CurSel, mode: enum { include_eol, exclude_eol, hold_cursor }) !void {
|
||||||
const sel = try cursel.enable_selection(root, self.metrics);
|
const sel = cursel.enable_selection(root, self.metrics);
|
||||||
sel.normalize();
|
sel.normalize();
|
||||||
try move_cursor_begin(root, &sel.begin, self.metrics);
|
try move_cursor_begin(root, &sel.begin, self.metrics);
|
||||||
move_cursor_end(root, &sel.end, self.metrics) catch {};
|
move_cursor_end(root, &sel.end, self.metrics) catch {};
|
||||||
|
|
@ -4472,12 +4472,12 @@ pub const Editor = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn top_node_at_cursel(self: *const Self, cursel: *const CurSel, root: Buffer.Root, metrics: Buffer.Metrics) error{Stop}!syntax.Node {
|
fn top_node_at_cursel(self: *const Self, cursel: *const CurSel, root: Buffer.Root, metrics: Buffer.Metrics) error{Stop}!syntax.Node {
|
||||||
const sel = try cursel.to_selection(root, metrics);
|
const sel = cursel.to_selection(root, metrics);
|
||||||
return try self.top_node_at_selection(sel, root, metrics);
|
return try self.top_node_at_selection(sel, root, metrics);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expand_selection_to_parent_node(self: *Self, root: Buffer.Root, cursel: *CurSel, metrics: Buffer.Metrics) !void {
|
fn expand_selection_to_parent_node(self: *Self, root: Buffer.Root, cursel: *CurSel, metrics: Buffer.Metrics) !void {
|
||||||
const sel = (try cursel.enable_selection(root, metrics)).*;
|
const sel = cursel.enable_selection(root, metrics).*;
|
||||||
var node = try self.top_node_at_selection(sel, root, metrics);
|
var node = try self.top_node_at_selection(sel, root, metrics);
|
||||||
if (node.isNull()) return error.Stop;
|
if (node.isNull()) return error.Stop;
|
||||||
var node_sel = try CurSel.selection_from_node(node, root, metrics);
|
var node_sel = try CurSel.selection_from_node(node, root, metrics);
|
||||||
|
|
@ -4502,7 +4502,7 @@ pub const Editor = struct {
|
||||||
pub const expand_selection_meta: Meta = .{ .description = "Expand selection to AST parent node" };
|
pub const expand_selection_meta: Meta = .{ .description = "Expand selection to AST parent node" };
|
||||||
|
|
||||||
fn shrink_selection_to_child_node(self: *Self, root: Buffer.Root, cursel: *CurSel, metrics: Buffer.Metrics) !void {
|
fn shrink_selection_to_child_node(self: *Self, root: Buffer.Root, cursel: *CurSel, metrics: Buffer.Metrics) !void {
|
||||||
const sel = (try cursel.enable_selection(root, metrics)).*;
|
const sel = cursel.enable_selection(root, metrics).*;
|
||||||
const node = try self.node_at_selection(sel, root, metrics);
|
const node = try self.node_at_selection(sel, root, metrics);
|
||||||
if (node.isNull() or node.getChildCount() == 0) return error.Stop;
|
if (node.isNull() or node.getChildCount() == 0) return error.Stop;
|
||||||
const child = node.getChild(0);
|
const child = node.getChild(0);
|
||||||
|
|
@ -4511,7 +4511,7 @@ pub const Editor = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shrink_selection_to_named_child_node(self: *Self, root: Buffer.Root, cursel: *CurSel, metrics: Buffer.Metrics) !void {
|
fn shrink_selection_to_named_child_node(self: *Self, root: Buffer.Root, cursel: *CurSel, metrics: Buffer.Metrics) !void {
|
||||||
const sel = (try cursel.enable_selection(root, metrics)).*;
|
const sel = cursel.enable_selection(root, metrics).*;
|
||||||
const node = try self.node_at_selection(sel, root, metrics);
|
const node = try self.node_at_selection(sel, root, metrics);
|
||||||
if (node.isNull() or node.getNamedChildCount() == 0) return error.Stop;
|
if (node.isNull() or node.getNamedChildCount() == 0) return error.Stop;
|
||||||
const child = node.getNamedChild(0);
|
const child = node.getNamedChild(0);
|
||||||
|
|
@ -4669,7 +4669,7 @@ pub const Editor = struct {
|
||||||
root_ = self.collapse_trailing_ws_line(root_, row, b_allocator);
|
root_ = self.collapse_trailing_ws_line(root_, row, b_allocator);
|
||||||
const leading_ws_ = find_first_non_ws(root_, cursel.cursor.row, self.metrics);
|
const leading_ws_ = find_first_non_ws(root_, cursel.cursor.row, self.metrics);
|
||||||
if (leading_ws_ > leading_ws and leading_ws_ > cursel.cursor.col) {
|
if (leading_ws_ > leading_ws and leading_ws_ > cursel.cursor.col) {
|
||||||
const sel = try cursel.enable_selection(root_, self.metrics);
|
const sel = cursel.enable_selection(root_, self.metrics);
|
||||||
sel.* = .{
|
sel.* = .{
|
||||||
.begin = .{ .row = cursel.cursor.row, .col = cursel.cursor.col },
|
.begin = .{ .row = cursel.cursor.row, .col = cursel.cursor.col },
|
||||||
.end = .{ .row = cursel.cursor.row, .col = leading_ws_ },
|
.end = .{ .row = cursel.cursor.row, .col = leading_ws_ },
|
||||||
|
|
@ -6164,7 +6164,7 @@ pub const Editor = struct {
|
||||||
state.chunks = 1;
|
state.chunks = 1;
|
||||||
primary.cursor = state.old_primary.cursor;
|
primary.cursor = state.old_primary.cursor;
|
||||||
} else {
|
} else {
|
||||||
const sel = try primary.enable_selection(root, self.metrics);
|
const sel = primary.enable_selection(root, self.metrics);
|
||||||
sel.begin = state.begin;
|
sel.begin = state.begin;
|
||||||
sel.end = state.pos.cursor;
|
sel.end = state.pos.cursor;
|
||||||
if (state.old_primary_reversed) sel.reverse();
|
if (state.old_primary_reversed) sel.reverse();
|
||||||
|
|
@ -6193,7 +6193,7 @@ pub const Editor = struct {
|
||||||
var root = root_;
|
var root = root_;
|
||||||
const saved = cursel.*;
|
const saved = cursel.*;
|
||||||
const sel = if (cursel.selection) |*sel| sel else ret: {
|
const sel = if (cursel.selection) |*sel| sel else ret: {
|
||||||
var sel = cursel.enable_selection(root, self.metrics) catch return error.Stop;
|
var sel = cursel.enable_selection(root, self.metrics);
|
||||||
move_cursor_word_begin(root, &sel.begin, self.metrics) catch return error.Stop;
|
move_cursor_word_begin(root, &sel.begin, self.metrics) catch return error.Stop;
|
||||||
move_cursor_word_end(root, &sel.end, self.metrics) catch return error.Stop;
|
move_cursor_word_end(root, &sel.end, self.metrics) catch return error.Stop;
|
||||||
break :ret sel;
|
break :ret sel;
|
||||||
|
|
@ -6222,7 +6222,7 @@ pub const Editor = struct {
|
||||||
var root = root_;
|
var root = root_;
|
||||||
const saved = cursel.*;
|
const saved = cursel.*;
|
||||||
const sel = if (cursel.selection) |*sel| sel else ret: {
|
const sel = if (cursel.selection) |*sel| sel else ret: {
|
||||||
var sel = cursel.enable_selection(root, self.metrics) catch return error.Stop;
|
var sel = cursel.enable_selection(root, self.metrics);
|
||||||
move_cursor_word_begin(root, &sel.begin, self.metrics) catch return error.Stop;
|
move_cursor_word_begin(root, &sel.begin, self.metrics) catch return error.Stop;
|
||||||
move_cursor_word_end(root, &sel.end, self.metrics) catch return error.Stop;
|
move_cursor_word_end(root, &sel.end, self.metrics) catch return error.Stop;
|
||||||
break :ret sel;
|
break :ret sel;
|
||||||
|
|
@ -6251,7 +6251,7 @@ pub const Editor = struct {
|
||||||
var root = root_;
|
var root = root_;
|
||||||
var saved = cursel.*;
|
var saved = cursel.*;
|
||||||
const sel = if (cursel.selection) |*sel| sel else ret: {
|
const sel = if (cursel.selection) |*sel| sel else ret: {
|
||||||
var sel = cursel.enable_selection(root, self.metrics) catch return error.Stop;
|
var sel = cursel.enable_selection(root, self.metrics);
|
||||||
move_cursor_right(root, &sel.end, self.metrics) catch return error.Stop;
|
move_cursor_right(root, &sel.end, self.metrics) catch return error.Stop;
|
||||||
saved.cursor = sel.end;
|
saved.cursor = sel.end;
|
||||||
break :ret sel;
|
break :ret sel;
|
||||||
|
|
|
||||||
|
|
@ -321,7 +321,7 @@ const cmds_ = struct {
|
||||||
_ = ctx.args.match(.{tp.extract(&repeat)}) catch false;
|
_ = ctx.args.match(.{tp.extract(&repeat)}) catch false;
|
||||||
while (repeat > 0) : (repeat -= 1) {
|
while (repeat > 0) : (repeat -= 1) {
|
||||||
for (ed.cursels.items) |*cursel_| if (cursel_.*) |*cursel| {
|
for (ed.cursels.items) |*cursel_| if (cursel_.*) |*cursel| {
|
||||||
const sel = try cursel.enable_selection(root, ed.metrics);
|
const sel = cursel.enable_selection(root, ed.metrics);
|
||||||
|
|
||||||
// handling left to right transition
|
// handling left to right transition
|
||||||
const sel_begin: i32 = @intCast(sel.begin.col);
|
const sel_begin: i32 = @intCast(sel.begin.col);
|
||||||
|
|
@ -567,7 +567,7 @@ fn select_inner_word(root: Buffer.Root, cursel: *CurSel, metrics: Buffer.Metrics
|
||||||
Editor.move_cursor_left_until(root, &prev, Editor.is_word_boundary_left, metrics);
|
Editor.move_cursor_left_until(root, &prev, Editor.is_word_boundary_left, metrics);
|
||||||
Editor.move_cursor_right_until(root, &next, Editor.is_word_boundary_right, metrics);
|
Editor.move_cursor_right_until(root, &next, Editor.is_word_boundary_right, metrics);
|
||||||
try next.move_right(root, metrics);
|
try next.move_right(root, metrics);
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
sel.begin = prev;
|
sel.begin = prev;
|
||||||
sel.end = next;
|
sel.end = next;
|
||||||
cursel.*.cursor = next;
|
cursel.*.cursor = next;
|
||||||
|
|
@ -580,7 +580,7 @@ fn select_inner_long_word(root: Buffer.Root, cursel: *CurSel, metrics: Buffer.Me
|
||||||
Editor.move_cursor_left_until(root, &prev, is_long_word_boundary_left, metrics);
|
Editor.move_cursor_left_until(root, &prev, is_long_word_boundary_left, metrics);
|
||||||
Editor.move_cursor_right_until(root, &next, is_long_word_boundary_right, metrics);
|
Editor.move_cursor_right_until(root, &next, is_long_word_boundary_right, metrics);
|
||||||
try next.move_right(root, metrics);
|
try next.move_right(root, metrics);
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
sel.begin = prev;
|
sel.begin = prev;
|
||||||
sel.end = next;
|
sel.end = next;
|
||||||
cursel.*.cursor = next;
|
cursel.*.cursor = next;
|
||||||
|
|
@ -601,7 +601,7 @@ fn select_around_word(root: Buffer.Root, cursel: *CurSel, metrics: Buffer.Metric
|
||||||
if (!cursel.cursor.test_at(root, Editor.is_word_char, metrics)) return;
|
if (!cursel.cursor.test_at(root, Editor.is_word_char, metrics)) return;
|
||||||
var expander = cursel.*;
|
var expander = cursel.*;
|
||||||
try select_inner_word(root, &expander, metrics);
|
try select_inner_word(root, &expander, metrics);
|
||||||
const sel_e = try expander.enable_selection(root, metrics);
|
const sel_e = expander.enable_selection(root, metrics);
|
||||||
var prev = sel_e.begin;
|
var prev = sel_e.begin;
|
||||||
var next = sel_e.end;
|
var next = sel_e.end;
|
||||||
if (next.test_at(root, is_tab_or_space, metrics)) {
|
if (next.test_at(root, is_tab_or_space, metrics)) {
|
||||||
|
|
@ -616,7 +616,7 @@ fn select_around_word(root: Buffer.Root, cursel: *CurSel, metrics: Buffer.Metric
|
||||||
prev = sel_e.begin;
|
prev = sel_e.begin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
sel.begin = prev;
|
sel.begin = prev;
|
||||||
sel.end = next;
|
sel.end = next;
|
||||||
cursel.*.cursor = next;
|
cursel.*.cursor = next;
|
||||||
|
|
@ -657,7 +657,7 @@ fn select_cursel_to_char_left_helix(root: Buffer.Root, cursel: *CurSel, ctx: com
|
||||||
//At end of file, it's ok
|
//At end of file, it's ok
|
||||||
};
|
};
|
||||||
moving_cursor.target = moving_cursor.col;
|
moving_cursor.target = moving_cursor.col;
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
sel.begin = begin;
|
sel.begin = begin;
|
||||||
sel.end = moving_cursor;
|
sel.end = moving_cursor;
|
||||||
cursel.cursor = moving_cursor;
|
cursel.cursor = moving_cursor;
|
||||||
|
|
@ -670,7 +670,7 @@ fn extend_cursel_to_char_left_helix(root: Buffer.Root, cursel: *CurSel, ctx: com
|
||||||
|
|
||||||
//Character found, selecting
|
//Character found, selecting
|
||||||
moving_cursor.target = moving_cursor.col;
|
moving_cursor.target = moving_cursor.col;
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
if (sel.empty())
|
if (sel.empty())
|
||||||
sel.begin = begin;
|
sel.begin = begin;
|
||||||
sel.end = moving_cursor;
|
sel.end = moving_cursor;
|
||||||
|
|
@ -687,7 +687,7 @@ fn select_cursel_till_char_left_helix(root: Buffer.Root, cursel: *CurSel, ctx: c
|
||||||
//At end of file, it's ok
|
//At end of file, it's ok
|
||||||
};
|
};
|
||||||
moving_cursor.target = moving_cursor.col;
|
moving_cursor.target = moving_cursor.col;
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
sel.begin = begin;
|
sel.begin = begin;
|
||||||
sel.end = moving_cursor;
|
sel.end = moving_cursor;
|
||||||
cursel.cursor = moving_cursor;
|
cursel.cursor = moving_cursor;
|
||||||
|
|
@ -700,7 +700,7 @@ fn extend_cursel_till_char_left_helix(root: Buffer.Root, cursel: *CurSel, ctx: c
|
||||||
|
|
||||||
//Character found, selecting
|
//Character found, selecting
|
||||||
moving_cursor.target = moving_cursor.col;
|
moving_cursor.target = moving_cursor.col;
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
if (sel.empty())
|
if (sel.empty())
|
||||||
sel.begin = begin;
|
sel.begin = begin;
|
||||||
sel.end = moving_cursor;
|
sel.end = moving_cursor;
|
||||||
|
|
@ -714,7 +714,7 @@ fn select_cursel_till_char_right_helix(root: Buffer.Root, cursel: *CurSel, ctx:
|
||||||
|
|
||||||
//Character found, selecting
|
//Character found, selecting
|
||||||
moving_cursor.target = moving_cursor.col;
|
moving_cursor.target = moving_cursor.col;
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
sel.begin = begin;
|
sel.begin = begin;
|
||||||
sel.end = moving_cursor;
|
sel.end = moving_cursor;
|
||||||
cursel.cursor = moving_cursor;
|
cursel.cursor = moving_cursor;
|
||||||
|
|
@ -727,7 +727,7 @@ fn extend_cursel_till_char_right_helix(root: Buffer.Root, cursel: *CurSel, ctx:
|
||||||
|
|
||||||
//Character found, selecting
|
//Character found, selecting
|
||||||
moving_cursor.target = moving_cursor.col;
|
moving_cursor.target = moving_cursor.col;
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
if (sel.empty())
|
if (sel.empty())
|
||||||
sel.begin = begin;
|
sel.begin = begin;
|
||||||
sel.end = moving_cursor;
|
sel.end = moving_cursor;
|
||||||
|
|
@ -744,7 +744,7 @@ fn select_cursel_to_char_right_helix(root: Buffer.Root, cursel: *CurSel, ctx: co
|
||||||
// We might be at end of file
|
// We might be at end of file
|
||||||
};
|
};
|
||||||
moving_cursor.target = moving_cursor.col;
|
moving_cursor.target = moving_cursor.col;
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
sel.begin = begin;
|
sel.begin = begin;
|
||||||
sel.end = moving_cursor;
|
sel.end = moving_cursor;
|
||||||
cursel.cursor = moving_cursor;
|
cursel.cursor = moving_cursor;
|
||||||
|
|
@ -760,7 +760,7 @@ fn extend_cursel_to_char_right_helix(root: Buffer.Root, cursel: *CurSel, ctx: co
|
||||||
// We might be at end of file
|
// We might be at end of file
|
||||||
};
|
};
|
||||||
moving_cursor.target = moving_cursor.col;
|
moving_cursor.target = moving_cursor.col;
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
if (sel.empty())
|
if (sel.empty())
|
||||||
sel.begin = begin;
|
sel.begin = begin;
|
||||||
sel.end = moving_cursor;
|
sel.end = moving_cursor;
|
||||||
|
|
@ -912,7 +912,7 @@ fn move_cursor_till_char_right_beyond_eol(root: Buffer.Root, cursor: *Cursor, me
|
||||||
|
|
||||||
fn add_cursors_to_cursel_line_ends_helix(ed: *Editor, root: Buffer.Root, cursel: *CurSel) !void {
|
fn add_cursors_to_cursel_line_ends_helix(ed: *Editor, root: Buffer.Root, cursel: *CurSel) !void {
|
||||||
const original_cursel = cursel.*;
|
const original_cursel = cursel.*;
|
||||||
const sel = try cursel.enable_selection(root, ed.metrics);
|
const sel = cursel.enable_selection(root, ed.metrics);
|
||||||
sel.normalize();
|
sel.normalize();
|
||||||
var row = sel.begin.row;
|
var row = sel.begin.row;
|
||||||
const is_multiline = sel.begin.row != sel.end.row;
|
const is_multiline = sel.begin.row != sel.end.row;
|
||||||
|
|
@ -1189,7 +1189,7 @@ fn select_char_if_no_selection(cursel: *CurSel, root: Buffer.Root, metrics: Buff
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
const sel = try cursel.enable_selection(root, metrics);
|
const sel = cursel.enable_selection(root, metrics);
|
||||||
sel.begin = .{ .row = cursel.cursor.row, .col = cursel.cursor.col + 1, .target = cursel.cursor.target + 1 };
|
sel.begin = .{ .row = cursel.cursor.row, .col = cursel.cursor.col + 1, .target = cursel.cursor.target + 1 };
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue