From: Mark Lodato <lodatom@gmail.com>
To: git@vger.kernel.org
Cc: Mark Lodato <lodatom@gmail.com>
Subject: [PATCH 4/5] grep: Colorize filename, line number, and separator
Date: Fri, 26 Feb 2010 23:57:49 -0500 [thread overview]
Message-ID: <1267246670-19118-5-git-send-email-lodatom@gmail.com> (raw)
In-Reply-To: <1267246670-19118-1-git-send-email-lodatom@gmail.com>
Colorize the filename, line number, and separator in git grep output, as
GNU grep does. The colors are customizable through color.grep.<slot>.
The default is to only color the separator (in cyan), since this gives
the biggest legibility increase without overwhelming the user with
colors. GNU grep also defaults cyan for the separator, but defaults to
magenta for the filename and to green for the line number, as well.
There are a few differences from GNU grep:
1. With --name-only, GNU grep colors the filenames, but we do not. I do
not see any point to making everything the same color.
2. When a binary file matches without -a, GNU grep does not color the
<file> in "Binary file <file> matches", but we do. The point of
colorization is to highlight important parts, and the filename is an
important part.
Like GNU grep, if --null is given, the null separators are not colored.
For config.txt, use a a sub-list to describe the slots, rather than
a single paragraph with parentheses, since this is much more readable.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
---
Documentation/config.txt | 20 ++++++++++++++--
builtin-grep.c | 31 +++++++++++++++++--------
grep.c | 55 +++++++++++++++++++++++++++++----------------
grep.h | 3 ++
4 files changed, 76 insertions(+), 33 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 791b065..154bc02 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -687,9 +687,23 @@ color.grep::
`never`), never. When set to `true` or `auto`, use color only
when the output is written to the terminal. Defaults to `false`.
-color.grep.match::
- Use customized color for matches. The value of this variable
- may be specified as in color.branch.<slot>.
+color.grep.<slot>::
+ Use customized color for grep colorization. `<slot>` specifies which
+ part of the line to use the specified color, and is one of
++
+--
+`filename`:::
+ filename prefix (when not using `-h`)
+`linenumber`:::
+ line number prefix (when using `-n`)
+`match`:::
+ matching text
+`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::
When set to `always`, always use colors for interactive prompts
diff --git a/builtin-grep.c b/builtin-grep.c
index dcc3d48..43b952b 100644
--- a/builtin-grep.c
+++ b/builtin-grep.c
@@ -289,6 +289,7 @@ static int wait_all(void)
static int grep_config(const char *var, const char *value, void *cb)
{
struct grep_opt *opt = cb;
+ char *color = NULL;
switch (userdiff_config(var, value)) {
case 0: break;
@@ -296,17 +297,24 @@ static int grep_config(const char *var, const char *value, void *cb)
default: return 0;
}
- if (!strcmp(var, "color.grep")) {
+ if (!strcmp(var, "color.grep"))
opt->color = git_config_colorbool(var, value, -1);
- return 0;
- }
- if (!strcmp(var, "color.grep.match")) {
- if (!value)
- return config_error_nonbool(var);
- color_parse(value, var, opt->color_match);
- return 0;
- }
- return git_color_default_config(var, value, cb);
+ else if (!strcmp(var, "color.grep.filename"))
+ color = opt->color_filename;
+ 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.separator"))
+ color = opt->color_sep;
+ else
+ return git_color_default_config(var, value, cb);
+ if (!value)
+ return config_error_nonbool(var);
+ color_parse(value, var, color);
+ if (!strcmp(color, GIT_COLOR_RESET))
+ color[0] = '\0';
+ return 0;
}
/*
@@ -871,7 +879,10 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
opt.regflags = REG_NEWLINE;
opt.max_depth = -1;
+ strcpy(opt.color_filename, "");
+ strcpy(opt.color_lineno, "");
strcpy(opt.color_match, GIT_COLOR_BOLD_RED);
+ strcpy(opt.color_sep, GIT_COLOR_CYAN);
opt.color = -1;
git_config(grep_config, &opt);
if (opt.color == -1)
diff --git a/grep.c b/grep.c
index a0864f1..132798d 100644
--- a/grep.c
+++ b/grep.c
@@ -506,35 +506,52 @@ static int next_match(struct grep_opt *opt, char *bol, char *eol,
return hit;
}
+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) {
+ sign = '\0';
+ opt->output(opt, &sign, 1);
+ } else
+ output_color(opt, &sign, 1, opt->color_sep);
+}
+
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];
- 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);
+ output_color(opt, "--\n", 3, opt->color_sep);
else
opt->show_hunk_mark = 1;
} else if (lno > opt->last_shown + 1)
- opt->output(opt, "--\n", 3);
+ output_color(opt, "--\n", 3, opt->color_sep);
}
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;
@@ -548,12 +565,9 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
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,
+ (int)(match.rm_eo - match.rm_so),
+ opt->color_match);
bol += match.rm_eo;
rest -= match.rm_eo;
eflags = REG_NOTBOL;
@@ -823,7 +837,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;
}
@@ -882,9 +897,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;
diff --git a/grep.h b/grep.h
index 9703087..36919ee 100644
--- a/grep.h
+++ b/grep.h
@@ -84,7 +84,10 @@ struct grep_opt {
int color;
int max_depth;
int funcname;
+ char color_filename[COLOR_MAXLEN];
+ char color_lineno[COLOR_MAXLEN];
char color_match[COLOR_MAXLEN];
+ char color_sep[COLOR_MAXLEN];
int regflags;
unsigned pre_context;
unsigned post_context;
--
1.7.0
next prev parent reply other threads:[~2010-02-27 4:54 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-27 4:57 [PATCH 0/5] color enhancements, particularly for grep Mark Lodato
2010-02-27 4:57 ` [PATCH 1/5] Allow explicit ANSI codes for colors Mark Lodato
2010-02-27 8:51 ` Jeff King
2010-02-27 18:24 ` Mark Lodato
2010-02-27 21:21 ` Junio C Hamano
2010-02-28 2:56 ` [PATCH] color: allow multiple attributes Junio C Hamano
2010-02-28 12:20 ` Jeff King
2010-02-28 18:16 ` Junio C Hamano
2010-02-28 18:33 ` Jeff King
2010-02-27 4:57 ` [PATCH 2/5] Add GIT_COLOR_BOLD_* and GIT_COLOR_BG_* Mark Lodato
2010-02-27 4:57 ` [PATCH 3/5] Remove reference to GREP_COLORS from documentation Mark Lodato
2010-02-27 4:57 ` Mark Lodato [this message]
2010-02-27 11:43 ` [PATCH 4/5] grep: Colorize filename, line number, and separator René Scharfe
2010-02-28 20:14 ` Mark Lodato
2010-02-28 22:26 ` Michael Witten
2010-03-02 1:49 ` Mark Lodato
2010-03-02 6:43 ` Michael Witten
2010-03-03 4:26 ` Mark Lodato
2010-03-03 4:49 ` Miles Bader
2010-02-27 11:53 ` René Scharfe
2010-02-27 17:08 ` Junio C Hamano
2010-02-28 20:15 ` Mark Lodato
2010-02-28 19:29 ` Junio C Hamano
2010-02-28 20:39 ` Mark Lodato
2010-02-27 4:57 ` [PATCH 5/5] grep: Colorize selected, context, and function lines Mark Lodato
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1267246670-19118-5-git-send-email-lodatom@gmail.com \
--to=lodatom@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).