mdk.fr/content/blog/emacs-standard-input-is-not...

38 lines
1.3 KiB
Markdown

Title: emacs: standard input is not a TTY
Did you ever tried something like :
:::bash
$ find -name '*.c' | xargs emacs
or
$ grep -rl snmp . | xargs emacs
and got the error "emacs: standard input is not a tty" ? That's normal,
as the stdin for emacs is here the pipe, not your tty, you need a
workaround to leave the normal stdin to your emacs. There are different
approches, the one I used for a long time was a command substitution :
:::bash
$ emacs $(find -name '*.c')
But other approches exists, redirecting /dev/tty to emacs' stdin :
:::bash
$ find -name '*.c' | xargs sh -c 'emacs "$@" < /dev/tty' emacs
And if you are searching for a specific pattern with grep, you should
want to jump directly to the right line using the '+line file' syntax of
emacs, and the shell substitution :
:::bash
$ emacs $(grep -rn snmp services/ | sed -r 's/([^:]*):([0-9]*):.*/+\2 \1/g')
It's good while having only one occurence of the pattern in each file,
but if many occurences exists, the file is oppened only once, with a
while you can open one emacs for each occurence of the searched pattern
and the /dev/tty redirection :
:::bash
$ grep -rn snmp services/ | sed -r 's/([^:]*):([0-9]*):.*/+\2 \1/g' | while read line file; do emacs $line $file < /dev/tty; done