summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Uko Kokņevičs2021-12-21 06:07:05 +0200
committerGravatar Uko Kokņevičs2021-12-21 06:07:05 +0200
commitaab641ba28606bb5ed84a774161ec696b469ee0e (patch)
tree596996c05ee38e428bb54ee35e7422487c058e3c
parentInitial config (diff)
downloades-aab641ba28606bb5ed84a774161ec696b469ee0e.tar.gz
es-aab641ba28606bb5ed84a774161ec696b469ee0e.tar.xz
es-aab641ba28606bb5ed84a774161ec696b469ee0e.zip
Added M-g g
-rw-r--r--src/Buffer.zig19
-rw-r--r--src/key_state.zig17
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.
255pub 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
254pub fn insertChar(self: *Buffer, char: u8) !void { 273pub 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;
19pub const KeyState = fn(*Editor, *Buffer, Key) Error!void; 19pub const KeyState = fn(*Editor, *Buffer, Key) Error!void;
20 20
21pub 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
21pub fn cxState(editor: *Editor, buf: *Buffer, key: Key) Error!void { 33pub 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-<*> ==========