git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "René Scharfe" <rene.scharfe@lsrfire.ath.cx>
To: Marcus Karlsson <mk@acc.umu.se>
Cc: git@vger.kernel.org, gitster@pobox.com
Subject: Re: [PATCH/RFC] grep: optionally show only the match
Date: Mon, 10 Sep 2012 18:43:32 +0200	[thread overview]
Message-ID: <504E18B4.5050000@lsrfire.ath.cx> (raw)
In-Reply-To: <1347227905-2398-1-git-send-email-mk@acc.umu.se>

Am 09.09.2012 23:58, schrieb Marcus Karlsson:
> Make git-grep optionally omit the parts of the line before and after the
> match.
>
> Signed-off-by: Marcus Karlsson <mk@acc.umu.se>
> ---
>   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.
>
> +-o::
> +--only-matching::
> +	Show only the part of the matching line that matched the
> +	pattern.
> +
>   -p::
>   --show-function::
>   	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 *prefix)
>   			N_("print empty line between matches from different files")),
>   		OPT_BOOLEAN(0, "heading", &opt.heading,
>   			N_("show filename only once above matches from same file")),
> +		OPT_BOOLEAN('o', "only-matching", &opt.only_matching,
> +			N_("show only the matching part of a matched line")),
>   		OPT_GROUP(""),
>   		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 *eol,
>   			if (match.rm_so == match.rm_eo)
>   				break;
>
> -			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,
>   				     opt->color_match);
> @@ -837,7 +839,8 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
>   		}
>   		*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.

René

      reply	other threads:[~2012-09-10 16:43 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-09 21:58 [PATCH/RFC] grep: optionally show only the match Marcus Karlsson
2012-09-10 16:43 ` René Scharfe [this message]

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=504E18B4.5050000@lsrfire.ath.cx \
    --to=rene.scharfe@lsrfire.ath.cx \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=mk@acc.umu.se \
    /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).