
Vimを使えば簡単にできる
$ echo 123 | vim -
Emacsでも可能ですか?
$ echo 123 | emacs23
... Emacs starts with a Welcome message
$ echo 123 | emacs23 -
... Emacs starts with an empty *scratch* buffer and “Unknown option”
$ echo 123 | emacs23 --insert -
... “No such file or directory”, empty *scratch* buffer
Unix パイプからバッファを読み取るのは本当に不可能ですか?
編集: 解決策として、次のシェルラッパーを作成しましたemacspipe
:
#!/bin/sh
TMP=$(mktemp) && cat > $TMP && emacs23 $TMP ; rm $TMP
答え1
正解です。stdin からバッファを読み取ることはできません。
Emacsの情報ページでstdinについて言及されているのはこれそこにはこう書かれています。
バッチモードでは、Emacs は編集中のテキストを表示せず、 や などの標準端末割り込み文字は
C-z
通常C-c
どおりの効果を持ち続けます。関数prin1
、princ
、 はエコー領域ではなくstdout
message
stderr
stdin
そしてそのread
関数は から読み取ることができますstdin
が、バッチ モードのみです。
したがって、カスタム elisp を記述してもこの問題を回避することはできません。
答え2
使用できるプロセス置換:
$ emacs --insert <(echo 123)
答え3
ファイルにリダイレクトして、そのファイルを開くことができます。例:
echo 123 > temp; emacs temp
jweede は、一時ファイルを自動的に削除したい場合は、次のようにすればよいと述べています。
echo 123 > temp; emacs temp; rm temp
Emacsyでこれを行う方法はEmacsでシェルコマンドを実行する。
M-! echo 123 RET
これにより、コマンドの結果を含む *Shell Command Output* という名前のバッファーが作成されます。
答え4
そのシンプルなシェル関数を作成可能これは、stdin から読み取るように動作します (ただし、実際には一時ファイルに書き込んでからそれを読み取ります)。私が使用しているコードは次のとおりです。
# The emacs or emacsclient command to use
function _emacsfun
{
# Replace with `emacs` to not run as server/client
emacsclient -c -n $@
}
# An emacs 'alias' with the ability to read from stdin
function e
{
# If the argument is - then write stdin to a tempfile and open the
# tempfile.
if [[ $# -ge 1 ]] && [[ "$1" == - ]]; then
tempfile="$(mktemp emacs-stdin-$USER.XXXXXXX --tmpdir)"
cat - > "$tempfile"
_emacsfun --eval "(find-file \"$tempfile\")" \
--eval '(set-visited-file-name nil)' \
--eval '(rename-buffer "*stdin*" t))'
else
_emacsfun "$@"
fi
}
この関数をemacsのエイリアスとして使うだけです。例えば
echo "hello world" | e -
またはファイルから通常通り
e hello_world.txt
関数内でemacs
を置き換えても同様に機能します。emacsclient