Merge branch 'master' into zig-0.15.0

This commit is contained in:
CJ van den Berg 2025-08-01 23:33:53 +02:00
commit fbed6c648a
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9
2 changed files with 53 additions and 6 deletions

View file

@ -372,7 +372,7 @@ pub const Editor = struct {
const Result = command.Result;
pub fn write_state(self: *const Self, writer: Buffer.MetaWriter) !void {
try cbor.writeArrayHeader(writer, 11);
try cbor.writeArrayHeader(writer, 12);
try cbor.writeValue(writer, self.file_path orelse "");
try cbor.writeValue(writer, self.clipboard orelse "");
try cbor.writeValue(writer, self.last_find_query orelse "");
@ -381,6 +381,7 @@ pub const Editor = struct {
try cbor.writeValue(writer, self.indent_size);
try cbor.writeValue(writer, self.tab_width);
try cbor.writeValue(writer, self.indent_mode);
try cbor.writeValue(writer, self.syntax_no_render);
if (self.find_history) |history| {
try cbor.writeArrayHeader(writer, history.items.len);
for (history.items) |item|
@ -419,6 +420,7 @@ pub const Editor = struct {
tp.extract(&self.indent_size),
tp.extract(&self.tab_width),
tp.extract(&self.indent_mode),
tp.extract(&self.syntax_no_render),
tp.extract_cbor(&find_history),
tp.extract_cbor(&view_cbor),
tp.extract_cbor(&cursels_cbor),
@ -866,6 +868,33 @@ pub const Editor = struct {
}
pub const resume_undo_history_meta: Meta = .{ .description = "Resume undo history" };
fn collapse_trailing_ws_line(self: *Self, root: Buffer.Root, row: usize, allocator: Allocator) Buffer.Root {
const last = find_last_non_ws(root, row, self.metrics);
var cursel: CurSel = .{ .cursor = .{ .row = row, .col = last } };
with_selection_const(root, move_cursor_end, &cursel, self.metrics) catch return root;
return self.delete_selection(root, &cursel, allocator) catch root;
}
fn find_last_non_ws(root: Buffer.Root, row: usize, metrics: Buffer.Metrics) usize {
const Ctx = struct {
col: usize = 0,
last_non_ws: usize = 0,
fn walker(ctx_: *anyopaque, egc: []const u8, wcwidth: usize, _: Buffer.Metrics) Buffer.Walker {
const ctx = @as(*@This(), @ptrCast(@alignCast(ctx_)));
ctx.col += wcwidth;
switch (egc[0]) {
' ', '\t' => {},
'\n' => return Buffer.Walker.stop,
else => ctx.last_non_ws = ctx.col,
}
return Buffer.Walker.keep_walking;
}
};
var ctx: Ctx = .{};
root.walk_egc_forward(row, Ctx.walker, &ctx, metrics) catch return 0;
return ctx.last_non_ws;
}
fn find_first_non_ws(root: Buffer.Root, row: usize, metrics: Buffer.Metrics) usize {
const Ctx = struct {
col: usize = 0,
@ -4430,7 +4459,8 @@ pub const Editor = struct {
}
fn cursel_smart_insert_line(self: *Self, root: Buffer.Root, cursel: *CurSel, b_allocator: std.mem.Allocator) !Buffer.Root {
const leading_ws = @min(find_first_non_ws(root, cursel.cursor.row, self.metrics), cursel.cursor.col);
const row = cursel.cursor.row;
const leading_ws = @min(find_first_non_ws(root, row, self.metrics), cursel.cursor.col);
var sfa = std.heap.stackFallback(512, self.allocator);
const allocator = sfa.get();
var stream = std.ArrayListUnmanaged(u8).empty;
@ -4438,7 +4468,18 @@ pub const Editor = struct {
var writer = stream.writer(allocator);
_ = try writer.write("\n");
try self.generate_leading_ws(&writer, leading_ws);
return self.insert(root, cursel, stream.items, b_allocator);
var root_ = try self.insert(root, cursel, stream.items, b_allocator);
root_ = self.collapse_trailing_ws_line(root_, row, b_allocator);
const leading_ws_ = find_first_non_ws(root_, cursel.cursor.row, self.metrics);
if (leading_ws_ > leading_ws and leading_ws_ > cursel.cursor.col) {
const sel = try cursel.enable_selection(root_, self.metrics);
sel.* = .{
.begin = .{ .row = cursel.cursor.row, .col = cursel.cursor.col },
.end = .{ .row = cursel.cursor.row, .col = leading_ws_ },
};
root_ = self.delete_selection(root_, cursel, b_allocator) catch root_;
}
return root_;
}
pub fn smart_insert_line(self: *Self, _: Context) Result {
@ -4494,6 +4535,7 @@ pub const Editor = struct {
const leading_ws = @min(find_first_non_ws(root, cursel.cursor.row, self.metrics), cursel.cursor.col);
try move_cursor_begin(root, &cursel.cursor, self.metrics);
root = try self.insert(root, cursel, "\n", b.allocator);
const row = cursel.cursor.row;
try move_cursor_left(root, &cursel.cursor, self.metrics);
var sfa = std.heap.stackFallback(512, self.allocator);
const allocator = sfa.get();
@ -4503,6 +4545,7 @@ pub const Editor = struct {
try self.generate_leading_ws(&writer, leading_ws);
if (stream.items.len > 0)
root = try self.insert(root, cursel, stream.items, b.allocator);
root = self.collapse_trailing_ws_line(root, row, b.allocator);
};
try self.update_buf(root);
self.clamp();
@ -4526,6 +4569,7 @@ pub const Editor = struct {
var root = b.root;
for (self.cursels.items) |*cursel_| if (cursel_.*) |*cursel| {
const leading_ws = @min(find_first_non_ws(root, cursel.cursor.row, self.metrics), cursel.cursor.col);
const row = cursel.cursor.row;
try move_cursor_end(root, &cursel.cursor, self.metrics);
var sfa = std.heap.stackFallback(512, self.allocator);
const allocator = sfa.get();
@ -4536,6 +4580,7 @@ pub const Editor = struct {
try self.generate_leading_ws(&writer, leading_ws);
if (stream.items.len > 0)
root = try self.insert(root, cursel, stream.items, b.allocator);
root = self.collapse_trailing_ws_line(root, row, b.allocator);
};
try self.update_buf(root);
self.clamp();

View file

@ -21,11 +21,13 @@ pub const Entry = struct {
pub fn load_entries(palette: *Type) !usize {
const hints = if (tui.input_mode()) |m| m.keybind_hints else @panic("no keybind hints");
var longest_hint: usize = 0;
var longest_description: usize = 0;
var longest_total: usize = 0;
for (command.commands.items) |cmd_| if (cmd_) |p| {
if (p.meta.description.len > 0) {
const hint = hints.get(p.name) orelse "";
longest_hint = @max(longest_hint, hint.len);
longest_description = @max(longest_description, p.meta.description.len);
longest_total = @max(longest_total, p.meta.description.len + hint.len + 1);
(try palette.entries.addOne()).* = .{
.label = if (p.meta.description.len > 0) p.meta.description else p.name,
.name = p.name,
@ -35,7 +37,7 @@ pub fn load_entries(palette: *Type) !usize {
};
}
};
return longest_hint;
return longest_total - longest_description;
}
pub fn add_menu_entry(palette: *Type, entry: *Entry, matches: ?[]const usize) !void {