diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Buffer.zig | 19 | ||||
| -rw-r--r-- | src/key_state.zig | 17 |
2 files changed, 35 insertions, 1 deletions
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 { | |||
| 251 | } | 251 | } |
| 252 | } | 252 | } |
| 253 | 253 | ||
| 254 | // TODO: Make use of the callback feature to go to the final line while typing in. | ||
| 255 | pub fn goToLine(self: *Buffer, editor: *Editor) !void { | ||
| 256 | if (try editor.prompt("Goto line")) |line_str| { | ||
| 257 | defer editor.allocator.free(line_str); | ||
| 258 | |||
| 259 | const line = std.fmt.parseUnsigned(usize, line_str, 0) catch |err| { | ||
| 260 | try editor.setStatusMessage("Couldn't parse '{s}' as an integer: {}", .{line_str, err}); | ||
| 261 | return; | ||
| 262 | }; | ||
| 263 | |||
| 264 | self.cy = std.math.min(line - 1, self.rows.items.len); | ||
| 265 | if (self.cy == self.rows.items.len) { | ||
| 266 | self.cx = 0; | ||
| 267 | } else { | ||
| 268 | self.cx = std.math.min(self.cx, self.rows.items[self.cy].data.items.len); | ||
| 269 | } | ||
| 270 | } | ||
| 271 | } | ||
| 272 | |||
| 254 | pub fn insertChar(self: *Buffer, char: u8) !void { | 273 | pub fn insertChar(self: *Buffer, char: u8) !void { |
| 255 | if (self.cy == self.rows.items.len) { | 274 | if (self.cy == self.rows.items.len) { |
| 256 | try self.insertRow(self.rows.items.len, ""); | 275 | 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{ | |||
| 18 | std.os.SchedYieldError; | 18 | std.os.SchedYieldError; |
| 19 | pub const KeyState = fn(*Editor, *Buffer, Key) Error!void; | 19 | pub const KeyState = fn(*Editor, *Buffer, Key) Error!void; |
| 20 | 20 | ||
| 21 | pub fn mgState(editor: *Editor, buf: *Buffer, key: Key) Error!void { | ||
| 22 | editor.current_state = defaultState; | ||
| 23 | editor.clearStatusMessage(); | ||
| 24 | |||
| 25 | switch (key) { | ||
| 26 | // ========== <*> ========== | ||
| 27 | Key.char('g') => try buf.goToLine(editor), | ||
| 28 | |||
| 29 | else => try editor.setStatusMessage("Unknown chord: M-g {}", .{key}), | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 21 | pub fn cxState(editor: *Editor, buf: *Buffer, key: Key) Error!void { | 33 | pub fn cxState(editor: *Editor, buf: *Buffer, key: Key) Error!void { |
| 22 | _ = buf; | ||
| 23 | editor.current_state = defaultState; | 34 | editor.current_state = defaultState; |
| 24 | editor.clearStatusMessage(); | 35 | editor.clearStatusMessage(); |
| 25 | 36 | ||
| @@ -44,6 +55,10 @@ pub fn defaultState(editor: *Editor, buf: *Buffer, key: Key) Error!void { | |||
| 44 | Key.metaCtrl('d'), Key.backspace => try buf.backwardDeleteChar(), | 55 | Key.metaCtrl('d'), Key.backspace => try buf.backwardDeleteChar(), |
| 45 | 56 | ||
| 46 | // ========== M-<*> ========== | 57 | // ========== M-<*> ========== |
| 58 | Key.meta('g') => { | ||
| 59 | editor.current_state = mgState; | ||
| 60 | try editor.setStatusMessage("M-g-", .{}); | ||
| 61 | }, | ||
| 47 | Key.meta('v'), Key.page_up => buf.pageUp(editor.screenrows), | 62 | Key.meta('v'), Key.page_up => buf.pageUp(editor.screenrows), |
| 48 | 63 | ||
| 49 | // ========== C-<*> ========== | 64 | // ========== C-<*> ========== |