summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Pipe.zig6
-rw-r--r--src/Terminal.zig5
-rw-r--r--src/Text.zig5
-rw-r--r--src/exec.zig4
-rw-r--r--src/memory.zig4
-rw-r--r--src/normal.zig2
-rw-r--r--src/panes.zig4
-rw-r--r--src/pardes.zig4
8 files changed, 21 insertions, 13 deletions
diff --git a/src/Pipe.zig b/src/Pipe.zig
index 37145edf..48e98b7b 100644
--- a/src/Pipe.zig
+++ b/src/Pipe.zig
@@ -55,10 +55,10 @@ pub const PendingPipe = struct {
cwd: []u8,
inputs: []selection_pipe.Input,
ranges: [panes.Text.max_selections]modal.Selection,
- primary: u8,
+ primary: u16,
explicit: bool,
how: modal.Normal.PipeBehavior,
- nranges: u8,
+ nranges: u16,
pub fn deinit(wait: *PendingPipe, gpa: std.mem.Allocator) void {
gpa.free(wait.command);
@@ -453,7 +453,7 @@ test "selection pipe replaces all ranges atomically and undo restores them" {
p.update(.{ .pipe_resp = .{ .id = id, .success = true, .outputs = outputs } });
try std.testing.expectEqualSlices(u8, "AA bb \n", pane.file.?.content);
try std.testing.expectEqual(@as(usize, 1), pane.file.?.history.undo_len);
- try std.testing.expectEqual(@as(u8, 1), pane.body.nsel);
+ try std.testing.expectEqual(@as(u16, 1), pane.body.nsel);
try std.testing.expectEqual(@as(i32, 1), pane.body.cur_col);
try std.testing.expectEqual(@as(i32, 6), pane.body.sels[0].col);
try std.testing.expect(!denied.has_induced_failure);
diff --git a/src/Terminal.zig b/src/Terminal.zig
index 4f94533d..1ff561b1 100644
--- a/src/Terminal.zig
+++ b/src/Terminal.zig
@@ -545,7 +545,10 @@ test "replay ownership is terminal-only and construction rolls back on allocatio
try std.testing.expectEqual(terminal and enabled, pane.terminal != null);
}
};
- try std.testing.expect(@sizeOf(Pane) < 128 * 1024);
+ // Most of it is the three texts' selections, limits.selections ranges
+ // each held inline (about 20 KiB a text on the desktop), and the regex
+ // prompt's snapshot of them.
+ try std.testing.expect(@sizeOf(Pane) < 160 * 1024);
try std.testing.checkAllAllocationFailures(std.testing.allocator, Case.run, .{false});
try std.testing.checkAllAllocationFailures(std.testing.allocator, Case.run, .{true});
}
diff --git a/src/Text.zig b/src/Text.zig
index 764b8a6a..56ee199b 100644
--- a/src/Text.zig
+++ b/src/Text.zig
@@ -11,6 +11,7 @@ const std = @import("std");
const panes = @import("panes.zig");
const modal = @import("modal.zig");
const config = @import("config.zig");
+const memory = @import("memory.zig");
const Pane = panes.Pane;
const File = panes.File;
const Terminal = panes.Terminal;
@@ -36,7 +37,7 @@ pub const CharSel = struct {
explicit: bool = false,
};
-pub const max_selections = 64;
+pub const max_selections = memory.limits.selections;
pub const SelRange = struct {
row: i32,
@@ -60,7 +61,7 @@ cur_col: i32 = 0,
msel: LineSel = .{},
vsel: CharSel = .{},
sels: [max_selections - 1]SelRange = undefined,
-nsel: u8 = 0,
+nsel: u16 = 0,
select: bool = false,
/// sticky goal column for j/k runs (helix old_visual_position): any
/// non-vertical range write resets it to -1.
diff --git a/src/exec.zig b/src/exec.zig
index 1b82d2a8..455a325e 100644
--- a/src/exec.zig
+++ b/src/exec.zig
@@ -752,7 +752,7 @@ test "the acme chords act once per selection, not once on the primary" {
.{ .anchor = 7, .head = 13 },
};
pane.body.setRanges(pane.file.?.content, &ranges, &.{}, 0, true);
- try std.testing.expectEqual(@as(u8, 1), pane.body.nsel);
+ try std.testing.expectEqual(@as(u16, 1), pane.body.nsel);
const before = p.ncol;
p.update(.{ .key = .{ .cp = Key.tab } }); // config.exec_key: Exec
@@ -760,7 +760,7 @@ test "the acme chords act once per selection, not once on the primary" {
// other cursor, so one keystroke over two cursors made one column.
try std.testing.expectEqual(before + 2, p.ncol);
// ...and the chord consumed the selection exactly as it does with one.
- try std.testing.expectEqual(@as(u8, 0), p.panes[0].?.body.nsel);
+ try std.testing.expectEqual(@as(u16, 0), p.panes[0].?.body.nsel);
}
test "a switch clicked with a selection held flips unless the selection says on or off" {
diff --git a/src/memory.zig b/src/memory.zig
index 7b6ee2c0..abfd40f6 100644
--- a/src/memory.zig
+++ b/src/memory.zig
@@ -17,6 +17,9 @@ pub const limits = struct {
pub const wrap_rows = if (board) 128 else 256;
pub const undo_max = if (board) 16 else 256;
pub const message_log = if (board) 16 else 128;
+ /// ranges one selection holds; helix has no limit, and a `%s` over a
+ /// file's words wants hundreds
+ pub const selections = if (board) 64 else 1024;
/// /log's ring, which records whether or not anyone reads it.
pub const log_bytes: usize = if (board) 4 * KiB else 64 * KiB;
pub const max_tag_tail: usize = if (board) 512 else 4096;
@@ -187,6 +190,7 @@ test "memory limits preserve desktop capacities" {
try std.testing.expectEqual(256, limits.wrap_rows);
try std.testing.expectEqual(256, limits.undo_max);
try std.testing.expectEqual(128, limits.message_log);
+ try std.testing.expectEqual(1024, limits.selections);
try std.testing.expectEqual(@as(usize, 4096), limits.max_tag_tail);
try std.testing.expectEqual(@as(usize, 4095), limits.host_path_cap);
try std.testing.expectEqual(config.embed_sources, limits.embedded_sources);
diff --git a/src/normal.zig b/src/normal.zig
index 542c9fb3..98ba80d6 100644
--- a/src/normal.zig
+++ b/src/normal.zig
@@ -771,7 +771,7 @@ test "flat text movement and selection replay need no scratch rows" {
pane.body.sels[0] = .{ .row = 3072, .col = 0, .arow = 3072, .acol = 0 };
handleNormal(p, &pane.body, .{ .cp = 'l' });
handleNormal(p, &pane.body, .{ .cp = 'j' });
- try std.testing.expectEqual(@as(u8, 1), pane.body.nsel);
+ try std.testing.expectEqual(@as(u16, 1), pane.body.nsel);
try std.testing.expectEqual(@as(i32, 1025), pane.body.cur_row);
try std.testing.expectEqual(@as(i32, 1), pane.body.cur_col);
try std.testing.expectEqual(@as(i32, 3073), pane.body.sels[0].row);
diff --git a/src/panes.zig b/src/panes.zig
index 9234912f..67954abd 100644
--- a/src/panes.zig
+++ b/src/panes.zig
@@ -155,8 +155,8 @@ pub const Pane = struct {
search_row: ?usize = null,
look_at: ?LookSpot = null,
sel_snap: [Text.max_selections]modal.Selection = undefined,
- nsel_snap: u8 = 0,
- sel_snap_pri: u8 = 0,
+ nsel_snap: u16 = 0,
+ sel_snap_pri: u16 = 0,
sel_snap_expl: bool = false,
/// The tag: what the user keeps after the computed prefix (the path, the
/// dirty marker, a PDF's page), its cursor, selections and undo. The
diff --git a/src/pardes.zig b/src/pardes.zig
index 87041f39..a7bcb195 100644
--- a/src/pardes.zig
+++ b/src/pardes.zig
@@ -3123,7 +3123,7 @@ test "s in a header selects in the header's own text" {
const text = try edit.flatSurface(p, &p.global_tag);
const got = p.global_tag.ranges(text, 0, &ranges);
try std.testing.expectEqual(@as(usize, 3), got.n); // Newcol, Joincol, NextColor
- try std.testing.expectEqual(@as(u8, 0), pane.body.nsel);
+ try std.testing.expectEqual(@as(u16, 0), pane.body.nsel);
}
test "Enter in a header runs the word under its cursor, as the execute key does" {
@@ -7547,7 +7547,7 @@ test "jump history clears selections and lands at the recorded cursor" {
try std.testing.expectEqual(@as(usize, 2), p.njumps);
try std.testing.expectEqual(@as(u32, 3), p.jumps[0].line);
try std.testing.expect(!pane.body.vsel.active and !pane.body.msel.active and !pane.body.select);
- try std.testing.expectEqual(@as(u8, 0), pane.body.nsel);
+ try std.testing.expectEqual(@as(u16, 0), pane.body.nsel);
try std.testing.expectEqual(.none, pane.sel[0].state);
try std.testing.expect(pane.pointer_selections[0] == null);
try std.testing.expectEqual(@as(i32, if (index == 0) 2 else 0), pane.body.cur_row);