diff options
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 15 |
1 files changed, 11 insertions, 4 deletions
@@ -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; } |
