Am 09.09.2012 23:58, schrieb Marcus Karlsson:
Make git-grep optionally omit the parts of the line before and after the

Signed-off-by: Marcus Karlsson <>
  Documentation/git-grep.txt | 8 +++++++-
  builtin/grep.c             | 2 ++
  grep.c                     | 7 +++++--
  grep.h                     | 1 +
  4 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
index cfecf84..6ef22cb 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.txt
@@ -20,7 +20,8 @@ SYNOPSIS
           [-c | --count] [--all-match] [-q | --quiet]
           [--max-depth <depth>]
           [--color[=<when>] | --no-color]
-          [--break] [--heading] [-p | --show-function]
+          [--break] [--heading] [-o | --only-matching]
+          [-p | --show-function]
           [-A <post-context>] [-B <pre-context>] [-C <context>]
           [-W | --function-context]
           [-f <file>] [-e] <pattern>
@@ -183,6 +184,11 @@ OPTIONS
        Show the filename above the matches in that file instead of
        at the start of each shown line.

+       Show only the part of the matching line that matched the
+       pattern.
        Show the preceding line that contains the function name of
diff --git a/builtin/grep.c b/builtin/grep.c
index 09ca4c9..56aba7b 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -782,6 +782,8 @@ int cmd_grep(int argc, const char **argv, const char 
                        N_("print empty line between matches from different 
                OPT_BOOLEAN(0, "heading", &opt.heading,
                        N_("show filename only once above matches from same 
+               OPT_BOOLEAN('o', "only-matching", &opt.only_matching,
+                       N_("show only the matching part of a matched line")),
                OPT_CALLBACK('C', "context", &opt, N_("n"),
                        N_("show <n> context lines before and after matches"),
diff --git a/grep.c b/grep.c
index 04e3ec6..9fc888e 100644
--- a/grep.c
+++ b/grep.c
@@ -827,7 +827,9 @@ static void show_line(struct grep_opt *opt, char *bol, char 
                        if (match.rm_so == match.rm_eo)

-                       output_color(opt, bol, match.rm_so, line_color);
+                       if (opt->only_matching == 0)
+                               output_color(opt, bol, match.rm_so,
+                                            line_color);
                        output_color(opt, bol + match.rm_so,
                                     match.rm_eo - match.rm_so,
@@ -837,7 +839,8 @@ static void show_line(struct grep_opt *opt, char *bol, char 
                *eol = ch;
-       output_color(opt, bol, rest, line_color);
+       if (opt->only_matching == 0)
+               output_color(opt, bol, rest, line_color);
        opt->output(opt, "\n", 1);

The implementation keeps only the coloured parts. However, they are not necessarily the same as the matching parts. This is more complicated with git grep than with regular grep because the former has the additional options --and and --not. Consider this:

        $ git grep --not -e bla --or --not -e blub

Lines with only either "bla" or "blub" (or none of them) will be shown, lines with both not. Both "bla" and "blub" will be highlighted. The matching part is always the whole shown line.


To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to
More majordomo info at

Reply via email to