Merge branch 'ml/color-grep'
* ml/color-grep: grep: Colorize selected, context, and function lines grep: Colorize filename, line number, and separator Add GIT_COLOR_BOLD_* and GIT_COLOR_BG_*
This commit is contained in:
75
grep.c
75
grep.c
@ -304,9 +304,28 @@ static int word_char(char ch)
|
||||
return isalnum(ch) || ch == '_';
|
||||
}
|
||||
|
||||
static void output_color(struct grep_opt *opt, const void *data, size_t size,
|
||||
const char *color)
|
||||
{
|
||||
if (opt->color && color && color[0]) {
|
||||
opt->output(opt, color, strlen(color));
|
||||
opt->output(opt, data, size);
|
||||
opt->output(opt, GIT_COLOR_RESET, strlen(GIT_COLOR_RESET));
|
||||
} else
|
||||
opt->output(opt, data, size);
|
||||
}
|
||||
|
||||
static void output_sep(struct grep_opt *opt, char sign)
|
||||
{
|
||||
if (opt->null_following_name)
|
||||
opt->output(opt, "\0", 1);
|
||||
else
|
||||
output_color(opt, &sign, 1, opt->color_sep);
|
||||
}
|
||||
|
||||
static void show_name(struct grep_opt *opt, const char *name)
|
||||
{
|
||||
opt->output(opt, name, strlen(name));
|
||||
output_color(opt, name, strlen(name), opt->color_filename);
|
||||
opt->output(opt, opt->null_following_name ? "\0" : "\n", 1);
|
||||
}
|
||||
|
||||
@ -544,31 +563,31 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
|
||||
const char *name, unsigned lno, char sign)
|
||||
{
|
||||
int rest = eol - bol;
|
||||
char sign_str[1];
|
||||
char *line_color = NULL;
|
||||
|
||||
sign_str[0] = sign;
|
||||
if (opt->pre_context || opt->post_context) {
|
||||
if (opt->last_shown == 0) {
|
||||
if (opt->show_hunk_mark)
|
||||
opt->output(opt, "--\n", 3);
|
||||
else
|
||||
if (opt->show_hunk_mark) {
|
||||
output_color(opt, "--", 2, opt->color_sep);
|
||||
opt->output(opt, "\n", 1);
|
||||
} else
|
||||
opt->show_hunk_mark = 1;
|
||||
} else if (lno > opt->last_shown + 1)
|
||||
opt->output(opt, "--\n", 3);
|
||||
} else if (lno > opt->last_shown + 1) {
|
||||
output_color(opt, "--", 2, opt->color_sep);
|
||||
opt->output(opt, "\n", 1);
|
||||
}
|
||||
}
|
||||
opt->last_shown = lno;
|
||||
|
||||
if (opt->null_following_name)
|
||||
sign_str[0] = '\0';
|
||||
if (opt->pathname) {
|
||||
opt->output(opt, name, strlen(name));
|
||||
opt->output(opt, sign_str, 1);
|
||||
output_color(opt, name, strlen(name), opt->color_filename);
|
||||
output_sep(opt, sign);
|
||||
}
|
||||
if (opt->linenum) {
|
||||
char buf[32];
|
||||
snprintf(buf, sizeof(buf), "%d", lno);
|
||||
opt->output(opt, buf, strlen(buf));
|
||||
opt->output(opt, sign_str, 1);
|
||||
output_color(opt, buf, strlen(buf), opt->color_lineno);
|
||||
output_sep(opt, sign);
|
||||
}
|
||||
if (opt->color) {
|
||||
regmatch_t match;
|
||||
@ -576,25 +595,28 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
|
||||
int ch = *eol;
|
||||
int eflags = 0;
|
||||
|
||||
if (sign == ':')
|
||||
line_color = opt->color_selected;
|
||||
else if (sign == '-')
|
||||
line_color = opt->color_context;
|
||||
else if (sign == '=')
|
||||
line_color = opt->color_function;
|
||||
*eol = '\0';
|
||||
while (next_match(opt, bol, eol, ctx, &match, eflags)) {
|
||||
if (match.rm_so == match.rm_eo)
|
||||
break;
|
||||
|
||||
opt->output(opt, bol, match.rm_so);
|
||||
opt->output(opt, opt->color_match,
|
||||
strlen(opt->color_match));
|
||||
opt->output(opt, bol + match.rm_so,
|
||||
(int)(match.rm_eo - match.rm_so));
|
||||
opt->output(opt, GIT_COLOR_RESET,
|
||||
strlen(GIT_COLOR_RESET));
|
||||
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);
|
||||
bol += match.rm_eo;
|
||||
rest -= match.rm_eo;
|
||||
eflags = REG_NOTBOL;
|
||||
}
|
||||
*eol = ch;
|
||||
}
|
||||
opt->output(opt, bol, rest);
|
||||
output_color(opt, bol, rest, line_color);
|
||||
opt->output(opt, "\n", 1);
|
||||
}
|
||||
|
||||
@ -857,7 +879,8 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
|
||||
return 1;
|
||||
if (binary_match_only) {
|
||||
opt->output(opt, "Binary file ", 12);
|
||||
opt->output(opt, name, strlen(name));
|
||||
output_color(opt, name, strlen(name),
|
||||
opt->color_filename);
|
||||
opt->output(opt, " matches\n", 9);
|
||||
return 1;
|
||||
}
|
||||
@ -916,9 +939,9 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
|
||||
*/
|
||||
if (opt->count && count) {
|
||||
char buf[32];
|
||||
opt->output(opt, name, strlen(name));
|
||||
snprintf(buf, sizeof(buf), "%c%u\n",
|
||||
opt->null_following_name ? '\0' : ':', count);
|
||||
output_color(opt, name, strlen(name), opt->color_filename);
|
||||
output_sep(opt, ':');
|
||||
snprintf(buf, sizeof(buf), "%u\n", count);
|
||||
opt->output(opt, buf, strlen(buf));
|
||||
}
|
||||
return !!last_hit;
|
||||
|
||||
Reference in New Issue
Block a user