whitespace: more accurate initial-indent highlighting
authorJ. Bruce Fields <bfields@citi.umich.edu>
Sun, 16 Dec 2007 16:31:41 +0000 (11:31 -0500)
committerJunio C Hamano <gitster@pobox.com>
Sun, 16 Dec 2007 21:07:58 +0000 (13:07 -0800)
Instead of highlighting the entire initial indent, highlight only the
problematic spaces.

In the case of an indent like ' \t \t' there may be multiple problematic
ranges, so it's easiest to emit the highlighting as we go instead of
trying rember disjoint ranges and do it all at the end.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
ws.c

diff --git a/ws.c b/ws.c
index aabd50902b70a19c459fad9c8c22954e0685227c..d09b9df89a7e19367640d4c6ad64ff828d01d26f 100644 (file)
--- a/ws.c
+++ b/ws.c
@@ -150,24 +150,32 @@ unsigned check_and_emit_line(const char *line, int len, unsigned ws_rule,
                        continue;
                if (line[i] != '\t')
                        break;
-               if ((ws_rule & WS_SPACE_BEFORE_TAB) && written < i)
+               if ((ws_rule & WS_SPACE_BEFORE_TAB) && written < i) {
                        result |= WS_SPACE_BEFORE_TAB;
+                       if (stream) {
+                               fputs(ws, stream);
+                               fwrite(line + written, i - written, 1, stream);
+                               fputs(reset, stream);
+                       }
+               } else if (stream)
+                       fwrite(line + written, i - written, 1, stream);
+               if (stream)
+                       fwrite(line + i, 1, 1, stream);
                written = i + 1;
        }
 
        /* Check for indent using non-tab. */
-       if ((ws_rule & WS_INDENT_WITH_NON_TAB) && i - written >= 8)
+       if ((ws_rule & WS_INDENT_WITH_NON_TAB) && i - written >= 8) {
                result |= WS_INDENT_WITH_NON_TAB;
-
-       if (stream) {
-               /* Highlight errors in leading whitespace. */
-               if ((result & WS_SPACE_BEFORE_TAB) ||
-                   (result & WS_INDENT_WITH_NON_TAB)) {
+               if (stream) {
                        fputs(ws, stream);
-                       fwrite(line, written, 1, stream);
+                       fwrite(line + written, i - written, 1, stream);
                        fputs(reset, stream);
                }
+               written = i;
+       }
 
+       if (stream) {
                /* Now the rest of the line starts at written.
                 * The non-highlighted part ends at trailing_whitespace. */
                if (trailing_whitespace == -1)