[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