2011-12-21 10 views
10

に出力をシェル、私は次のように入力することができるようにしたいです。パイプEmacsは例えば新しいバッファ

+3

私が提案している場合は、magitを試してみてください。それはあなたが望むものとまったく同じではないかもしれません。しかし、私はそれがあなたの必要性に合っているのを見ますhttps://github.com/magit/magit – kindahero

答えて

6

M-! - シェルバッファと同じcwd内でコマンドを実行し、その結果を*Shell Command Output*バッファに出力します。

結果が短い場合、そのバッファは生成されず、出力はエコー領域にコピーされます。しかし、バッファはまだ使用され利用可能なです。 Chのshell-command F RETは、「簡単な」出力を構成するものの詳細を持っています

出力が非resize-mini-windows 場合、変数max-mini-window-heightによって決定エコー領域 (に表示するのに十分短い場合-nil)、そこに表示されます。 それ以外の場合は、出力を含むバッファが表示されます。

+3

また、C-u M-!を使用することもできます。現在のバッファに出力を置きます。 – Daimrod

+1

@Daimrod:まさにOPがやっていないものです*したくないです。彼女はエスシェルの中にあり、コマンドの出力を新しいバッファに移動したいと考えています。 – Thomas

+0

これは素晴らしく、ありがとうございます。唯一欠けているのは、新しいバッファを正しいモードにすることです。例えば、 'git diff'の結果を新しいバッファに送ると、バッファをdiffモードにしたいと思います。 –

8

eshellを使用すると、出力をバッファにリダイレクトすることができます。

print foo > #<buffer bar> 

コンテンツ 'foo'を持つ新しいバッファbarを作成します。詳細については、Emacswiki(http://www.emacswiki.org/emacs/EshellRedirection)を参照してください。

+1

ありがとう。それはeshellのために働く。しかし、私は通常のシェル(すなわちM-xシェル)を使用しています。 –

+1

eshellがオプションではない場合、出力をemacsclientにパイプすることができます。これにはスクリプトやシェル関数が必要です。出発点としてhttp://www.emacswiki.org/emacs/EmacsClient#toc43を参照してください。 –

+0

これはTRAMPを使うときには本当に便利です。 "foo/ssh:user @ machine:/ some/remote/file>#" – Warbo

3

残念ながら、emacsclientは標準入力を読み取っていないため、何らかの種類のラッパーが必要です。ここで私の作品Bashシェルの機能があります:

tempbuffer() { 
    perl -MFile::Temp -MFile::Copy -e \ 
    'copy *STDIN, $file = File::Temp->new; system "emacsclient", $file'; 
} 
+0

ご意見ありがとうございます。申し訳ありませんが、私はちょっとばかげています。私はbashファイルにこの関数を入れて、コンソールから呼び出すことができます。しかし、私は実際に実行したいコマンドを渡す方法を理解していません(つまり、 'git diff')。 –

+0

元の投稿と同じように、つまり。 'git diff | tempbuffer 'と呼ばれる。 – Sean

+0

ああ、それを得た。どうもありがとう。 –

0

私は出発点としてのEmacsのwikiからの情報を使用してパッケージ(e-sink)を作りました。これはあなたが説明したように機能し、プロセスがすべてを表示するまで待つのではなく、出力を「尾引き」します。バッシュは、一時ファイルを削除する前に、バッファを終了させるために

git diff | (f=$(mktemp); cat > $f; emacsclient $f; rm -v $f) 

のemacsclientを待って:

0

私の個人的な好みは何かのためにあなたが任意のファイルを管理することなく、バッシュを入力することができます。

私はM-!シェルのコマンドを最初から開始していた場合には(シェルの答えに似ています)、これをEmacsにパイプしたいと決めました。