提交 f1aa782a 编写于 作者: J Junio C Hamano

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_*
...@@ -690,9 +690,29 @@ color.grep:: ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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)
......
...@@ -30,7 +30,18 @@ ...@@ -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
......
...@@ -80,12 +80,12 @@ static char column_colors[][COLOR_MAXLEN] = { ...@@ -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))
......
...@@ -304,9 +304,28 @@ static int word_char(char ch) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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;
......
...@@ -86,7 +86,13 @@ struct grep_opt { ...@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册