git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/2] grep -P: allow optional argument specifying the pager (or editor)

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Mar 26, 2010, 10:49 UTC
Message-ID
<alpine.DEB.1.00.1003261149270.7596@pacific.mpi-cbg.de>
In-Reply-To
<alpine.DEB.1.00.1003261145500.7596@pacific.mpi-cbg.de>

Suppose you want to edit all files that contain a specific search term. Of course, you can do something totally trivial such as

	git grep -z -e <term> | xargs -0r vi +/<term>
but maybe you are happy that the same will be achieved by
	git grep -Ovi <term>
now.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 Documentation/git-grep.txt |    6 +++---
 builtin-grep.c             |   21 ++++++++++++---------
 2 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
index ab3bb77..1b7e32d 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.txt
@@ -15,7 +15,7 @@ SYNOPSIS
 	   [-E | --extended-regexp] [-G | --basic-regexp]
 	   [-F | --fixed-strings] [-n]
 	   [-l | --files-with-matches] [-L | --files-without-match]
-	   [-O | --open-files-in-pager]
+	   [(-O | --open-files-in-pager) [<pager>]]
 	   [-z | --null]
 	   [-c | --count] [--all-match] [-q | --quiet]
 	   [--max-depth <depth>]
@@ -102,8 +102,8 @@ OPTIONS
 	For better compatibility with 'git diff', --name-only is a
 	synonym for --files-with-matches.
 
--O::
---open-files-in-pager::
+-O [<pager>]::
+--open-files-in-pager [<pager>]::
 	Open the matching files in the pager (not the output of 'grep').
 	If the pager happens to be "less" or "vi", and the user
 	specified only one pattern, the first file is positioned at
diff --git a/builtin-grep.c b/builtin-grep.c
index 233c772..a23f0dc 100644
--- a/builtin-grep.c
+++ b/builtin-grep.c
@@ -753,7 +753,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 	int cached = 0;
 	int seen_dashdash = 0;
 	int external_grep_allowed__ignored;
-	int show_in_pager = 0;
+	const char *show_in_pager = NULL, *default_pager = "dummy";
 	struct grep_opt opt;
 	struct object_array list = { 0, 0, NULL };
 	const char **paths = NULL;
@@ -838,8 +838,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 		OPT_BOOLEAN(0, "all-match", &opt.all_match,
 			"show only matches from files that match all patterns"),
 		OPT_GROUP(""),
-		OPT_BOOLEAN('O', "open-files-in-pager", &show_in_pager,
-			"show matching files in the pager"),
+		{ OPTION_STRING, 'O', "open-files-in-pager", &show_in_pager,
+			"pager", "show matching files in the pager",
+			PARSE_OPT_OPTARG, NULL, (intptr_t)default_pager },
 		OPT_BOOLEAN(0, "ext-grep", &external_grep_allowed__ignored,
 			    "allow calling of grep(1) (ignored by this build)"),
 		{ OPTION_CALLBACK, 0, "help-all", &options, NULL, "show usage",
@@ -893,16 +894,18 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 	}
 
 	if (show_in_pager) {
-		const char *pager = getenv("GIT_PAGER");
-		if (!pager)
-			pager = getenv("PAGER");
-		if (!pager)
-			pager = "less";
+		if (show_in_pager == default_pager) {
+			show_in_pager = getenv("GIT_PAGER");
+			if (!show_in_pager)
+				show_in_pager = getenv("PAGER");
+			if (!show_in_pager)
+				show_in_pager = "less";
+		}
 		opt.name_only = 1;
 		opt.null_following_name = 1;
 		opt.output_priv = &path_list;
 		opt.output = append_path;
-		string_list_append(pager, &path_list);
+		string_list_append(show_in_pager, &path_list);
 		use_threads = 0;
 	}
 
-- 
1.6.4.313.g3d9e3
Previous: Junio C HamanoNext: Johannes Schindelin
Message 6 of 20 in “Teach 'git grep' about --open-files-in-pager=[<pager>]”
  1. 0/2 Teach 'git grep' about --open-files-in-pager=[<pager>]Johannes Schindelin, Mar 26, 2010
  2. 1/2 grep: Add the option '--open-files-in-pager'Johannes Schindelin, Mar 26, 2010
  3. Jonathan NiederMar 28, 2010
  4. Johannes SchindelinMar 29, 2010
  5. Junio C HamanoMar 29, 2010
  6. 2/2 grep -P: allow optional argument specifying the pager (or editor)Johannes Schindelin, Mar 26, 2010
  7. Johannes SchindelinMar 26, 2010
  8. Bert WesargMar 26, 2010
  9. Johannes SchindelinMar 26, 2010
  10. Bert WesargMar 26, 2010
  11. Jeff KingMar 26, 2010
  12. Johannes SchindelinMar 26, 2010
  13. Jeff KingMar 26, 2010
  14. Junio C HamanoMar 26, 2010
  15. Francis MoreauMar 26, 2010
  16. Junio C HamanoMar 27, 2010
  17. Francis MoreauMar 27, 2010
  18. Junio C HamanoMar 27, 2010
  19. Francis MoreauMar 27, 2010
  20. Jon SeymourMar 26, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.