vi: make put commands more like vi
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 v2: Don't break build when FEATURE_VI_UNDO is disabled. Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
a54450248b
commit
951c6ded3a
15
editors/vi.c
15
editors/vi.c
@ -3429,11 +3429,12 @@ static void do_cmd(int c)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// are we putting whole lines or strings
|
// are we putting whole lines or strings
|
||||||
|
cnt = 0;
|
||||||
if (regtype[YDreg] == WHOLE) {
|
if (regtype[YDreg] == WHOLE) {
|
||||||
if (c == 'P') {
|
if (c == 'P') {
|
||||||
dot_begin(); // putting lines- Put above
|
dot_begin(); // putting lines- Put above
|
||||||
}
|
}
|
||||||
if (c == 'p') {
|
else /* if ( c == 'p') */ {
|
||||||
// are we putting after very last line?
|
// are we putting after very last line?
|
||||||
if (end_line(dot) == (end - 1)) {
|
if (end_line(dot) == (end - 1)) {
|
||||||
dot = end; // force dot to end of text[]
|
dot = end; // force dot to end of text[]
|
||||||
@ -3444,8 +3445,18 @@ static void do_cmd(int c)
|
|||||||
} else {
|
} else {
|
||||||
if (c == 'p')
|
if (c == 'p')
|
||||||
dot_right(); // move to right, can move to NL
|
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
|
end_cmd_q(); // stop adding to q
|
||||||
break;
|
break;
|
||||||
case 'U': // U- Undo; replace current line with original version
|
case 'U': // U- Undo; replace current line with original version
|
||||||
|
Loading…
Reference in New Issue
Block a user