Emacs の起動時に標準入力からバッファを読み取るにはどうすればよいですか?

Emacs の起動時に標準入力からバッファを読み取るにはどうすればよいですか?

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どおりの効果を持ち続けます。関数prin1princ、 はエコー領域ではなくprint に出力し、や エラーメッセージは に出力します。通常ミニバッファから読み取る関数は、代わりに から入力を受け取ります。stdoutmessagestderrstdin

そしてその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

関連情報