aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.def.h1
-rw-r--r--view.c12
-rw-r--r--view.h2
-rw-r--r--vis.c15
4 files changed, 25 insertions, 5 deletions
diff --git a/config.def.h b/config.def.h
index 950fd54..92276ea 100644
--- a/config.def.h
+++ b/config.def.h
@@ -359,6 +359,7 @@ static KeyBinding vis_marks_set[] = {
};
static KeyBinding vis_mode_normal[] = {
+ { { NONE(ESC) }, cursors_clear, { } },
{ { CONTROL('w'), NONE('n') }, cmd, { .s = "open" } },
{ { CONTROL('w'), NONE('c') }, cmd, { .s = "q" } },
{ { CONTROL('w'), NONE('s') }, cmd, { .s = "split" } },
diff --git a/view.c b/view.c
index 43915ce..4af93f8 100644
--- a/view.c
+++ b/view.c
@@ -890,6 +890,13 @@ Cursor *view_cursors_new(View *view) {
return c;
}
+int view_cursors_count(View *view) {
+ int i = 0;
+ for (Cursor *c = view_cursors(view); c; c = view_cursors_next(c))
+ i++;
+ return i;
+}
+
void view_cursors_free(Cursor *c) {
if (!c)
return;
@@ -1051,9 +1058,10 @@ void view_selections_clear(View *view) {
void view_cursors_clear(View *view) {
for (Cursor *c = view->cursors, *next; c; c = next) {
next = c->next;
- view_selections_free(c->sel);
- if (c != view->cursor)
+ if (c != view->cursor) {
+ view_selections_free(c->sel);
view_cursors_free(c);
+ }
}
view_draw(view);
}
diff --git a/view.h b/view.h
index 97fd12c..4e750c0 100644
--- a/view.h
+++ b/view.h
@@ -115,6 +115,8 @@ void view_scroll_to(View*, size_t pos);
void view_cursor_to(View*, size_t pos);
/* create a new cursor */
Cursor *view_cursors_new(View*);
+/* get number of active cursors */
+int view_cursors_count(View*);
/* dispose an existing cursor */
void view_cursors_free(Cursor*);
/* only keep the main cursor, release all others together with their
diff --git a/vis.c b/vis.c
index d11c696..4b9ddfb 100644
--- a/vis.c
+++ b/vis.c
@@ -320,6 +320,8 @@ static void totill_repeat(const Arg *arg);
static void totill_reverse(const Arg *arg);
/* replace character at cursor with one read form keyboard */
static void replace(const Arg *arg);
+/* remove all but the primary cursor and their selections */
+static void cursors_clear(const Arg *arg);
/* adjust action.count by arg->i */
static void count(const Arg *arg);
/* move to the action.count-th line or if not given either to the first (arg->i < 0)
@@ -825,6 +827,14 @@ static void totill_reverse(const Arg *arg) {
movement(&(const Arg){ .i = type });
}
+static void cursors_clear(const Arg *arg) {
+ View *view = vis->win->view;
+ if (view_cursors_count(view) > 1)
+ view_cursors_clear(view);
+ else
+ view_cursors_selection_clear(view_cursor(view));
+}
+
static void replace(const Arg *arg) {
Key k = getkey();
if (!k.str[0])
@@ -1227,10 +1237,9 @@ static void action_do(Action *a) {
Text *txt = vis->win->file->text;
View *view = vis->win->view;
int count = MAX(1, a->count);
- Cursor *cursor = view_cursors(view), *next;
- bool multiple_cursors = cursor && view_cursors_next(cursor);
+ bool multiple_cursors = view_cursors_count(view) > 1;
- for (; cursor; cursor = next) {
+ for (Cursor *cursor = view_cursors(view), *next; cursor; cursor = next) {
next = view_cursors_next(cursor);
size_t pos = view_cursors_pos(cursor);