diff options
author | Ron Yorston | 2021-05-20 08:27:19 +0100 |
---|---|---|
committer | Denys Vlasenko | 2021-06-02 06:16:36 +0200 |
commit | 16e2fa9049d5ddd7d4c8aea875dad91e07868685 (patch) | |
tree | db0cd0f8737feeff6663e0feaf4f4c72613e7919 /editors/vi.c | |
parent | d95f89ec576c5a0ecba24ead7f012f1fd8ea7b9b (diff) | |
download | busybox-16e2fa9049d5ddd7d4c8aea875dad91e07868685.zip busybox-16e2fa9049d5ddd7d4c8aea875dad91e07868685.tar.gz |
vi: make autoindent respect expandtab setting
Autoindent took a copy of the indent from a neighbouring line, which
may not have respected the expandtab setting.
Determine the target column and construct a suitable indent. This
will consist entirely of spaces if expandtab is enabled or an
efficient combination of tabs and spaces otherwise.
function old new delta
char_insert 719 741 +22
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 22/0) Total: 22 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'editors/vi.c')
-rw-r--r-- | editors/vi.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/editors/vi.c b/editors/vi.c index c4f3b96..36116e6 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -2111,6 +2111,7 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p' #if ENABLE_FEATURE_VI_SETOPTS char *q; size_t len; + int col, ntab, nspc; #endif if (c == 22) { // Is this an ctrl-V? @@ -2151,7 +2152,7 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p' } #if ENABLE_FEATURE_VI_SETOPTS } else if (c == '\t' && expandtab) { // expand tab - int col = get_column(p); + col = get_column(p); col = next_tabstop(col) - col + 1; while (col--) { # if ENABLE_FEATURE_VI_UNDO @@ -2186,23 +2187,28 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p' showmatching(p - 1); } if (autoindent && c == '\n') { // auto indent the new line - // use current/previous line as template + // use indent of current/previous line q = openabove ? p : prev_line(p); len = strspn(q, " \t"); // space or tab - if (openabove) { - p--; // this replaces dot_prev() in do_cmd() - q += len; // template will be shifted by text_hole_make() - } + if (openabove) + p--; // indent goes before newly inserted NL if (len) { - uintptr_t bias; - bias = text_hole_make(p, len); - p += bias; - q += bias; + col = get_column(q + len); + if (expandtab) { + ntab = 0; + nspc = col; + } else { + ntab = col / tabstop; + nspc = col % tabstop; + } + p += text_hole_make(p, ntab + nspc); # if ENABLE_FEATURE_VI_UNDO - undo_push_insert(p, len, undo); + undo_push_insert(p, ntab + nspc, undo); # endif - memcpy(p, q, len); - p += len; + memset(p, '\t', ntab); + p += ntab; + memset(p, ' ', nspc); + p += nspc; } } #endif |