[PATCH 07/11] vi: make put commands more like vi
Ron Yorston
rmy at pobox.com
Tue Apr 6 12:43:07 UTC 2021
Make the put commands 'p' and 'P' behave more like vi:
- allow a repetition count to be specified;
- when the text being inserted doesn't include a newline the cursor
should be positioned at the end of the inserted text.
function old new delta
do_cmd 4765 4842 +77
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 77/0) Total: 77 bytes
Signed-off-by: Ron Yorston <rmy at pobox.com>
---
editors/vi.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/editors/vi.c b/editors/vi.c
index e63b7ca7f..3ae961feb 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -3413,11 +3413,12 @@ static void do_cmd(int c)
break;
}
// are we putting whole lines or strings
+ cnt = 0;
if (regtype[YDreg] == WHOLE) {
if (c == 'P') {
dot_begin(); // putting lines- Put above
}
- if (c == 'p') {
+ else /* if ( c == 'p') */ {
// are we putting after very last line?
if (end_line(dot) == (end - 1)) {
dot = end; // force dot to end of text[]
@@ -3428,8 +3429,16 @@ static void do_cmd(int c)
} else {
if (c == 'p')
dot_right(); // move to right, can move to NL
+ // how far to move cursor if register doesn't have a NL
+ if (strchr(p, '\n') == NULL)
+ cnt = (cmdcnt ?: 1) * strlen(p) - 1;
}
- string_insert(dot, p, ALLOW_UNDO); // insert the string
+ do {
+ // dot is adjusted if text[] is reallocated so we don't have to
+ string_insert(dot, p, allow_undo); // insert the string
+ allow_undo = ALLOW_UNDO_CHAIN;
+ } while (--cmdcnt > 0);
+ dot += cnt;
end_cmd_q(); // stop adding to q
break;
case 'U': // U- Undo; replace current line with original version
--
2.30.2
More information about the busybox
mailing list