summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/main.c b/main.c
index 15188f4..0923324 100644
--- a/main.c
+++ b/main.c
@@ -138,7 +138,8 @@ int shell_replace(TxtLoc start, TxtLoc end, const char *cmd) {
end = t;
}
- u32 cur_ofs = txt_range_len(cur, end);
+ int cur_ofs = txt_before(cur, start) || txt_after(cur, end)
+ ? -1 : txt_range_len(cur, end);
int in, out;
int p = popen2(cmd, &in, &out);
@@ -151,7 +152,6 @@ int shell_replace(TxtLoc start, TxtLoc end, const char *cmd) {
Str wrs = txt_collect_range(start, end, &scratch);
DYNARR(char) rds = { 0 };
u32 wr_i = 0;
- cur = txt_delete_range(start, end);
while ((pfds[0].fd >= 0 || pfds[1].fd >= 0) && poll(pfds, 2, 200) >= 0) {
const u32 chunksz = 8L << 10;
if (pfds[0].revents & POLLOUT) {
@@ -182,8 +182,15 @@ int shell_replace(TxtLoc start, TxtLoc end, const char *cmd) {
pfds[1].fd = -1;
}
}
- cur = txt_insert(cur, rds.v, rds.n);
- while (cur_ofs--) cur = cprev(cur);
+
+ if (!txt_range_equal(start, end, (Str){rds.v,rds.n})) {
+ start = txt_delete_range(start, end);
+ start = txt_insert(start, rds.v, rds.n);
+ if (cur_ofs != -1) {
+ cur = start;
+ while (cur_ofs--) cur = cprev(cur);
+ }
+ }
return 0;
}