This implements the vim option expandtab in vi.
It replaces tabs with spaces while in insert mode.
---
>From vim help.txt:
In Insert mode: Use the appropriate number of spaces to insert a
<Tab>. Spaces are used in indents with the '>' and '<' commands and
when 'autoindent' is on. To insert a real tab when 'expandtab' is
on, use CTRL-V<Tab>.
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