diff options
| author | Ron Yorston <rmy@pobox.com> | 2021-04-15 12:03:58 +0100 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-04-15 13:09:12 +0200 |
| commit | ac6495f6fbb97cb59ccd0a6744660346fd9b80b3 (patch) | |
| tree | eb4bf13d5b3f9fda9e1fe0c8c658d2d9d5a8eeaa | |
| parent | d6e653d667bc1eb343014508a8bddb3dd4945f78 (diff) | |
| download | busybox-w32-ac6495f6fbb97cb59ccd0a6744660346fd9b80b3.tar.gz busybox-w32-ac6495f6fbb97cb59ccd0a6744660346fd9b80b3.tar.bz2 busybox-w32-ac6495f6fbb97cb59ccd0a6744660346fd9b80b3.zip | |
vi: allow ctrl-D to reduce indentation
When whitespace has been automatically added to a new line due to
autoindent entering ctrl-D should reduce the level of indentation.
Implement an approximation of this by treating ctrl-D as backspace.
For the common case of indentation using tabs this is good enough.
My attempt at a full implementation was three times bigger.
function old new delta
char_insert 476 531 +55
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 55/0) Total: 55 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | editors/vi.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/editors/vi.c b/editors/vi.c index 780c81234..0a82f9e38 100644 --- a/editors/vi.c +++ b/editors/vi.c | |||
| @@ -2072,6 +2072,11 @@ static uintptr_t stupid_insert(char *p, char c) // stupidly insert the char c at | |||
| 2072 | #endif | 2072 | #endif |
| 2073 | static char *char_insert(char *p, char c, int undo) // insert the char c at 'p' | 2073 | static char *char_insert(char *p, char c, int undo) // insert the char c at 'p' |
| 2074 | { | 2074 | { |
| 2075 | #if ENABLE_FEATURE_VI_SETOPTS | ||
| 2076 | char *q; | ||
| 2077 | size_t len; | ||
| 2078 | #endif | ||
| 2079 | |||
| 2075 | if (c == 22) { // Is this an ctrl-V? | 2080 | if (c == 22) { // Is this an ctrl-V? |
| 2076 | p += stupid_insert(p, '^'); // use ^ to indicate literal next | 2081 | p += stupid_insert(p, '^'); // use ^ to indicate literal next |
| 2077 | refresh(FALSE); // show the ^ | 2082 | refresh(FALSE); // show the ^ |
| @@ -2092,6 +2097,15 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p' | |||
| 2092 | if ((p[-1] != '\n') && (dot > text)) { | 2097 | if ((p[-1] != '\n') && (dot > text)) { |
| 2093 | p--; | 2098 | p--; |
| 2094 | } | 2099 | } |
| 2100 | #if ENABLE_FEATURE_VI_SETOPTS | ||
| 2101 | } else if (c == 4 && autoindent) { // ctrl-D reduces indentation | ||
| 2102 | q = begin_line(p); | ||
| 2103 | len = strspn(q, " \t"); | ||
| 2104 | if (len && q + len == p) { | ||
| 2105 | p--; | ||
| 2106 | p = text_hole_delete(p, p, ALLOW_UNDO_QUEUED); | ||
| 2107 | } | ||
| 2108 | #endif | ||
| 2095 | } else if (c == term_orig.c_cc[VERASE] || c == 8 || c == 127) { // Is this a BS | 2109 | } else if (c == term_orig.c_cc[VERASE] || c == 8 || c == 127) { // Is this a BS |
| 2096 | if (p > text) { | 2110 | if (p > text) { |
| 2097 | p--; | 2111 | p--; |
| @@ -2116,8 +2130,6 @@ static char *char_insert(char *p, char c, int undo) // insert the char c at 'p' | |||
| 2116 | showmatching(p - 1); | 2130 | showmatching(p - 1); |
| 2117 | } | 2131 | } |
| 2118 | if (autoindent && c == '\n') { // auto indent the new line | 2132 | if (autoindent && c == '\n') { // auto indent the new line |
| 2119 | char *q; | ||
| 2120 | size_t len; | ||
| 2121 | q = prev_line(p); // use prev line as template | 2133 | q = prev_line(p); // use prev line as template |
| 2122 | len = strspn(q, " \t"); // space or tab | 2134 | len = strspn(q, " \t"); // space or tab |
| 2123 | if (len) { | 2135 | if (len) { |
