feat: add smart_insert_line_before/_after commands

closes #4
This commit is contained in:
CJ van den Berg 2024-03-10 22:27:06 +01:00
parent 6d3cf2df06
commit 9e381c4d1a
5 changed files with 58 additions and 15 deletions

View file

@ -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;
}

View file

@ -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))

View file

@ -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))

View file

@ -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", .{}),

View file

@ -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 => {},
},