aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--text.c6
-rw-r--r--text.h1
-rw-r--r--vis.c9
3 files changed, 11 insertions, 5 deletions
diff --git a/text.c b/text.c
index 26b851d..1c21e9c 100644
--- a/text.c
+++ b/text.c
@@ -1145,6 +1145,12 @@ bool text_delete(Text *txt, size_t pos, size_t len) {
return true;
}
+bool text_delete_range(Text *txt, Filerange *r) {
+ if (!text_range_valid(r))
+ return false;
+ return text_delete(txt, r->start, text_range_size(r));
+}
+
/* preserve the current text content such that it can be restored by
* means of undo/redo operations */
void text_snapshot(Text *txt) {
diff --git a/text.h b/text.h
index 217c801..7d7f19d 100644
--- a/text.h
+++ b/text.h
@@ -41,6 +41,7 @@ struct stat text_stat(Text*);
bool text_insert(Text*, size_t pos, const char *data, size_t len);
/* delete `len' bytes starting from `pos' */
bool text_delete(Text*, size_t pos, size_t len);
+bool text_delete_range(Text*, Filerange*);
/* mark the current text state, such that it can be {un,re}done */
void text_snapshot(Text*);
/* undo/redo to the last snapshotted state. returns the position where
diff --git a/vis.c b/vis.c
index 7d3ad7c..35b2d22 100644
--- a/vis.c
+++ b/vis.c
@@ -481,10 +481,9 @@ static bool exec_command(char type, const char *cmdline);
static size_t op_delete(OperatorContext *c) {
Text *txt = vis->win->file->text;
- size_t len = c->range.end - c->range.start;
c->reg->linewise = c->linewise;
register_put(c->reg, txt, &c->range);
- text_delete(txt, c->range.start, len);
+ text_delete_range(txt, &c->range);
size_t pos = c->range.start;
if (c->linewise && pos == text_size(txt))
pos = text_line_begin(txt, text_line_prev(txt, pos));
@@ -602,7 +601,7 @@ static size_t op_shift_left(OperatorContext *c) {
static size_t op_case_change(OperatorContext *c) {
Text *txt = vis->win->file->text;
- size_t len = c->range.end - c->range.start;
+ size_t len = text_range_size(&c->range);
char *buf = malloc(len);
if (!buf)
return c->pos;
@@ -1885,7 +1884,7 @@ static bool cmd_read(Filerange *range, enum CmdOpt opt, const char *argv[]) {
bool ret = cmd_filter(range, opt, (const char*[]){ argv[0], "sh", "-c", cmd, NULL});
if (ret)
- text_delete(vis->win->file->text, delete.start, delete.end - delete.start);
+ text_delete_range(vis->win->file->text, &delete);
return ret;
}
@@ -2167,7 +2166,7 @@ static bool cmd_filter(Filerange *range, enum CmdOpt opt, const char *argv[]) {
close(perr[0]);
if (waitpid(pid, &status, 0) == pid && status == 0) {
- text_delete(text, rout.start, rout.end - rout.start);
+ text_delete_range(text, &rout);
text_snapshot(text);
} else {
/* make sure we have somehting to undo */