From 0b5e3fdf6e1ded3948b91dd9976874ff076278a5 Mon Sep 17 00:00:00 2001 From: Liu Hao Date: Tue, 5 Sep 2017 15:30:01 +0800 Subject: [PATCH 4/6] When untabifying lines, strip all leading spaces if they are shorter than a TAB, rather than do nothing. --- src/text.c | 43 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/src/text.c b/src/text.c index 0c9dd170..2de10948 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; - - while (TRUE) { - if (*text == '\t') - return bytes_of_white; - - if (*text != ' ') - return 0; - - if (bytes_of_white == tabsize) - return tabsize; - - bytes_of_white++; - text++; + size_t bytes = 0, width = 0; + + for(;;){ + 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,6 @@ 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. */ - 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; - } - } - add_undo(UNINDENT); /* Go through each of the lines and remove their leading indent. */ -- 2.15.0