Re: [PATCH][RFC] grep: add color.grep.matchcontext and color.grep.matchselected

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



René Scharfe <l.s.r@xxxxxx> writes:

> The config option color.grep.match can be used to specify the highlighting
> color for matching strings.  Add the options matchContext and matchSelected
> to allow different colors to be specified for matching strings in the
> context vs. in selected lines.  This is similar to the ms and mc specifiers
> in GNU grep's environment variable GREP_COLORS.
>
> Signed-off-by: Rene Scharfe <l.s.r@xxxxxx>
> ---
> Only *very* lightly tested, and a test for t/is missing anyway.  Just
> wanted to quickly show what I meant.  You'd set color.grep.matchContext=""
> to turn off highlighting in context lines.  What do you think?

I didn't realize that people wanted to see pieces on non-matching
lines highlighted.  It makes certain sense, e.g. it would allow you
to spot near-misses, but that is only true for lines that neighbour
real hits, so...

I like this approach better in that it makes those who want a
different behaviour to do the work without breaking the expectation
of those who are used to the established behaviour.

Zoltan?



>  Documentation/config.txt |  6 +++++-
>  grep.c                   | 29 ++++++++++++++++++++++-------
>  grep.h                   |  3 ++-
>  3 files changed, 29 insertions(+), 9 deletions(-)
>
> diff --git a/Documentation/config.txt b/Documentation/config.txt
> index 8b49813..78832ae 100644
> --- a/Documentation/config.txt
> +++ b/Documentation/config.txt
> @@ -885,7 +885,11 @@ color.grep.<slot>::
>  `linenumber`;;
>  	line number prefix (when using `-n`)
>  `match`;;
> -	matching text
> +	matching text (same as setting `matchContext` and `matchSelected`)
> +`matchContext`;;
> +	matching text in context lines
> +`matchSelected`;;
> +	matching text in selected lines
>  `selected`;;
>  	non-matching text in selected lines
>  `separator`;;
> diff --git a/grep.c b/grep.c
> index 4dc31ea..6e085f8 100644
> --- a/grep.c
> +++ b/grep.c
> @@ -35,7 +35,8 @@ void init_grep_defaults(void)
>  	strcpy(opt->color_filename, "");
>  	strcpy(opt->color_function, "");
>  	strcpy(opt->color_lineno, "");
> -	strcpy(opt->color_match, GIT_COLOR_BOLD_RED);
> +	strcpy(opt->color_match_context, GIT_COLOR_BOLD_RED);
> +	strcpy(opt->color_match_selected, GIT_COLOR_BOLD_RED);
>  	strcpy(opt->color_selected, "");
>  	strcpy(opt->color_sep, GIT_COLOR_CYAN);
>  	opt->color = -1;
> @@ -101,12 +102,22 @@ int grep_config(const char *var, const char *value, void *cb)
>  		color = opt->color_function;
>  	else if (!strcmp(var, "color.grep.linenumber"))
>  		color = opt->color_lineno;
> -	else if (!strcmp(var, "color.grep.match"))
> -		color = opt->color_match;
> +	else if (!strcmp(var, "color.grep.matchcontext"))
> +		color = opt->color_match_context;
> +	else if (!strcmp(var, "color.grep.matchselected"))
> +		color = opt->color_match_selected;
>  	else if (!strcmp(var, "color.grep.selected"))
>  		color = opt->color_selected;
>  	else if (!strcmp(var, "color.grep.separator"))
>  		color = opt->color_sep;
> +	else if (!strcmp(var, "color.grep.match")) {
> +		int rc = 0;
> +		if (!value)
> +			return config_error_nonbool(var);
> +		rc |= color_parse(value, opt->color_match_context);
> +		rc |= color_parse(value, opt->color_match_selected);
> +		return rc;
> +	}
>  
>  	if (color) {
>  		if (!value)
> @@ -144,7 +155,8 @@ void grep_init(struct grep_opt *opt, const char *prefix)
>  	strcpy(opt->color_filename, def->color_filename);
>  	strcpy(opt->color_function, def->color_function);
>  	strcpy(opt->color_lineno, def->color_lineno);
> -	strcpy(opt->color_match, def->color_match);
> +	strcpy(opt->color_match_context, def->color_match_context);
> +	strcpy(opt->color_match_selected, def->color_match_selected);
>  	strcpy(opt->color_selected, def->color_selected);
>  	strcpy(opt->color_sep, def->color_sep);
>  }
> @@ -1084,7 +1096,7 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
>  		      const char *name, unsigned lno, char sign)
>  {
>  	int rest = eol - bol;
> -	char *line_color = NULL;
> +	const char *match_color, *line_color = NULL;
>  
>  	if (opt->file_break && opt->last_shown == 0) {
>  		if (opt->show_hunk_mark)
> @@ -1123,6 +1135,10 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
>  		int eflags = 0;
>  
>  		if (sign == ':')
> +			match_color = opt->color_match_selected;
> +		else
> +			match_color = opt->color_match_context;
> +		if (sign == ':')
>  			line_color = opt->color_selected;
>  		else if (sign == '-')
>  			line_color = opt->color_context;
> @@ -1135,8 +1151,7 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
>  
>  			output_color(opt, bol, match.rm_so, line_color);
>  			output_color(opt, bol + match.rm_so,
> -				     match.rm_eo - match.rm_so,
> -				     opt->color_match);
> +				     match.rm_eo - match.rm_so, match_color);
>  			bol += match.rm_eo;
>  			rest -= match.rm_eo;
>  			eflags = REG_NOTBOL;
> diff --git a/grep.h b/grep.h
> index eaaced1..95f197a 100644
> --- a/grep.h
> +++ b/grep.h
> @@ -124,7 +124,8 @@ struct grep_opt {
>  	char color_filename[COLOR_MAXLEN];
>  	char color_function[COLOR_MAXLEN];
>  	char color_lineno[COLOR_MAXLEN];
> -	char color_match[COLOR_MAXLEN];
> +	char color_match_context[COLOR_MAXLEN];
> +	char color_match_selected[COLOR_MAXLEN];
>  	char color_selected[COLOR_MAXLEN];
>  	char color_sep[COLOR_MAXLEN];
>  	int regflags;
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]