Compare commits

...

5 commits

Author SHA1 Message Date
36e6d6a69f
fix: force ripgrep to never try search stdin 2025-04-30 11:35:25 +02:00
b3c5f4cbb9
feat: stop rendering on panic
This improves backtraces for panics on background threads.
2025-04-30 11:34:41 +02:00
09be9b3774
build: add simple test_race.sh script
Useful for triggering startup races and can be used with git bisect.
2025-04-30 11:32:56 +02:00
df70384b7b
feat: add toggle_highlight_columns command (shift+f11) 2025-04-30 09:59:59 +02:00
ce2c370cfd
fix: add missing bin_path module 2025-04-30 09:59:30 +02:00
6 changed files with 35 additions and 1 deletions

View file

@ -440,6 +440,7 @@ pub fn build_exe(
.{ .name = "thespian", .module = thespian_mod }, .{ .name = "thespian", .module = thespian_mod },
.{ .name = "cbor", .module = cbor_mod }, .{ .name = "cbor", .module = cbor_mod },
.{ .name = "log", .module = log_mod }, .{ .name = "log", .module = log_mod },
.{ .name = "bin_path", .module = bin_path_mod },
}, },
}); });

13
contrib/test_race.sh Executable file
View file

@ -0,0 +1,13 @@
#!/bin/bash
set -e
if [ "$1" == "--build" ]; then
shift
echo "building..."
zig build -freference-trace --prominent-compile-errors
fi
for i in {1..60}; do
echo "running $i ..."
flow --exec quit "$@" || exit 1
done

View file

@ -157,6 +157,7 @@
["f9", "theme_prev"], ["f9", "theme_prev"],
["f10", "theme_next"], ["f10", "theme_next"],
["f11", "toggle_panel"], ["f11", "toggle_panel"],
["shift+f11", "toggle_highlight_columns"],
["ctrl+f11", "toggle_inspector_view"], ["ctrl+f11", "toggle_inspector_view"],
["f12", "goto_definition"], ["f12", "goto_definition"],
["f34", "toggle_whitespace_mode"], ["f34", "toggle_whitespace_mode"],

View file

@ -95,13 +95,16 @@ pub fn deinit(self: *Self) void {
self.event_buffer.deinit(); self.event_buffer.deinit();
} }
var in_panic: std.atomic.Value(bool) = .init(false);
var panic_cleanup: ?struct { var panic_cleanup: ?struct {
allocator: std.mem.Allocator, allocator: std.mem.Allocator,
tty: *vaxis.Tty, tty: *vaxis.Tty,
vx: *vaxis.Vaxis, vx: *vaxis.Vaxis,
} = null; } = null;
pub fn panic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace, ret_addr: ?usize) noreturn { pub fn panic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace, ret_addr: ?usize) noreturn {
_ = error_return_trace; // TODO: what to do with this in zig-0.14? _ = error_return_trace; // TODO: what to do with this in zig-0.14?
in_panic.store(true, .release);
const cleanup = panic_cleanup; const cleanup = panic_cleanup;
panic_cleanup = null; panic_cleanup = null;
if (cleanup) |self| { if (cleanup) |self| {
@ -111,6 +114,10 @@ pub fn panic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace, ret_
return std.debug.defaultPanic(msg, ret_addr orelse @returnAddress()); return std.debug.defaultPanic(msg, ret_addr orelse @returnAddress());
} }
pub fn panic_in_progress() bool {
return in_panic.load(.acquire);
}
pub fn run(self: *Self) Error!void { pub fn run(self: *Self) Error!void {
self.vx.sgr = .legacy; self.vx.sgr = .legacy;
self.vx.conpty_hacks = true; self.vx.conpty_hacks = true;
@ -130,6 +137,7 @@ pub fn run(self: *Self) Error!void {
} }
pub fn render(self: *Self) !void { pub fn render(self: *Self) !void {
if (in_panic.load(.acquire)) return;
var bufferedWriter = self.tty.bufferedWriter(); var bufferedWriter = self.tty.bufferedWriter();
try self.vx.render(bufferedWriter.writer().any()); try self.vx.render(bufferedWriter.writer().any());
try bufferedWriter.flush(); try bufferedWriter.flush();

View file

@ -126,6 +126,7 @@ const Process = struct {
"--json", "--json",
"--smart-case", "--smart-case",
self.query, self.query,
"./.", // never search stdin
}); });
self.sp = tp.subprocess.init(self.allocator, args, module_name, self.stdin_behavior) catch |e| return tp.exit_error(e, @errorReturnTrace()); self.sp = tp.subprocess.init(self.allocator, args, module_name, self.stdin_behavior) catch |e| return tp.exit_error(e, @errorReturnTrace());
tp.receive(&self.receiver); tp.receive(&self.receiver);

View file

@ -24,6 +24,7 @@ allocator: Allocator,
rdr_: renderer, rdr_: renderer,
config_: @import("config"), config_: @import("config"),
highlight_columns_: []u16, highlight_columns_: []u16,
highlight_columns_configured: []u16,
frame_time: usize, // in microseconds frame_time: usize, // in microseconds
frame_clock: tp.metronome, frame_clock: tp.metronome,
frame_clock_running: bool = false, frame_clock_running: bool = false,
@ -130,12 +131,14 @@ fn init(allocator: Allocator) InitError!*Self {
idx += 1; idx += 1;
break :blk idx; break :blk idx;
}; };
const highlight_columns__ = try allocator.alloc(u16, hl_cols);
var self = try allocator.create(Self); var self = try allocator.create(Self);
self.* = .{ self.* = .{
.allocator = allocator, .allocator = allocator,
.config_ = conf, .config_ = conf,
.highlight_columns_ = try allocator.alloc(u16, hl_cols), .highlight_columns_ = highlight_columns__,
.highlight_columns_configured = highlight_columns__,
.rdr_ = try renderer.init(allocator, self, tp.env.get().is("no-alternate"), dispatch_initialized), .rdr_ = try renderer.init(allocator, self, tp.env.get().is("no-alternate"), dispatch_initialized),
.frame_time = frame_time, .frame_time = frame_time,
.frame_clock = frame_clock, .frame_clock = frame_clock,
@ -221,6 +224,7 @@ fn init_delayed(self: *Self) command.Result {
} }
fn deinit(self: *Self) void { fn deinit(self: *Self) void {
self.allocator.free(self.highlight_columns_configured);
if (self.mouse_idle_timer) |*t| { if (self.mouse_idle_timer) |*t| {
t.cancel() catch {}; t.cancel() catch {};
t.deinit(); t.deinit();
@ -788,6 +792,12 @@ const cmds = struct {
} }
pub const toggle_whitespace_mode_meta: Meta = .{ .description = "Next whitespace mode" }; pub const toggle_whitespace_mode_meta: Meta = .{ .description = "Next whitespace mode" };
pub fn toggle_highlight_columns(self: *Self, _: Ctx) Result {
defer self.logger.print("highlight columns {s}", .{if (self.highlight_columns_.len > 0) "enabled" else "disabled"});
self.highlight_columns_ = if (self.highlight_columns_.len > 0) &.{} else self.highlight_columns_configured;
}
pub const toggle_highlight_columns_meta: Meta = .{ .description = "Toggle highlight columns" };
pub fn toggle_input_mode(self: *Self, _: Ctx) Result { pub fn toggle_input_mode(self: *Self, _: Ctx) Result {
var it = std.mem.splitScalar(u8, self.config_.input_mode, '/'); var it = std.mem.splitScalar(u8, self.config_.input_mode, '/');
self.config_.input_mode = it.first(); self.config_.input_mode = it.first();