From: Ping Yin Date: Sat, 03 May 2008 11:57:07 GMT Subject: [PATCH v2 4/5] Make boundary characters for --color-words configurable Message-ID: <1209815828-6548-5-git-send-email-pkufranky@gmail.com> In-Reply-To: <1209815828-6548-4-git-send-email-pkufranky@gmail.com> Previously --color-words only allow spaces as boundary characters. However, just space is not enough. For example, when i rename a function from foo to bar, following example doesn't show as expected when using --color-words. ------------------ - if (foo(arg)) + if (bar(arg)) ------------------ It shows as "if (foo(arg))(foo(arg))". Actually, it's the best to show as "if (foobar(arg))". Here "r" and "g" represent "red" and "green" separately. This patch introduces a configuration diff.nonwordchars to make --color-words treat both spaces and characters in diff.nonwordchars as boundary characters. If we set diff.nonwordchars to "()", the example above will show as "if (foo(bar(arg))". It's much better, athough not the best, Signed-off-by: Ping Yin --- Documentation/config.txt | 4 ++++ Documentation/diff-options.txt | 1 + diff.c | 12 +++++++++++- 3 files changed, 16 insertions(+), 1 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 824e416..812ec2c 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -537,6 +537,10 @@ diff.external:: program only on a subset of your files, you might want to use linkgit:gitattributes[5] instead. +diff.nonwordchars:: + Specify additional boundary characters other than spaces for + --color-words. + diff.renameLimit:: The number of files to consider when performing the copy/rename detection; equivalent to the git diff option '-l'. diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index 13234fa..60dd5e6 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -95,6 +95,7 @@ endif::git-format-patch[] --color-words:: Show colored word diff, i.e. color words which have changed. + The boundary characters can be configured with diff.nonwordchars. --no-renames:: Turn off rename detection, even when the configuration diff --git a/diff.c b/diff.c index 11316fe..50d7fa7 100644 --- a/diff.c +++ b/diff.c @@ -23,6 +23,7 @@ static int diff_rename_limit_default = 100; int diff_use_color_default = -1; static const char *external_diff_cmd_cfg; int diff_auto_refresh_index = 1; +static const char *diff_non_word_chars = ""; static char diff_colors[][COLOR_MAXLEN] = { "\033[m", /* reset */ @@ -159,6 +160,10 @@ int git_diff_ui_config(const char *var, const char *value) external_diff_cmd_cfg = xstrdup(value); return 0; } + if (!strcmp(var, "diff.nonwordchars")) { + diff_non_word_chars = value ? xstrdup(value) : ""; + return 0; + } if (!prefixcmp(var, "diff.")) { const char *ep = strrchr(var, '.'); @@ -443,6 +448,11 @@ static void fn_out_diff_words_aux(void *priv, char *line, unsigned long len) } } +static int is_non_word_char(char c) +{ + return isspace(c) || !!strchr(diff_non_word_chars, c); +} + static mmfile_copy_set_boundary(mmfile_t *dest, mmfile_t *src) { int i; @@ -450,7 +460,7 @@ static mmfile_copy_set_boundary(mmfile_t *dest, mmfile_t *src) { dest->ptr = xmalloc(dest->size); memcpy(dest->ptr, src->ptr, dest->size); for (i = 0; i < dest->size; i++) - if (isspace(dest->ptr[i])) + if (is_non_word_char(dest->ptr[i])) dest->ptr[i] = '\n'; } -- 1.5.5.1.121.g26b3