From 9e381c4d1ac96dc3388a025731cb04403bf78eb5 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Sun, 10 Mar 2024 22:27:06 +0100 Subject: [PATCH] feat: add smart_insert_line_before/_after commands closes #4 --- src/tui/editor.zig | 43 +++++++++++++++++++++++++++++++ src/tui/mode/input/flow.zig | 6 ++--- src/tui/mode/input/vim/insert.zig | 6 ++--- src/tui/mode/input/vim/normal.zig | 10 +++---- src/tui/mode/input/vim/visual.zig | 8 +++--- 5 files changed, 58 insertions(+), 15 deletions(-) diff --git a/src/tui/editor.zig b/src/tui/editor.zig index 6d0d176..de12e5c 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -2522,6 +2522,28 @@ pub const Editor = struct { self.clamp(); } + pub fn smart_insert_line_before(self: *Self, _: command.Context) tp.result { + const b = self.buf_for_update() catch |e| return tp.exit_error(e); + var root = b.root; + for (self.cursels.items) |*cursel_| if (cursel_.*) |*cursel| { + var leading_ws = @min(find_first_non_ws(root, cursel.cursor.row), cursel.cursor.col); + move_cursor_begin(root, &cursel.cursor) catch |e| return tp.exit_error(e); + root = self.insert(root, cursel, "\n", b.a) catch |e| return tp.exit_error(e); + move_cursor_left(root, &cursel.cursor) catch |e| return tp.exit_error(e); + var sfa = std.heap.stackFallback(512, self.a); + const a = sfa.get(); + var stream = std.ArrayList(u8).init(a); + defer stream.deinit(); + var writer = stream.writer(); + while (leading_ws > 0) : (leading_ws -= 1) + _ = writer.write(" ") catch |e| return tp.exit_error(e); + if (stream.items.len > 0) + root = self.insert(root, cursel, stream.items, b.a) catch |e| return tp.exit_error(e); + }; + self.update_buf(root) catch |e| return tp.exit_error(e); + self.clamp(); + } + pub fn insert_line_after(self: *Self, _: command.Context) tp.result { const b = self.buf_for_update() catch |e| return tp.exit_error(e); var root = b.root; @@ -2533,6 +2555,27 @@ pub const Editor = struct { self.clamp(); } + pub fn smart_insert_line_after(self: *Self, _: command.Context) tp.result { + const b = self.buf_for_update() catch |e| return tp.exit_error(e); + var root = b.root; + for (self.cursels.items) |*cursel_| if (cursel_.*) |*cursel| { + var leading_ws = @min(find_first_non_ws(root, cursel.cursor.row), cursel.cursor.col); + move_cursor_end(root, &cursel.cursor) catch |e| return tp.exit_error(e); + var sfa = std.heap.stackFallback(512, self.a); + const a = sfa.get(); + var stream = std.ArrayList(u8).init(a); + defer stream.deinit(); + var writer = stream.writer(); + _ = writer.write("\n") catch |e| return tp.exit_error(e); + while (leading_ws > 0) : (leading_ws -= 1) + _ = writer.write(" ") catch |e| return tp.exit_error(e); + if (stream.items.len > 0) + root = self.insert(root, cursel, stream.items, b.a) catch |e| return tp.exit_error(e); + }; + self.update_buf(root) catch |e| return tp.exit_error(e); + self.clamp(); + } + pub fn enable_fast_scroll(self: *Self, _: command.Context) tp.result { self.fast_scroll = true; } diff --git a/src/tui/mode/input/flow.zig b/src/tui/mode/input/flow.zig index c3ffe3b..4783dac 100644 --- a/src/tui/mode/input/flow.zig +++ b/src/tui/mode/input/flow.zig @@ -97,7 +97,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { 'A' => self.cmd("select_all", .{}), 'I' => self.insert_bytes("\t"), '/' => self.cmd("toggle_comment", .{}), - key.ENTER => self.cmd("insert_line_after", .{}), + key.ENTER => self.cmd("smart_insert_line_after", .{}), key.SPACE => self.cmd("selections_reverse", .{}), key.END => self.cmd("move_buffer_end", .{}), key.HOME => self.cmd("move_buffer_begin", .{}), @@ -120,7 +120,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { 'L' => self.cmd_async("toggle_logview"), 'I' => self.cmd_async("toggle_inputview"), '/' => self.cmd("log_widgets", .{}), - key.ENTER => self.cmd("insert_line_before", .{}), + key.ENTER => self.cmd("smart_insert_line_before", .{}), key.END => self.cmd("select_buffer_end", .{}), key.HOME => self.cmd("select_buffer_begin", .{}), key.UP => self.cmd("select_scroll_up", .{}), @@ -169,7 +169,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { key.END => self.cmd("select_end", .{}), key.PGUP => self.cmd("select_page_up", .{}), key.PGDOWN => self.cmd("select_page_down", .{}), - key.ENTER => self.cmd("insert_line_before", .{}), + key.ENTER => self.cmd("smart_insert_line_before", .{}), key.BACKSPACE => self.cmd("delete_backward", .{}), key.TAB => self.cmd("unindent", .{}), else => if (!key.synthesized_p(keypress)) diff --git a/src/tui/mode/input/vim/insert.zig b/src/tui/mode/input/vim/insert.zig index 3eb7054..0acb93b 100644 --- a/src/tui/mode/input/vim/insert.zig +++ b/src/tui/mode/input/vim/insert.zig @@ -98,7 +98,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { 'A' => self.cmd("select_all", .{}), 'I' => self.insert_bytes("\t"), '/' => self.cmd("toggle_comment", .{}), - key.ENTER => self.cmd("insert_line_after", .{}), + key.ENTER => self.cmd("smart_insert_line_after", .{}), key.SPACE => self.cmd("selections_reverse", .{}), key.END => self.cmd("move_buffer_end", .{}), key.HOME => self.cmd("move_buffer_begin", .{}), @@ -121,7 +121,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { 'L' => self.cmd_async("toggle_logview"), 'I' => self.cmd_async("toggle_inputview"), '/' => self.cmd("log_widgets", .{}), - key.ENTER => self.cmd("insert_line_before", .{}), + key.ENTER => self.cmd("smart_insert_line_before", .{}), key.END => self.cmd("select_buffer_end", .{}), key.HOME => self.cmd("select_buffer_begin", .{}), key.UP => self.cmd("select_scroll_up", .{}), @@ -168,7 +168,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { key.END => self.cmd("select_end", .{}), key.PGUP => self.cmd("select_page_up", .{}), key.PGDOWN => self.cmd("select_page_down", .{}), - key.ENTER => self.cmd("insert_line_before", .{}), + key.ENTER => self.cmd("smart_insert_line_before", .{}), key.BACKSPACE => self.cmd("delete_backward", .{}), key.TAB => self.cmd("unindent", .{}), else => if (!key.synthesized_p(keypress)) diff --git a/src/tui/mode/input/vim/normal.zig b/src/tui/mode/input/vim/normal.zig index 222dd91..3f95f2f 100644 --- a/src/tui/mode/input/vim/normal.zig +++ b/src/tui/mode/input/vim/normal.zig @@ -101,7 +101,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { 'G' => self.cmd("enter_goto_mode", .{}), 'A' => self.cmd("select_all", .{}), '/' => self.cmd("toggle_comment", .{}), - key.ENTER => self.cmd("insert_line_after", .{}), + key.ENTER => self.cmd("smart_insert_line_after", .{}), key.SPACE => self.cmd("selections_reverse", .{}), key.END => self.cmd("move_buffer_end", .{}), key.HOME => self.cmd("move_buffer_begin", .{}), @@ -124,7 +124,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { 'L' => self.cmd_async("toggle_logview"), 'I' => self.cmd_async("toggle_inputview"), '/' => self.cmd("log_widgets", .{}), - key.ENTER => self.cmd("insert_line_before", .{}), + key.ENTER => self.cmd("smart_insert_line_before", .{}), key.END => self.cmd("select_buffer_end", .{}), key.HOME => self.cmd("select_buffer_begin", .{}), key.UP => self.cmd("select_scroll_up", .{}), @@ -173,7 +173,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { key.END => self.cmd("select_end", .{}), key.PGUP => self.cmd("select_page_up", .{}), key.PGDOWN => self.cmd("select_page_down", .{}), - key.ENTER => self.cmd("insert_line_before", .{}), + key.ENTER => self.cmd("smart_insert_line_before", .{}), key.BACKSPACE => self.cmd("delete_backward", .{}), key.TAB => self.cmd("unindent", .{}), @@ -190,7 +190,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { try self.cmd_count("move_down", .{}); }, - 'O' => self.seq(.{ "insert_line_before", "enter_mode" }, command.fmt(.{"vim/insert"})), + 'O' => self.seq(.{ "smart_insert_line_before", "enter_mode" }, command.fmt(.{"vim/insert"})), else => {}, }, @@ -252,7 +252,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { 'y' => self.leader = .{ .keypress = keynormal, .modifiers = modifiers }, 'p' => self.cmd("paste", .{}), - 'o' => self.seq(.{ "insert_line_after", "enter_mode" }, command.fmt(.{"vim/insert"})), + 'o' => self.seq(.{ "smart_insert_line_after", "enter_mode" }, command.fmt(.{"vim/insert"})), key.LEFT => self.cmd("move_left", .{}), key.RIGHT => self.cmd("move_right", .{}), diff --git a/src/tui/mode/input/vim/visual.zig b/src/tui/mode/input/vim/visual.zig index eab013b..7796507 100644 --- a/src/tui/mode/input/vim/visual.zig +++ b/src/tui/mode/input/vim/visual.zig @@ -101,7 +101,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { 'G' => self.cmd("enter_goto_mode", .{}), 'A' => self.cmd("select_all", .{}), '/' => self.cmd("toggle_comment", .{}), - key.ENTER => self.cmd("insert_line_after", .{}), + key.ENTER => self.cmd("smart_insert_line_after", .{}), key.SPACE => self.cmd("selections_reverse", .{}), key.END => self.cmd("select_buffer_end", .{}), key.HOME => self.cmd("select_buffer_begin", .{}), @@ -124,7 +124,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { 'L' => self.cmd_async("toggle_logview"), 'I' => self.cmd_async("toggle_inputview"), '/' => self.cmd("log_widgets", .{}), - key.ENTER => self.cmd("insert_line_before", .{}), + key.ENTER => self.cmd("smart_insert_line_before", .{}), key.END => self.cmd("select_buffer_end", .{}), key.HOME => self.cmd("select_buffer_begin", .{}), key.UP => self.cmd("select_scroll_up", .{}), @@ -169,7 +169,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { key.END => self.cmd("select_end", .{}), key.PGUP => self.cmd("select_page_up", .{}), key.PGDOWN => self.cmd("select_page_down", .{}), - key.ENTER => self.cmd("insert_line_before", .{}), + key.ENTER => self.cmd("smart_insert_line_before", .{}), key.BACKSPACE => self.cmd("delete_backward", .{}), key.TAB => self.cmd("unindent", .{}), @@ -186,7 +186,7 @@ fn mapPress(self: *Self, keypress: u32, egc: u32, modifiers: u32) tp.result { try self.cmd_count("move_down", .{}); }, - 'O' => self.seq(.{ "insert_line_before", "enter_mode" }, command.fmt(.{"vim/insert"})), + 'O' => self.seq(.{ "smart_insert_line_before", "enter_mode" }, command.fmt(.{"vim/insert"})), else => {}, },