This implements the vim option expandtab in vi. It replaces tabs with spaces while in insert mode.
function old new delta do_cmd 4780 4879 +99 .rodata 98139 98152 +13 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/0 up/down: 112/0) Total: 112 bytes Signed-off-by: Peter D <[email protected]> --- This adds a Signed-off-by line and bloatcheck the patch, as discussed before editors/vi.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/editors/vi.c b/editors/vi.c index 6dd951421..632f29163 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -292,11 +292,13 @@ struct globals { #define VI_ERR_METHOD (1 << 1) #define VI_IGNORECASE (1 << 2) #define VI_SHOWMATCH (1 << 3) -#define VI_TABSTOP (1 << 4) +#define VI_EXPANDTAB (1 << 4) +#define VI_TABSTOP (1 << 5) #define autoindent (vi_setops & VI_AUTOINDENT) #define err_method (vi_setops & VI_ERR_METHOD) // indicate error with beep or flash #define ignorecase (vi_setops & VI_IGNORECASE) #define showmatch (vi_setops & VI_SHOWMATCH ) +#define expandtab (vi_setops & VI_EXPANDTAB ) #define openabove (vi_setops & VI_TABSTOP ) // order of constants and strings must match #define OPTS_STR \ @@ -304,6 +306,7 @@ struct globals { "fl\0""flash\0" \ "ic\0""ignorecase\0" \ "sm\0""showmatch\0" \ + "et\0""expandtab\0" \ "ts\0""tabstop\0" #define set_openabove() (vi_setops |= VI_TABSTOP) #define clear_openabove() (vi_setops &= ~VI_TABSTOP) @@ -3363,6 +3366,16 @@ static void do_cmd(int c) } } if (cmd_mode == 1) { + if (c == '\t' && expandtab) { + // insert tabstop spaces instead + for (i = 0; i < tabstop; ++i) { + char_insert(dot, ' ', NO_UNDO); + //mode cursor right + dot_right(); + } + // skip inserting c + goto dc1; + } // hitting "Insert" twice means "R" replace mode if (c == KEYCODE_INSERT) goto dc5; // insert the char c at "dot" @@ -3752,7 +3765,7 @@ static void do_cmd(int c) i = count_lines(p, q); // # of lines we are shifting for ( ; i > 0; i--, p = next_line(p)) { if (c == '<') { - // shift left- remove tab or 8 spaces + // shift left- remove tab or tabstop spaces if (*p == '\t') { // shrink buffer 1 char text_hole_delete(p, p, allow_undo); @@ -3766,8 +3779,17 @@ static void do_cmd(int c) } } } else /* if (c == '>') */ { - // shift right -- add tab or 8 spaces - char_insert(p, '\t', allow_undo); + // shift right -- add tab or tabstop spaces + if (expandtab) { + for (j = 0; j < tabstop; ++j) { + char_insert(p, ' ', allow_undo); +#if ENABLE_FEATURE_VI_UNDO + allow_undo = ALLOW_UNDO_CHAIN; +#endif + } + } else { + char_insert(p, '\t', allow_undo); + } } #if ENABLE_FEATURE_VI_UNDO allow_undo = ALLOW_UNDO_CHAIN; -- 2.31.1 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
