From aab641ba28606bb5ed84a774161ec696b469ee0e Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Tue, 21 Dec 2021 06:07:05 +0200 Subject: Added M-g g --- src/Buffer.zig | 19 +++++++++++++++++++ src/key_state.zig | 17 ++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/Buffer.zig b/src/Buffer.zig index 1ddac45..8f90ed1 100644 --- a/src/Buffer.zig +++ b/src/Buffer.zig @@ -251,6 +251,25 @@ pub fn forwardChar(self: *Buffer) void { } } +// TODO: Make use of the callback feature to go to the final line while typing in. +pub fn goToLine(self: *Buffer, editor: *Editor) !void { + if (try editor.prompt("Goto line")) |line_str| { + defer editor.allocator.free(line_str); + + const line = std.fmt.parseUnsigned(usize, line_str, 0) catch |err| { + try editor.setStatusMessage("Couldn't parse '{s}' as an integer: {}", .{line_str, err}); + return; + }; + + self.cy = std.math.min(line - 1, self.rows.items.len); + if (self.cy == self.rows.items.len) { + self.cx = 0; + } else { + self.cx = std.math.min(self.cx, self.rows.items[self.cy].data.items.len); + } + } +} + pub fn insertChar(self: *Buffer, char: u8) !void { if (self.cy == self.rows.items.len) { try self.insertRow(self.rows.items.len, ""); diff --git a/src/key_state.zig b/src/key_state.zig index b5b16ee..19177cf 100644 --- a/src/key_state.zig +++ b/src/key_state.zig @@ -18,8 +18,19 @@ pub const Error = error{ std.os.SchedYieldError; pub const KeyState = fn(*Editor, *Buffer, Key) Error!void; +pub fn mgState(editor: *Editor, buf: *Buffer, key: Key) Error!void { + editor.current_state = defaultState; + editor.clearStatusMessage(); + + switch (key) { + // ========== <*> ========== + Key.char('g') => try buf.goToLine(editor), + + else => try editor.setStatusMessage("Unknown chord: M-g {}", .{key}), + } +} + pub fn cxState(editor: *Editor, buf: *Buffer, key: Key) Error!void { - _ = buf; editor.current_state = defaultState; editor.clearStatusMessage(); @@ -44,6 +55,10 @@ pub fn defaultState(editor: *Editor, buf: *Buffer, key: Key) Error!void { Key.metaCtrl('d'), Key.backspace => try buf.backwardDeleteChar(), // ========== M-<*> ========== + Key.meta('g') => { + editor.current_state = mgState; + try editor.setStatusMessage("M-g-", .{}); + }, Key.meta('v'), Key.page_up => buf.pageUp(editor.screenrows), // ========== C-<*> ========== -- cgit v1.2.3