summaryrefslogtreecommitdiff
path: root/src/sam_edit.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/sam_edit.zig')
-rw-r--r--src/sam_edit.zig8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/sam_edit.zig b/src/sam_edit.zig
index c08c6cdd..40221628 100644
--- a/src/sam_edit.zig
+++ b/src/sam_edit.zig
@@ -380,7 +380,10 @@ const Exec = struct {
}
fn compile(ex: *Exec, pat: []const u8, c: u8) Failure!regexp.Regex {
- return regexp.Regex.compile(pat) catch fail(ex.why, "bad regexp in {c} command", .{c});
+ return regexp.Regex.compile(pat) catch |err| switch (err) {
+ error.Anchor => fail(ex.why, "{s}", .{regexp.Regex.e_anchor}),
+ error.Bad => fail(ex.why, "bad regexp in {c} command", .{c}),
+ };
}
fn find(ex: *Exec, rx: *regexp.Regex, from: usize, hi: usize) Failure!?regexp.Regex.Match {
@@ -637,6 +640,8 @@ test "sam's classic commands" {
try expectEdit("one\ntwo\n", "1 m $", "two\none\n");
try expectEdit("one\ntwo\n", "1 t $", "one\ntwo\none\n");
try expectEdit("one\ntwo\nthree\n", "2 d", "one\nthree\n");
+ // ^ at every line start in a pattern that spans lines (dogfood round 5).
+ try expectEdit("x = 1\ndef a\ndef b\n", ",x/^def .*\\n/a/X\\n/", "x = 1\ndef a\nX\ndef b\nX\n");
// pardes's line:col.
try expectEdit("one\ntwo\n", "2:2 i/-/", "one\nt-wo\n");
}
@@ -653,6 +658,7 @@ test "an Edit that fails halfway changes nothing, and says why in acme's words"
.{ "w /tmp/x", "w is not supported in pardes" },
.{ ",s/(a)/\\1/", "no \\1: mvzr keeps no submatches" },
.{ "1 m 1,2", "move overlaps itself" },
+ .{ ",x/(^|\\n)foo/d", "in a pattern with \\n, ^ can only come first and $ only just before a \\n" },
}) |c| {
var why: Why = .{};
try std.testing.expectError(error.Edit, run(arena_state.allocator(), "foo a\nfoo\n", .{}, "t", c[0], &why));