Next: , Up: Emacsからのシェルコマンドの実行   [Contents][Index]


39.1 単一のシェルコマンド

M-! (shell-command)は、ミニバッファーを使って1行のテキストを読み取り、それをシェルコマンドとして、そのコマンドのためだけに作成されたサブシェルで実行します。そのコマンドの標準入力はnullデバイスです。シェルコマンドが出力を生成する場合、その出力はエコーエリア(出力が短い場合)、または別ウィンドウに表示される‘"*Shell Command Output*"’ (shell-command-buffer-name)という名前のEmacsバッファー(出力が長い場合)に表示されます。変数resize-mini-windowsmax-mini-window-heightは、出力がエコーエリアにたいして長過ぎるとEmacsが判断した場合に、ウィンドウのサイズ変更を制御します(ミニバッファーでの編集を参照)。エコーエリアに何が表示されるかは、以下で説明するshell-command-dont-erase-bufferをカスタマイズすることによって影響を受けるかもしれないことに注意してください。

たとえばfoo.gzという名前のファイルを解凍する1つの方法は、M-! gunzip foo.gz RETとタイプすることです。このシェルコマンドは通常、ファイルfooを作成して、端末出力を生成しません。

たとえばM-1 M-!のようにshell-commandに数引数を指定した場合、別のバッファーではなく、カレントバッファーに端末出力を挿入します。これはデフォルトではポイントを出力の前、出力の後にマークを配置します(しかし以下の非デフォルト値shell-command-dont-erase-bufferでこれを変更できます)。たとえばM-1 M-! gunzip < foo.gz RETは、カレントバッファーにファイルfoo.gzの解凍された内容を挿入します。

最後が‘&’でないシェルコマンドを指定した場合、コマンドは同期(synchronously)で実行され、Emacsを継続して使用するには、コマンドがexitするのを待たなければなりません。待つのを中止するには、C-gとタイプします。これはシェルコマンドを終了するために、シグナルSIGINTを送ります(これは通常、シェルでC-cとタイプしたときに生成されるのと同じシグナルです)。その後、Emacsはコマンドが実際に終了するまで待ちます。シェルコマンドが終了しない場合(そのコマンドがシグナルSIGINTを無視する場合)は、再度C-gとタイプします。これは そのコマンドにたいして、無視することが不可能なシグナルSIGKILLを送ります。

&’で終わるシェルコマンドは非同期(asynchronously)で実行され、それを実行した後でも、継続してEmacsを使用できます。シェルコマンドを非同期で実行する前に、M-& (async-shell-command)とタイプすることもできます。これは最後の‘&’が必要ない点を除き、最後に‘&’を指定してM-!を呼び出すことと同じです。非同期シェルコマンドからの出力は、デフォルトでは‘"*Async Shell Command*"’ (shell-command-buffer-name-async)という名前のバッファーに送られます。このバッファーがウィンドウに表示されているかに関わらず、Emacsは出力をこのバッファーに挿入します。

同時に複数の非同期シェルコマンドを実行した場合、出力バッファーが競合します。この場合どのようにするか — たとえば既存の出力バッファーをリネームしたり、新しいコマンドに異なるバッファーを使用する — を、オプションasync-shell-command-bufferで指定できます。他の可能なオプションについては、この変数のドキュメントを参照してください。

非同期シェルコマンドが出力を生成したときだけ出力バッファーが表示されるようにしたい場合は、async-shell-command-display-buffernilにセットしてください。

オプションasync-shell-command-widthは非同期シェルコマンドの出力に利用可能な表示列数を定義します。正の整数はコマンド出力にその列数を使用するようシェルに指示します。デフォルト値nilはシェルが提供する列数と同じ列数の使用を意味します。

上記コマンドにプロンプトにカレントディレクトリーを表示するようにさせるには変数shell-command-prompt-show-cwdを非nil値にカスタマイズしてください。

M-| (shell-command-on-region)はM-!と同様ですが、入力を与えないかわりに、リージョンの内容をシェルコマンドの標準入力として渡します。数引数を指定した場合、古いリージョンの内容を、シェルコマンドの出力で置き換えます。

たとえばM-|gpgプログラムを使用して、そのバッファーのキーが何かを見ることができます。そのバッファーがGnuPGキーを含む場合、C-x h M-| gpg RETとタイプして、バッファー全体の内容をgpgに送ることができます。これはキーのリストをshell-command-buffer-nameの値であるような名前のバッファーに出力します。

上記のコマンドは、変数shell-file-nameで指定されたシェルを使用します。この変数のデフォルト値は、Emacsが開始されたときの環境変数SHELLにより決定されます。相対ファイル名の場合、Emacsはexec-pathにリストされたディレクトリーを検索します(Emacsからのシェルコマンドの実行を参照してください)。

デフォルトディレクトリーがリモート(リモートファイルを参照)ならデフォルト値は/bin/shです。これは接続ローカルにshell-file-nameを宣言することにより変更可能です(接続ごとのローカル変数を参照)。

M-!またはM-|にたいするコーディングシステムを指定するには、あらかじめコマンドC-x RET cを使用します。プロセス間通信にたいするコーディングシステムを参照してください。

デフォルトでは、出力バッファーではエラー出力と標準出力が混ざって出力されます。しかし変数shell-command-default-error-bufferの値を文字列に変更すると、エラー出力はその名前のバッファーに出力されます。

デフォルトではカレントバッファーに出力される場合を除き、シェルコマンド間に出力バッファーは消去されます。オプションshell-command-dont-erase-bufferの値をeraseに変更すると出力バッファーは常に消去されます。それ以外の非nil値なら出力バッファーの消去は抑制されて、(出力バッファーがカレントバッファーでなければ)シェルコマンドの出力の挿入後にポイントを配置する位置を制御します:

beg-last-out

ポイントを最後のシェルコマンドの出力の先頭に配置します。

end-last-out

ポイントを最後のシェルコマンドの出力の最後(出力バッファー終端)に配置します。

save-point

シェルコマンドの出力の挿入前の位置にポイントをリストアします。

このオプションが非nilの場合には出力バッファーの一部だけがエコーエリアに表示されるので、表示される出力は最後のコマンド以外の出力がエコーエリアに表示されるかもしれないことに注意してください。

出力バッファーがカレントバッファーでない場合には、そのバッファーの終端にシェルコマンドの出力が追加されます。