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:
commit
f1aa782a3b
@ -690,9 +690,29 @@ color.grep::
|
|||||||
`never`), never. When set to `true` or `auto`, use color only
|
`never`), never. When set to `true` or `auto`, use color only
|
||||||
when the output is written to the terminal. Defaults to `false`.
|
when the output is written to the terminal. Defaults to `false`.
|
||||||
|
|
||||||
color.grep.match::
|
color.grep.<slot>::
|
||||||
Use customized color for matches. The value of this variable
|
Use customized color for grep colorization. `<slot>` specifies which
|
||||||
may be specified as in color.branch.<slot>.
|
part of the line to use the specified color, and is one of
|
||||||
|
+
|
||||||
|
--
|
||||||
|
`context`;;
|
||||||
|
non-matching text in context lines (when using `-A`, `-B`, or `-C`)
|
||||||
|
`filename`;;
|
||||||
|
filename prefix (when not using `-h`)
|
||||||
|
`function`;;
|
||||||
|
function name lines (when using `-p`)
|
||||||
|
`linenumber`;;
|
||||||
|
line number prefix (when using `-n`)
|
||||||
|
`match`;;
|
||||||
|
matching text
|
||||||
|
`selected`;;
|
||||||
|
non-matching text in selected lines
|
||||||
|
`separator`;;
|
||||||
|
separators between fields on a line (`:`, `-`, and `=`)
|
||||||
|
and between hunks (`--`)
|
||||||
|
--
|
||||||
|
+
|
||||||
|
The values of these variables may be specified as in color.branch.<slot>.
|
||||||
|
|
||||||
color.interactive::
|
color.interactive::
|
||||||
When set to `always`, always use colors for interactive prompts
|
When set to `always`, always use colors for interactive prompts
|
||||||
|
@ -289,6 +289,7 @@ static int wait_all(void)
|
|||||||
static int grep_config(const char *var, const char *value, void *cb)
|
static int grep_config(const char *var, const char *value, void *cb)
|
||||||
{
|
{
|
||||||
struct grep_opt *opt = cb;
|
struct grep_opt *opt = cb;
|
||||||
|
char *color = NULL;
|
||||||
|
|
||||||
switch (userdiff_config(var, value)) {
|
switch (userdiff_config(var, value)) {
|
||||||
case 0: break;
|
case 0: break;
|
||||||
@ -296,17 +297,30 @@ static int grep_config(const char *var, const char *value, void *cb)
|
|||||||
default: return 0;
|
default: return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp(var, "color.grep")) {
|
if (!strcmp(var, "color.grep"))
|
||||||
opt->color = git_config_colorbool(var, value, -1);
|
opt->color = git_config_colorbool(var, value, -1);
|
||||||
return 0;
|
else if (!strcmp(var, "color.grep.context"))
|
||||||
}
|
color = opt->color_context;
|
||||||
if (!strcmp(var, "color.grep.match")) {
|
else if (!strcmp(var, "color.grep.filename"))
|
||||||
|
color = opt->color_filename;
|
||||||
|
else if (!strcmp(var, "color.grep.function"))
|
||||||
|
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.selected"))
|
||||||
|
color = opt->color_selected;
|
||||||
|
else if (!strcmp(var, "color.grep.separator"))
|
||||||
|
color = opt->color_sep;
|
||||||
|
else
|
||||||
|
return git_color_default_config(var, value, cb);
|
||||||
|
if (color) {
|
||||||
if (!value)
|
if (!value)
|
||||||
return config_error_nonbool(var);
|
return config_error_nonbool(var);
|
||||||
color_parse(value, var, opt->color_match);
|
color_parse(value, var, color);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return git_color_default_config(var, value, cb);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -872,7 +886,13 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
|||||||
opt.regflags = REG_NEWLINE;
|
opt.regflags = REG_NEWLINE;
|
||||||
opt.max_depth = -1;
|
opt.max_depth = -1;
|
||||||
|
|
||||||
strcpy(opt.color_match, GIT_COLOR_RED GIT_COLOR_BOLD);
|
strcpy(opt.color_context, "");
|
||||||
|
strcpy(opt.color_filename, "");
|
||||||
|
strcpy(opt.color_function, "");
|
||||||
|
strcpy(opt.color_lineno, "");
|
||||||
|
strcpy(opt.color_match, GIT_COLOR_BOLD_RED);
|
||||||
|
strcpy(opt.color_selected, "");
|
||||||
|
strcpy(opt.color_sep, GIT_COLOR_CYAN);
|
||||||
opt.color = -1;
|
opt.color = -1;
|
||||||
git_config(grep_config, &opt);
|
git_config(grep_config, &opt);
|
||||||
if (opt.color == -1)
|
if (opt.color == -1)
|
||||||
|
11
color.h
11
color.h
@ -30,7 +30,18 @@
|
|||||||
#define GIT_COLOR_BLUE "\033[34m"
|
#define GIT_COLOR_BLUE "\033[34m"
|
||||||
#define GIT_COLOR_MAGENTA "\033[35m"
|
#define GIT_COLOR_MAGENTA "\033[35m"
|
||||||
#define GIT_COLOR_CYAN "\033[36m"
|
#define GIT_COLOR_CYAN "\033[36m"
|
||||||
|
#define GIT_COLOR_BOLD_RED "\033[1;31m"
|
||||||
|
#define GIT_COLOR_BOLD_GREEN "\033[1;32m"
|
||||||
|
#define GIT_COLOR_BOLD_YELLOW "\033[1;33m"
|
||||||
|
#define GIT_COLOR_BOLD_BLUE "\033[1;34m"
|
||||||
|
#define GIT_COLOR_BOLD_MAGENTA "\033[1;35m"
|
||||||
|
#define GIT_COLOR_BOLD_CYAN "\033[1;36m"
|
||||||
#define GIT_COLOR_BG_RED "\033[41m"
|
#define GIT_COLOR_BG_RED "\033[41m"
|
||||||
|
#define GIT_COLOR_BG_GREEN "\033[42m"
|
||||||
|
#define GIT_COLOR_BG_YELLOW "\033[43m"
|
||||||
|
#define GIT_COLOR_BG_BLUE "\033[44m"
|
||||||
|
#define GIT_COLOR_BG_MAGENTA "\033[45m"
|
||||||
|
#define GIT_COLOR_BG_CYAN "\033[46m"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This variable stores the value of color.ui
|
* This variable stores the value of color.ui
|
||||||
|
12
graph.c
12
graph.c
@ -80,12 +80,12 @@ static char column_colors[][COLOR_MAXLEN] = {
|
|||||||
GIT_COLOR_BLUE,
|
GIT_COLOR_BLUE,
|
||||||
GIT_COLOR_MAGENTA,
|
GIT_COLOR_MAGENTA,
|
||||||
GIT_COLOR_CYAN,
|
GIT_COLOR_CYAN,
|
||||||
GIT_COLOR_BOLD GIT_COLOR_RED,
|
GIT_COLOR_BOLD_RED,
|
||||||
GIT_COLOR_BOLD GIT_COLOR_GREEN,
|
GIT_COLOR_BOLD_GREEN,
|
||||||
GIT_COLOR_BOLD GIT_COLOR_YELLOW,
|
GIT_COLOR_BOLD_YELLOW,
|
||||||
GIT_COLOR_BOLD GIT_COLOR_BLUE,
|
GIT_COLOR_BOLD_BLUE,
|
||||||
GIT_COLOR_BOLD GIT_COLOR_MAGENTA,
|
GIT_COLOR_BOLD_MAGENTA,
|
||||||
GIT_COLOR_BOLD GIT_COLOR_CYAN,
|
GIT_COLOR_BOLD_CYAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define COLUMN_COLORS_MAX (ARRAY_SIZE(column_colors))
|
#define COLUMN_COLORS_MAX (ARRAY_SIZE(column_colors))
|
||||||
|
75
grep.c
75
grep.c
@ -304,9 +304,28 @@ static int word_char(char ch)
|
|||||||
return isalnum(ch) || 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)
|
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);
|
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)
|
const char *name, unsigned lno, char sign)
|
||||||
{
|
{
|
||||||
int rest = eol - bol;
|
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->pre_context || opt->post_context) {
|
||||||
if (opt->last_shown == 0) {
|
if (opt->last_shown == 0) {
|
||||||
if (opt->show_hunk_mark)
|
if (opt->show_hunk_mark) {
|
||||||
opt->output(opt, "--\n", 3);
|
output_color(opt, "--", 2, opt->color_sep);
|
||||||
else
|
opt->output(opt, "\n", 1);
|
||||||
|
} else
|
||||||
opt->show_hunk_mark = 1;
|
opt->show_hunk_mark = 1;
|
||||||
} else if (lno > opt->last_shown + 1)
|
} else if (lno > opt->last_shown + 1) {
|
||||||
opt->output(opt, "--\n", 3);
|
output_color(opt, "--", 2, opt->color_sep);
|
||||||
|
opt->output(opt, "\n", 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
opt->last_shown = lno;
|
opt->last_shown = lno;
|
||||||
|
|
||||||
if (opt->null_following_name)
|
|
||||||
sign_str[0] = '\0';
|
|
||||||
if (opt->pathname) {
|
if (opt->pathname) {
|
||||||
opt->output(opt, name, strlen(name));
|
output_color(opt, name, strlen(name), opt->color_filename);
|
||||||
opt->output(opt, sign_str, 1);
|
output_sep(opt, sign);
|
||||||
}
|
}
|
||||||
if (opt->linenum) {
|
if (opt->linenum) {
|
||||||
char buf[32];
|
char buf[32];
|
||||||
snprintf(buf, sizeof(buf), "%d", lno);
|
snprintf(buf, sizeof(buf), "%d", lno);
|
||||||
opt->output(opt, buf, strlen(buf));
|
output_color(opt, buf, strlen(buf), opt->color_lineno);
|
||||||
opt->output(opt, sign_str, 1);
|
output_sep(opt, sign);
|
||||||
}
|
}
|
||||||
if (opt->color) {
|
if (opt->color) {
|
||||||
regmatch_t match;
|
regmatch_t match;
|
||||||
@ -576,25 +595,28 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
|
|||||||
int ch = *eol;
|
int ch = *eol;
|
||||||
int eflags = 0;
|
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';
|
*eol = '\0';
|
||||||
while (next_match(opt, bol, eol, ctx, &match, eflags)) {
|
while (next_match(opt, bol, eol, ctx, &match, eflags)) {
|
||||||
if (match.rm_so == match.rm_eo)
|
if (match.rm_so == match.rm_eo)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
opt->output(opt, bol, match.rm_so);
|
output_color(opt, bol, match.rm_so, line_color);
|
||||||
opt->output(opt, opt->color_match,
|
output_color(opt, bol + match.rm_so,
|
||||||
strlen(opt->color_match));
|
match.rm_eo - match.rm_so,
|
||||||
opt->output(opt, bol + match.rm_so,
|
opt->color_match);
|
||||||
(int)(match.rm_eo - match.rm_so));
|
|
||||||
opt->output(opt, GIT_COLOR_RESET,
|
|
||||||
strlen(GIT_COLOR_RESET));
|
|
||||||
bol += match.rm_eo;
|
bol += match.rm_eo;
|
||||||
rest -= match.rm_eo;
|
rest -= match.rm_eo;
|
||||||
eflags = REG_NOTBOL;
|
eflags = REG_NOTBOL;
|
||||||
}
|
}
|
||||||
*eol = ch;
|
*eol = ch;
|
||||||
}
|
}
|
||||||
opt->output(opt, bol, rest);
|
output_color(opt, bol, rest, line_color);
|
||||||
opt->output(opt, "\n", 1);
|
opt->output(opt, "\n", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -857,7 +879,8 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
|
|||||||
return 1;
|
return 1;
|
||||||
if (binary_match_only) {
|
if (binary_match_only) {
|
||||||
opt->output(opt, "Binary file ", 12);
|
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);
|
opt->output(opt, " matches\n", 9);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -916,9 +939,9 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
|
|||||||
*/
|
*/
|
||||||
if (opt->count && count) {
|
if (opt->count && count) {
|
||||||
char buf[32];
|
char buf[32];
|
||||||
opt->output(opt, name, strlen(name));
|
output_color(opt, name, strlen(name), opt->color_filename);
|
||||||
snprintf(buf, sizeof(buf), "%c%u\n",
|
output_sep(opt, ':');
|
||||||
opt->null_following_name ? '\0' : ':', count);
|
snprintf(buf, sizeof(buf), "%u\n", count);
|
||||||
opt->output(opt, buf, strlen(buf));
|
opt->output(opt, buf, strlen(buf));
|
||||||
}
|
}
|
||||||
return !!last_hit;
|
return !!last_hit;
|
||||||
|
6
grep.h
6
grep.h
@ -86,7 +86,13 @@ struct grep_opt {
|
|||||||
int color;
|
int color;
|
||||||
int max_depth;
|
int max_depth;
|
||||||
int funcname;
|
int funcname;
|
||||||
|
char color_context[COLOR_MAXLEN];
|
||||||
|
char color_filename[COLOR_MAXLEN];
|
||||||
|
char color_function[COLOR_MAXLEN];
|
||||||
|
char color_lineno[COLOR_MAXLEN];
|
||||||
char color_match[COLOR_MAXLEN];
|
char color_match[COLOR_MAXLEN];
|
||||||
|
char color_selected[COLOR_MAXLEN];
|
||||||
|
char color_sep[COLOR_MAXLEN];
|
||||||
int regflags;
|
int regflags;
|
||||||
unsigned pre_context;
|
unsigned pre_context;
|
||||||
unsigned post_context;
|
unsigned post_context;
|
||||||
|
Loading…
Reference in New Issue
Block a user