summaryrefslogtreecommitdiff
path: root/editors/vi.c
diff options
context:
space:
mode:
Diffstat (limited to 'editors/vi.c')
-rw-r--r--editors/vi.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/editors/vi.c b/editors/vi.c
index 9a2d7b0..fd4526d 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -3429,11 +3429,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[]
@@ -3444,8 +3445,18 @@ 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
+# if ENABLE_FEATURE_VI_UNDO
+ allow_undo = ALLOW_UNDO_CHAIN;
+# endif
+ } while (--cmdcnt > 0);
+ dot += cnt;
end_cmd_q(); // stop adding to q
break;
case 'U': // U- Undo; replace current line with original version