aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-07-14 12:17:41 +0200
committerMarc André Tanner <mat@brain-dump.org>2017-07-14 12:19:33 +0200
commit57dcdd656eaa1fa8d2143ec0f6115de1eb65021f (patch)
tree810359623b593859b5de33899155a48c907b7a98
parentbacf932f177309e88d931d45d3a63749de2446a5 (diff)
downloadvis-57dcdd656eaa1fa8d2143ec0f6115de1eb65021f.tar.gz
vis-57dcdd656eaa1fa8d2143ec0f6115de1eb65021f.tar.xz
vis: use distinct mark to save last selections
This partially reverts f9e2b884c15919757651db8b10c033a344a19e75 further jumps after leaving visual mode should not break `gv`.
-rw-r--r--vis-core.h2
-rw-r--r--vis-marks.c2
-rw-r--r--vis-modes.c4
-rw-r--r--vis.c14
4 files changed, 18 insertions, 4 deletions
diff --git a/vis-core.h b/vis-core.h
index a4ebac1..900f498 100644
--- a/vis-core.h
+++ b/vis-core.h
@@ -159,6 +159,7 @@ struct Win {
File *file; /* file being displayed in this window */
View *view; /* currently displayed part of underlying text */
MarkList jumplist; /* LRU jump management */
+ Array saved_selections; /* register used to store selections */
Mode modes[VIS_MODE_INVALID]; /* overlay mods used for per window key bindings */
Win *parent; /* window which was active when showing the command prompt */
Mode *parent_mode; /* mode which was active when showing the command prompt */
@@ -264,6 +265,7 @@ Mode *mode_get(Vis*, enum VisMode);
void mode_set(Vis *vis, Mode *new_mode);
Macro *macro_get(Vis *vis, enum VisRegister);
+void window_selection_save(Win *win);
Win *window_new_file(Vis*, File*, enum UiOption);
const char *file_name_get(File*);
diff --git a/vis-marks.c b/vis-marks.c
index 7543792..7bc6ad5 100644
--- a/vis-marks.c
+++ b/vis-marks.c
@@ -49,7 +49,7 @@ void mark_release(Array *arr) {
static Array *mark_from(Vis *vis, enum VisMark id) {
if (id == VIS_MARK_SELECTION && vis->win)
- return array_peek(&vis->win->jumplist.prev);
+ return &vis->win->saved_selections;
File *file = vis->win->file;
if (id < LENGTH(file->marks))
return &file->marks[id];
diff --git a/vis-modes.c b/vis-modes.c
index b00ecfe..875d674 100644
--- a/vis-modes.c
+++ b/vis-modes.c
@@ -202,7 +202,7 @@ static void vis_mode_visual_line_enter(Vis *vis, Mode *old) {
static void vis_mode_visual_line_leave(Vis *vis, Mode *new) {
if (!new->visual) {
if (!vis->action.op)
- vis_jumplist_save(vis);
+ window_selection_save(vis->win);
view_selections_clear_all(vis->win->view);
} else {
view_cursor_to(vis->win->view, view_cursor_get(vis->win->view));
@@ -212,7 +212,7 @@ static void vis_mode_visual_line_leave(Vis *vis, Mode *new) {
static void vis_mode_visual_leave(Vis *vis, Mode *new) {
if (!new->visual) {
if (!vis->action.op)
- vis_jumplist_save(vis);
+ window_selection_save(vis->win);
view_selections_clear_all(vis->win->view);
}
}
diff --git a/vis.c b/vis.c
index 58599cb..a12c2be 100644
--- a/vis.c
+++ b/vis.c
@@ -243,6 +243,16 @@ void vis_window_status(Win *win, const char *status) {
win->ui->status(win->ui, status);
}
+void window_selection_save(Win *win) {
+ Vis *vis = win->vis;
+ View *view = win->view;
+ Array sel = view_selections_get_all(view);
+ vis_mark_set(vis, VIS_MARK_SELECTION, &sel);
+ array_release(&sel);
+ vis_jumplist_save(vis);
+}
+
+
static void window_free(Win *win) {
if (!win)
return;
@@ -257,6 +267,7 @@ static void window_free(Win *win) {
for (size_t i = 0; i < LENGTH(win->modes); i++)
map_free(win->modes[i].bindings);
marklist_release(&win->jumplist);
+ mark_release(&win->saved_selections);
free(win);
}
@@ -454,6 +465,7 @@ Win *window_new_file(Vis *vis, File *file, enum UiOption options) {
return NULL;
}
marklist_init(&win->jumplist, 32);
+ mark_init(&win->saved_selections);
file->refcount++;
view_options_set(win->view, view_options_get(win->view));
view_tabwidth_set(win->view, vis->tabwidth);
@@ -822,7 +834,7 @@ void vis_do(Vis *vis) {
reg_slot = 0;
if (vis->mode->visual && a->op)
- vis_jumplist_save(vis);
+ window_selection_save(win);
for (Selection *sel = view_selections(view), *next; sel; sel = next) {
if (vis->interrupted)