Compare commits

..

7 commits

2 changed files with 30 additions and 22 deletions

View file

@ -627,7 +627,7 @@ pub const Editor = struct {
Widget.need_render(); Widget.need_render();
} }
pub fn buf_for_update(self: *Self) !*const Buffer { pub fn buf_for_update(self: *Self) error{ Stop, OutOfMemory }!*const Buffer {
if (!self.pause_undo) { if (!self.pause_undo) {
self.cursels_saved.clearAndFree(self.allocator); self.cursels_saved.clearAndFree(self.allocator);
self.cursels_saved = try self.cursels.clone(self.allocator); self.cursels_saved = try self.cursels.clone(self.allocator);
@ -635,19 +635,19 @@ pub const Editor = struct {
return self.buffer orelse error.Stop; return self.buffer orelse error.Stop;
} }
pub fn buf_root(self: *const Self) !Buffer.Root { pub fn buf_root(self: *const Self) error{Stop}!Buffer.Root {
return if (self.buffer) |p| p.root else error.Stop; return if (self.buffer) |p| p.root else error.Stop;
} }
fn buf_eol_mode(self: *const Self) !Buffer.EolMode { fn buf_eol_mode(self: *const Self) error{Stop}!Buffer.EolMode {
return if (self.buffer) |p| p.file_eol_mode else error.Stop; return if (self.buffer) |p| p.file_eol_mode else error.Stop;
} }
fn buf_utf8_sanitized(self: *const Self) !bool { fn buf_utf8_sanitized(self: *const Self) error{Stop}!bool {
return if (self.buffer) |p| p.file_utf8_sanitized else error.Stop; return if (self.buffer) |p| p.file_utf8_sanitized else error.Stop;
} }
fn buf_a(self: *const Self) !Allocator { fn buf_a(self: *const Self) error{Stop}!Allocator {
return if (self.buffer) |p| p.allocator else error.Stop; return if (self.buffer) |p| p.allocator else error.Stop;
} }
@ -2623,8 +2623,9 @@ pub const Editor = struct {
primary.disable_selection(root, self.metrics); primary.disable_selection(root, self.metrics);
self.selection_mode = .word; self.selection_mode = .word;
primary.cursor.move_abs(root, &self.view, @intCast(y), @intCast(x), self.metrics) catch return; primary.cursor.move_abs(root, &self.view, @intCast(y), @intCast(x), self.metrics) catch return;
_ = try self.select_word_at_cursor(primary); self.selection_drag_initial = self.select_word_at_cursor(primary) catch |e| switch (e) {
self.selection_drag_initial = primary.selection; error.Stop => primary.to_selection_normal(),
};
self.collapse_cursors(); self.collapse_cursors();
self.clamp_mouse(); self.clamp_mouse();
} }
@ -2635,8 +2636,15 @@ pub const Editor = struct {
primary.disable_selection(root, self.metrics); primary.disable_selection(root, self.metrics);
self.selection_mode = .line; self.selection_mode = .line;
primary.cursor.move_abs(root, &self.view, @intCast(y), @intCast(x), self.metrics) catch return; primary.cursor.move_abs(root, &self.view, @intCast(y), @intCast(x), self.metrics) catch return;
try self.select_line_at_cursor(root, primary, .exclude_eol); blk: {
self.select_line_at_cursor(root, primary, .exclude_eol) catch |e| switch (e) {
error.Stop => {
self.selection_drag_initial = primary.to_selection_normal();
break :blk;
},
};
self.selection_drag_initial = primary.selection; self.selection_drag_initial = primary.selection;
}
self.collapse_cursors(); self.collapse_cursors();
self.clamp_mouse(); self.clamp_mouse();
} }
@ -2652,23 +2660,23 @@ pub const Editor = struct {
switch (self.selection_mode) { switch (self.selection_mode) {
.char => {}, .char => {},
.word => { .word => {
if (sel.begin.right_of(sel.end)) { if (sel.is_reversed()) {
sel.begin = initial.end; sel.begin = initial.end;
with_selection_const(root, move_cursor_word_begin, primary, self.metrics) catch {}; move_cursor_word_begin(root, &sel.end, self.metrics) catch {};
} else { } else {
sel.begin = initial.begin; sel.begin = initial.begin;
with_selection_const(root, move_cursor_word_end, primary, self.metrics) catch {}; move_cursor_word_end(root, &sel.end, self.metrics) catch {};
} }
}, },
.line => { .line => {
if (sel.begin.right_of(sel.end)) { if (sel.is_reversed()) {
sel.begin = initial.end; sel.begin = initial.end;
with_selection_const(root, move_cursor_begin, primary, self.metrics) catch {}; move_cursor_begin(root, &sel.end, self.metrics) catch {};
} else { } else {
sel.begin = initial.begin; sel.begin = initial.begin;
blk: { blk: {
with_selection_const(root, move_cursor_end, primary, self.metrics) catch break :blk; move_cursor_end(root, &sel.end, self.metrics) catch break :blk;
with_selection_const(root, move_cursor_right, primary, self.metrics) catch {}; move_cursor_right(root, &sel.end, self.metrics) catch {};
} }
} }
}, },
@ -2840,8 +2848,8 @@ pub const Editor = struct {
fn copy_word_at_cursor(self: *Self, text_allocator: Allocator) ![]const u8 { fn copy_word_at_cursor(self: *Self, text_allocator: Allocator) ![]const u8 {
const root = try self.buf_root(); const root = try self.buf_root();
const primary = self.get_primary(); const primary = self.get_primary();
const sel = if (primary.selection) |*sel| sel else try self.select_word_at_cursor(primary); const sel = if (primary.selection) |sel| sel else try self.select_word_at_cursor(primary);
return try copy_selection(root, sel.*, text_allocator, self.metrics); return try copy_selection(root, sel, text_allocator, self.metrics);
} }
pub fn cut_selection(self: *Self, root: Buffer.Root, cursel: *CurSel, text_allocator: Allocator) !struct { []const u8, Buffer.Root } { pub fn cut_selection(self: *Self, root: Buffer.Root, cursel: *CurSel, text_allocator: Allocator) !struct { []const u8, Buffer.Root } {
@ -4531,7 +4539,7 @@ pub const Editor = struct {
} }
pub const select_all_meta: Meta = .{ .description = "Select all" }; pub const select_all_meta: Meta = .{ .description = "Select all" };
fn select_word_at_cursor(self: *Self, cursel: *CurSel) !*Selection { fn select_word_at_cursor(self: *Self, cursel: *CurSel) error{Stop}!Selection {
const root = try self.buf_root(); const root = try self.buf_root();
const sel = 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);
@ -4539,7 +4547,7 @@ pub const Editor = struct {
try move_cursor_word_begin(root, &sel.begin, self.metrics); try move_cursor_word_begin(root, &sel.begin, self.metrics);
move_cursor_word_end(root, &sel.end, self.metrics) catch {}; move_cursor_word_end(root, &sel.end, self.metrics) catch {};
cursel.cursor = sel.end; cursel.cursor = sel.end;
return sel; return sel.*;
} }
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 {

View file

@ -785,10 +785,10 @@ const cmds = struct {
var existing = false; var existing = false;
if (self.buffer_manager.get_buffer_for_file(file_path)) |new_buffer| { if (self.buffer_manager.get_buffer_for_file(file_path)) |new_buffer| {
if (new_buffer.is_dirty())
return tp.exit("save as would overwrite unsaved changes");
if (buffer == new_buffer) if (buffer == new_buffer)
return tp.exit("same file"); return tp.exit("same file");
if (new_buffer.is_dirty())
return tp.exit("save as would overwrite unsaved changes");
existing = true; existing = true;
} }
try self.create_editor(); try self.create_editor();