From e39d9ed4b36a7716344ab968fa3a9d8b2b4e46b1 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Mon, 28 Apr 2025 16:46:36 +0200 Subject: [PATCH] fix: render control codes in mini buffer input with unicode control code symbols closes #236 --- src/renderer/vaxis/Plane.zig | 15 +++++++++++++++ src/tui/mode/mini/buffer.zig | 2 +- src/tui/mode/mini/file_browser.zig | 6 +++--- src/tui/mode/mini/find.zig | 2 +- src/tui/mode/mini/find_in_files.zig | 2 +- src/tui/mode/mini/goto.zig | 2 +- src/tui/status/filestate.zig | 3 ++- 7 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/renderer/vaxis/Plane.zig b/src/renderer/vaxis/Plane.zig index a3a5c23..81384d6 100644 --- a/src/renderer/vaxis/Plane.zig +++ b/src/renderer/vaxis/Plane.zig @@ -202,6 +202,21 @@ pub fn putstr(self: *Plane, text: []const u8) !usize { return result; } +pub fn putstr_unicode(self: *Plane, text: []const u8) !usize { + var result: usize = 0; + var iter = self.window.screen.unicode.graphemeIterator(text); + while (iter.next()) |grapheme| { + const s_ = grapheme.bytes(text); + const s = switch (s_[0]) { + 0...31 => |code| Buffer.unicode.control_code_to_unicode(code), + else => s_, + }; + self.write_cell(@intCast(self.col), @intCast(self.row), s); + result += 1; + } + return result; +} + pub fn putc(self: *Plane, cell: *const Cell) !usize { return self.putc_yx(@intCast(self.row), @intCast(self.col), cell); } diff --git a/src/tui/mode/mini/buffer.zig b/src/tui/mode/mini/buffer.zig index bb1ac30..35af902 100644 --- a/src/tui/mode/mini/buffer.zig +++ b/src/tui/mode/mini/buffer.zig @@ -60,7 +60,7 @@ pub fn Create(options: type) type { fn update_mini_mode_text(self: *Self) void { if (tui.mini_mode()) |mini_mode| { mini_mode.text = self.input.items; - mini_mode.cursor = tui.egc_chunk_width(self.input.items, 0, 8); + mini_mode.cursor = tui.egc_chunk_width(self.input.items, 0, 1); } } diff --git a/src/tui/mode/mini/file_browser.zig b/src/tui/mode/mini/file_browser.zig index 97a5bce..4b5da15 100644 --- a/src/tui/mode/mini/file_browser.zig +++ b/src/tui/mode/mini/file_browser.zig @@ -115,7 +115,7 @@ pub fn Create(options: type) type { } if (tui.mini_mode()) |mini_mode| { mini_mode.text = self.file_path.items; - mini_mode.cursor = tui.egc_chunk_width(self.file_path.items, 0, 8); + mini_mode.cursor = tui.egc_chunk_width(self.file_path.items, 0, 1); } return; } @@ -139,7 +139,7 @@ pub fn Create(options: type) type { defer { if (tui.mini_mode()) |mini_mode| { mini_mode.text = self.file_path.items; - mini_mode.cursor = tui.egc_chunk_width(self.file_path.items, 0, 8); + mini_mode.cursor = tui.egc_chunk_width(self.file_path.items, 0, 1); } } var count: usize = undefined; @@ -243,7 +243,7 @@ pub fn Create(options: type) type { fn update_mini_mode_text(self: *Self) void { if (tui.mini_mode()) |mini_mode| { mini_mode.text = self.file_path.items; - mini_mode.cursor = tui.egc_chunk_width(self.file_path.items, 0, 8); + mini_mode.cursor = tui.egc_chunk_width(self.file_path.items, 0, 1); } } diff --git a/src/tui/mode/mini/find.zig b/src/tui/mode/mini/find.zig index 39b628f..30b4976 100644 --- a/src/tui/mode/mini/find.zig +++ b/src/tui/mode/mini/find.zig @@ -142,7 +142,7 @@ fn load_history(self: *Self, pos: usize) void { fn update_mini_mode_text(self: *Self) void { if (tui.mini_mode()) |mini_mode| { mini_mode.text = self.input_.items; - mini_mode.cursor = tui.egc_chunk_width(self.input_.items, 0, 8); + mini_mode.cursor = tui.egc_chunk_width(self.input_.items, 0, 1); } } diff --git a/src/tui/mode/mini/find_in_files.zig b/src/tui/mode/mini/find_in_files.zig index 9704f03..4680d22 100644 --- a/src/tui/mode/mini/find_in_files.zig +++ b/src/tui/mode/mini/find_in_files.zig @@ -83,7 +83,7 @@ fn start_query(self: *Self) !void { fn update_mini_mode_text(self: *Self) void { if (tui.mini_mode()) |mini_mode| { mini_mode.text = self.input_; - mini_mode.cursor = tui.egc_chunk_width(self.input_, 0, 8); + mini_mode.cursor = tui.egc_chunk_width(self.input_, 0, 1); } } diff --git a/src/tui/mode/mini/goto.zig b/src/tui/mode/mini/goto.zig index ec18e48..c71a0bd 100644 --- a/src/tui/mode/mini/goto.zig +++ b/src/tui/mode/mini/goto.zig @@ -54,7 +54,7 @@ fn update_mini_mode_text(self: *Self) void { (fmt.bufPrint(&self.buf, "{d}", .{linenum}) catch "") else ""; - mini_mode.cursor = tui.egc_chunk_width(mini_mode.text, 0, 8); + mini_mode.cursor = tui.egc_chunk_width(mini_mode.text, 0, 1); } } diff --git a/src/tui/status/filestate.zig b/src/tui/status/filestate.zig index 9ecc932..5bd7f7e 100644 --- a/src/tui/status/filestate.zig +++ b/src/tui/status/filestate.zig @@ -104,7 +104,8 @@ pub fn render(self: *Self, btn: *Button.State(Self), theme: *const Widget.Theme) fn render_mini_mode(plane: *Plane, theme: *const Widget.Theme) void { plane.off_styles(styles.italic); const mini_mode = tui.mini_mode() orelse return; - _ = plane.print(" {s}", .{mini_mode.text}) catch {}; + _ = plane.putstr_unicode(" ") catch {}; + _ = plane.putstr_unicode(mini_mode.text) catch {}; if (mini_mode.cursor) |cursor| { const pos: c_int = @intCast(cursor); if (tui.config().enable_terminal_cursor) {