vi: fix regression in autoindent handling
Suppose autoindent is enabled and we have a line with an initial
tab where we want to split the words onto separate lines:
split the words
One way to do this is with the sequence 'f r<CR>;r<CR>', but in
BusyBox vi the result is:
split
he
words
This is a regression introduced by commit 9659a8db1
(vi: remove
autoindent from otherwise empty lines). The amount of indentation
is being recorded when the 'r' command inserts a newline but
isn't subsequently reset. A fix is to only record the indent
when in insert or replace mode. Proper handling of the 'o' and
'O' commands then requires them to switch to insert mode before
calling char_insert() to insert a newline.
function old new delta
char_insert 884 891 +7
do_cmd 4243 4247 +4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 11/0) Total: 11 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
7d1c7d8337
commit
af3b585815
@ -2227,7 +2227,10 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p'
|
|||||||
p--; // open above, indent before newly inserted NL
|
p--; // open above, indent before newly inserted NL
|
||||||
|
|
||||||
if (len) {
|
if (len) {
|
||||||
indentcol = col;
|
// only record indent if in insert/replace mode or for
|
||||||
|
// the 'o'/'O' commands, which are switched to insert
|
||||||
|
// mode early.
|
||||||
|
indentcol = cmd_mode != 0 ? col : 0;
|
||||||
if (expandtab) {
|
if (expandtab) {
|
||||||
ntab = 0;
|
ntab = 0;
|
||||||
nspc = col;
|
nspc = col;
|
||||||
@ -4265,6 +4268,9 @@ static void do_cmd(int c)
|
|||||||
case 'o': // o- open an empty line below
|
case 'o': // o- open an empty line below
|
||||||
dot_end();
|
dot_end();
|
||||||
dc3:
|
dc3:
|
||||||
|
#if ENABLE_FEATURE_VI_SETOPTS
|
||||||
|
cmd_mode = 1; // switch to insert mode early
|
||||||
|
#endif
|
||||||
dot = char_insert(dot, '\n', ALLOW_UNDO);
|
dot = char_insert(dot, '\n', ALLOW_UNDO);
|
||||||
if (c == 'O' && !autoindent) {
|
if (c == 'O' && !autoindent) {
|
||||||
// done in char_insert() for 'O'+autoindent
|
// done in char_insert() for 'O'+autoindent
|
||||||
|
Loading…
Reference in New Issue
Block a user