From df201a1b049637caf309110e63419d8fb7396e7e Mon Sep 17 00:00:00 2001 From: Liu Hao Date: Tue, 5 Sep 2017 15:30:01 +0800 Subject: [PATCH 7/9] tweaks: alter undenting behavior When unindenting lines, strip all leading spaces if they are shorter than a TAB, rather than do nothing. Signed-off-by: Liu Hao --- src/text.c | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/text.c b/src/text.c index b5ba75e6..ae3c6e5b 100644 --- a/src/text.c +++ b/src/text.c @@ -348,24 +348,28 @@ void do_indent(void) } /* If the given text starts with a tab's worth of whitespace, return the - * number of bytes this whitespace occupies. Otherwise, return zero. */ + * number of bytes this whitespace occupies. Otherwise, if there are + spaces at all, returns the number of bytes of the whitespace. + Otherwise, return zero. */ size_t length_of_white(const char *text) { - size_t bytes_of_white = 1; + size_t bytes = 0, width = 0; while (TRUE) { - if (*text == '\t') - return bytes_of_white; - - if (*text != ' ') - return 0; - - if (bytes_of_white == tabsize) - return tabsize; - - bytes_of_white++; - text++; + if (text[bytes] == '\t') { + width += tabsize; + ++bytes; + } else if (text[bytes] == ' ') { + width += 1; + ++bytes; + } else { + break; + } + if (width >= tabsize) { + break; + } } + return bytes; } /* Remove an indent from the given line. */ @@ -414,15 +418,16 @@ void do_unindent(void) bot = top; } - /* If any of the lines cannot be unindented and does not consist of - * only whitespace, we don't change anything. */ + /* Check if there is a line that can be unindented. */ for (line = top; line != bot->next; line = line->next) { - if (length_of_white(line->data) == 0 && !white_string(line->data)) { - statusline(HUSH, _("Can unindent only by a full tab size")); - return; - } + if (length_of_white(line->data) != 0) + break; } + /* If none of the lines can be unindented, there is nothing to do. */ + if (line == bot->next) + return; + add_undo(UNINDENT); /* Go through each of the lines and remove their leading indent. */ -- 2.15.0