From 2ea8a6e55bbbcd16081388787cce3476e6c882f2 Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Wed, 21 Feb 2024 23:15:22 +0200 Subject: Add functionality for skipping words left and right --- src/Buffer.zig | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/KeyMap.zig | 6 ++++++ 2 files changed, 50 insertions(+) (limited to 'src') diff --git a/src/Buffer.zig b/src/Buffer.zig index bb6d3ce..26f9a93 100644 --- a/src/Buffer.zig +++ b/src/Buffer.zig @@ -110,6 +110,26 @@ pub fn backwardParagraph(self: *Buffer) void { self.cx = 0; } +pub fn backwardWord(self: *Buffer) void { + if (self.cx == 0) { + return self.backwardChar(); + } + + const chars = self.rows.items[self.cy].data.items; + // First we skip non-word + while (self.cx > 0) : (self.cx -= 1) { + if (std.ascii.isAlphanumeric(chars[self.cx - 1])) { + break; + } + } + // Then we skip word + while (self.cx > 0) : (self.cx -= 1) { + if (!std.ascii.isAlphanumeric(chars[self.cx - 1])) { + break; + } + } +} + pub fn cleanWhiteSpace(self: *Buffer) !void { for (self.rows.items) |*row| { try row.cleanWhiteSpace(self); @@ -304,6 +324,30 @@ pub fn forwardParagraph(self: *Buffer) void { self.cx = 0; } +pub fn forwardWord(self: *Buffer) void { + if (self.cy == self.rows.items.len) { + return; + } + + const chars = self.rows.items[self.cy].data.items; + if (self.cx == chars.len) { + return self.forwardChar(); + } + + // First we skip non-word + while (self.cx < chars.len) : (self.cx += 1) { + if (std.ascii.isAlphanumeric(chars[self.cx])) { + break; + } + } + // Then we skip word + while (self.cx < chars.len) : (self.cx += 1) { + if (!std.ascii.isAlphanumeric(chars[self.cx])) { + break; + } + } +} + // 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(self.allocator, "Goto line")) |line_str| { diff --git a/src/KeyMap.zig b/src/KeyMap.zig index 90dcd01..8dca48d 100644 --- a/src/KeyMap.zig +++ b/src/KeyMap.zig @@ -113,7 +113,11 @@ pub fn defaultMap(allocator: Allocator) !KeyMap { // M-<*> try map.bind(&.{Key.meta(Key.down)}, Buffer.forwardParagraph); + try map.bind(&.{Key.meta(Key.left)}, Buffer.backwardWord); + try map.bind(&.{Key.meta(Key.right)}, Buffer.forwardWord); try map.bind(&.{Key.meta(Key.up)}, Buffer.backwardParagraph); + try map.bind(&.{Key.meta('b')}, Buffer.backwardWord); + try map.bind(&.{Key.meta('f')}, Buffer.forwardWord); // M-g is taken try map.bind(&.{Key.meta('n')}, Buffer.forwardParagraph); // M-O is taken @@ -122,6 +126,8 @@ pub fn defaultMap(allocator: Allocator) !KeyMap { // C-<*> try map.bind(&.{Key.ctrl(Key.down)}, Buffer.forwardParagraph); + try map.bind(&.{Key.ctrl(Key.left)}, Buffer.backwardWord); + try map.bind(&.{Key.ctrl(Key.right)}, Buffer.forwardWord); try map.bind(&.{Key.ctrl(Key.up)}, Buffer.backwardParagraph); try map.bind(&.{Key.ctrl('a')}, Buffer.moveBeginningOfLine); try map.bind(&.{Key.ctrl('b')}, Buffer.backwardChar); -- cgit v1.2.3