One (midly annoying) feature of mg is that it appends /dev/null to the grep invocation. I guess this was done so grep is never called with only one file argument and so it always displays the filename in its output.
However, this gets a bit annoying when one only types "grep -n -R foo" and yields no results because only /dev/null was consulted. My proposal is to add -H to the mix instead. This poses a problem: it gets too easy to "hang" mg by forgetting the path to the files: grep would read from stdin and since inherits the cooked mode ^D and ^C don't work. Diff below works around the problem in the easier way: redirecting stdin from /dev/null. (a follow-up patch could rework compile_mode and clean it up a bit, avoiding the cd'ing back and forth too, by just forking a child and redirect its stdout with a pipe.) (note that this issue is already present: M-x grep RET C-u "cat -" RET) ok? diff /home/op/w/mg.orig commit - b83db95072ea94d64c0bb6027c4b3478e3400e5c path + /home/op/w/mg.orig blob - 016256f64d06be49304999fa4665018e4f823d31 file + grep.c --- grep.c +++ grep.c @@ -69,14 +69,12 @@ grep(int f, int n) struct buffer *bp; struct mgwin *wp; - (void)strlcpy(cprompt, "grep -n ", sizeof(cprompt)); + (void)strlcpy(cprompt, "grep -Hn ", sizeof(cprompt)); if ((bufp = eread("Run grep: ", cprompt, NFILEN, EFDEF | EFNEW | EFCR)) == NULL) return (ABORT); else if (bufp[0] == '\0') return (FALSE); - if (strlcat(cprompt, " /dev/null", sizeof(cprompt)) >= sizeof(cprompt)) - return (FALSE); if ((bp = compile_mode("*grep*", cprompt)) == NULL) return (FALSE); @@ -189,7 +187,7 @@ compile_mode(const char *name, const char *command) buf = NULL; sz = 0; - n = snprintf(qcmd, sizeof(qcmd), "%s 2>&1", command); + n = snprintf(qcmd, sizeof(qcmd), "%s 2>&1 </dev/null", command); if (n < 0 || n >= sizeof(qcmd)) return (NULL);