summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston2021-04-15 12:04:45 +0100
committerDenys Vlasenko2021-04-15 13:09:12 +0200
commit74d565ff1f3756a6a6646c4f7c27dd46beaee06f (patch)
tree54a265f885700d611be17e0a3b996dfb2d244c4e
parent47c3eaa22f7bbdc1d397c3d29beae33139beecde (diff)
downloadbusybox-74d565ff1f3756a6a6646c4f7c27dd46beaee06f.zip
busybox-74d565ff1f3756a6a6646c4f7c27dd46beaee06f.tar.gz
vi: make context marks more like vi
The context marks that are automatically updated and can be used with the "''" command didn't behave the same as in vi. Marks were only being set for certain editing commands when they should have been set on successful movement commands. Make BusyBox vi behave more like vi. function old new delta .rodata 105179 105194 +15 do_cmd 4723 4668 -55 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/1 up/down: 15/-55) Total: -40 bytes Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--editors/vi.c30
1 files changed, 12 insertions, 18 deletions
diff --git a/editors/vi.c b/editors/vi.c
index b774069..922d7ea 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -377,7 +377,6 @@ struct globals {
char *reg[28]; // named register a-z, "D", and "U" 0-25,26,27
char regtype[28]; // buffer type: WHOLE, MULTI or PARTIAL
char *mark[28]; // user marks points somewhere in text[]- a-z and previous context ''
- char *context_start, *context_end;
#endif
#if ENABLE_FEATURE_VI_USE_SIGNALS
sigjmp_buf restart; // int_handler() jumps to location remembered here
@@ -496,8 +495,6 @@ struct globals {
//#define Ureg (G.Ureg )
#define regtype (G.regtype )
#define mark (G.mark )
-#define context_start (G.context_start )
-#define context_end (G.context_end )
#define restart (G.restart )
#define term_orig (G.term_orig )
#define cindex (G.cindex )
@@ -1415,18 +1412,10 @@ static char what_reg(void)
static void check_context(char cmd)
{
- // A context is defined to be "modifying text"
- // Any modifying command establishes a new context.
-
- if (dot < context_start || dot > context_end) {
- if (strchr(modifying_cmds, cmd) != NULL) {
- // we are trying to modify text[]- make this the current context
- mark[27] = mark[26]; // move cur to prev
- mark[26] = dot; // move local to cur
- context_start = prev_line(prev_line(dot));
- context_end = next_line(next_line(dot));
- //loiter= start_loiter= now;
- }
+ // Certain movement commands update the context.
+ if (strchr(":%{}'GHLMz/?Nn", cmd) != NULL) {
+ mark[27] = mark[26]; // move cur to prev
+ mark[26] = dot; // move local to cur
}
}
@@ -1441,8 +1430,6 @@ static char *swap_context(char *p) // goto new context for '' command make this
tmp = mark[27];
mark[27] = p;
mark[26] = p = tmp;
- context_start = prev_line(prev_line(prev_line(p)));
- context_end = next_line(next_line(next_line(p)));
}
return p;
}
@@ -3287,6 +3274,9 @@ static void do_cmd(int c)
int dir;
int cnt, i, j;
int c1;
+#if ENABLE_FEATURE_VI_YANKMARK
+ char *orig_dot = dot;
+#endif
#if ENABLE_FEATURE_VI_UNDO
int allow_undo = ALLOW_UNDO;
int undo_del = UNDO_DEL;
@@ -3480,6 +3470,9 @@ static void do_cmd(int c)
dot = swap_context(dot); // swap current and previous context
dot_begin(); // go to B-o-l
dot_skip_over_ws();
+#if ENABLE_FEATURE_VI_YANKMARK
+ orig_dot = dot; // this doesn't update stored contexts
+#endif
} else {
indicate_error();
}
@@ -4109,7 +4102,8 @@ static void do_cmd(int c)
dot = bound_dot(dot); // make sure "dot" is valid
}
#if ENABLE_FEATURE_VI_YANKMARK
- check_context(c); // update the current context
+ if (dot != orig_dot)
+ check_context(c); // update the current context
#endif
if (!isdigit(c))