aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2021-04-15 12:04:45 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2021-04-15 13:09:12 +0200
commit74d565ff1f3756a6a6646c4f7c27dd46beaee06f (patch)
tree54a265f885700d611be17e0a3b996dfb2d244c4e
parent47c3eaa22f7bbdc1d397c3d29beae33139beecde (diff)
downloadbusybox-w32-74d565ff1f3756a6a6646c4f7c27dd46beaee06f.tar.gz
busybox-w32-74d565ff1f3756a6a6646c4f7c27dd46beaee06f.tar.bz2
busybox-w32-74d565ff1f3756a6a6646c4f7c27dd46beaee06f.zip
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 b77406967..922d7ea8d 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -377,7 +377,6 @@ struct globals {
377 char *reg[28]; // named register a-z, "D", and "U" 0-25,26,27 377 char *reg[28]; // named register a-z, "D", and "U" 0-25,26,27
378 char regtype[28]; // buffer type: WHOLE, MULTI or PARTIAL 378 char regtype[28]; // buffer type: WHOLE, MULTI or PARTIAL
379 char *mark[28]; // user marks points somewhere in text[]- a-z and previous context '' 379 char *mark[28]; // user marks points somewhere in text[]- a-z and previous context ''
380 char *context_start, *context_end;
381#endif 380#endif
382#if ENABLE_FEATURE_VI_USE_SIGNALS 381#if ENABLE_FEATURE_VI_USE_SIGNALS
383 sigjmp_buf restart; // int_handler() jumps to location remembered here 382 sigjmp_buf restart; // int_handler() jumps to location remembered here
@@ -496,8 +495,6 @@ struct globals {
496//#define Ureg (G.Ureg ) 495//#define Ureg (G.Ureg )
497#define regtype (G.regtype ) 496#define regtype (G.regtype )
498#define mark (G.mark ) 497#define mark (G.mark )
499#define context_start (G.context_start )
500#define context_end (G.context_end )
501#define restart (G.restart ) 498#define restart (G.restart )
502#define term_orig (G.term_orig ) 499#define term_orig (G.term_orig )
503#define cindex (G.cindex ) 500#define cindex (G.cindex )
@@ -1415,18 +1412,10 @@ static char what_reg(void)
1415 1412
1416static void check_context(char cmd) 1413static void check_context(char cmd)
1417{ 1414{
1418 // A context is defined to be "modifying text" 1415 // Certain movement commands update the context.
1419 // Any modifying command establishes a new context. 1416 if (strchr(":%{}'GHLMz/?Nn", cmd) != NULL) {
1420 1417 mark[27] = mark[26]; // move cur to prev
1421 if (dot < context_start || dot > context_end) { 1418 mark[26] = dot; // move local to cur
1422 if (strchr(modifying_cmds, cmd) != NULL) {
1423 // we are trying to modify text[]- make this the current context
1424 mark[27] = mark[26]; // move cur to prev
1425 mark[26] = dot; // move local to cur
1426 context_start = prev_line(prev_line(dot));
1427 context_end = next_line(next_line(dot));
1428 //loiter= start_loiter= now;
1429 }
1430 } 1419 }
1431} 1420}
1432 1421
@@ -1441,8 +1430,6 @@ static char *swap_context(char *p) // goto new context for '' command make this
1441 tmp = mark[27]; 1430 tmp = mark[27];
1442 mark[27] = p; 1431 mark[27] = p;
1443 mark[26] = p = tmp; 1432 mark[26] = p = tmp;
1444 context_start = prev_line(prev_line(prev_line(p)));
1445 context_end = next_line(next_line(next_line(p)));
1446 } 1433 }
1447 return p; 1434 return p;
1448} 1435}
@@ -3287,6 +3274,9 @@ static void do_cmd(int c)
3287 int dir; 3274 int dir;
3288 int cnt, i, j; 3275 int cnt, i, j;
3289 int c1; 3276 int c1;
3277#if ENABLE_FEATURE_VI_YANKMARK
3278 char *orig_dot = dot;
3279#endif
3290#if ENABLE_FEATURE_VI_UNDO 3280#if ENABLE_FEATURE_VI_UNDO
3291 int allow_undo = ALLOW_UNDO; 3281 int allow_undo = ALLOW_UNDO;
3292 int undo_del = UNDO_DEL; 3282 int undo_del = UNDO_DEL;
@@ -3480,6 +3470,9 @@ static void do_cmd(int c)
3480 dot = swap_context(dot); // swap current and previous context 3470 dot = swap_context(dot); // swap current and previous context
3481 dot_begin(); // go to B-o-l 3471 dot_begin(); // go to B-o-l
3482 dot_skip_over_ws(); 3472 dot_skip_over_ws();
3473#if ENABLE_FEATURE_VI_YANKMARK
3474 orig_dot = dot; // this doesn't update stored contexts
3475#endif
3483 } else { 3476 } else {
3484 indicate_error(); 3477 indicate_error();
3485 } 3478 }
@@ -4109,7 +4102,8 @@ static void do_cmd(int c)
4109 dot = bound_dot(dot); // make sure "dot" is valid 4102 dot = bound_dot(dot); // make sure "dot" is valid
4110 } 4103 }
4111#if ENABLE_FEATURE_VI_YANKMARK 4104#if ENABLE_FEATURE_VI_YANKMARK
4112 check_context(c); // update the current context 4105 if (dot != orig_dot)
4106 check_context(c); // update the current context
4113#endif 4107#endif
4114 4108
4115 if (!isdigit(c)) 4109 if (!isdigit(c))