次: , 前: Single Shell, 上: Shell


27.14.2 対話的な下位のシェル

サブシェルを対話的に実行し、その対話記録をEmacsバッファに残すには、 M-x shellを使います。 このコマンドは、`*shell*'という名前のバッファを作成(または再使用)し、 このバッファに入出力するサブシェルを実行します。 つまり、サブシェルの『端末出力』はバッファに挿入されポイントを進め、 サブシェルの『端末入力』はバッファから取られます。 サブシェルに入力を与えるには、バッファの末尾へ移動して 入力を打ち込み最後に<RET>を打ちます。

Emacsはサブシェルが何かするのを待つことはしません。 シェルが待っていようがシェルコマンドを実行していようが、 ウィンドウやバッファを切り替えて編集できます。 サブシェルからの出力は、 Emacsがそれを取り込む処理を実行できるまで待たされます。 取り込み処理は、Emacsがキーボード入力を待ったり、 時間待ちに入ったときに行われます。

複数のサブシェルを使うには、バッファ`*shell*'の名前をコマンド M-x rename-uniquelyで別のものに変更します。 そうしてから、再度M-x shellと打ち込んで、 新しいサブシェルを持つバッファ`*shell*'を新たに作ります。 このバッファの名前も同じように変えれば、さらに新しく作れます。 すべてのサブシェルは独立かつ並行に実行されます。

サブシェルとして実行するファイル名は、変数explicit-shell-file-name の値がnil以外ならば、この変数の値で指定します。 nilのときは、環境変数ESHELLの値が使われますが、 これが存在しない場合は環境変数SHELLの値が使われます。 指定されたファイル名が相対名の場合は、 exec-pathに指定されているディレクトリ群を探索します。 変数exec-pathは、 Emacs起動時の環境変数PATHをもとに初期設定されます。 個人のファイル.emacsでこれらの変数を自由に変更してかまいません。

シェルに対するコーディングシステムを指定するには、 M-x shellの直前にコマンドC-x <RET> cを使います。 または、シェルを開始したあとにシェルバッファでC-x <RET> pを 使っても指定できます。 See Specify Coding

shellnameをシェルのファイル名として、 ファイル~/.emacs_shellnameが存在すると、 Emacsはサブシェルを実行開始した直後に初期設定のために、 このファイルの内容をシェルへの入力として送り込みます。 たとえば、bashを使っているのならファイル~/.emacs_bashの内容が送られます。

Emacsは、シェルコマンド、cdpushdpopdが シェルへの入力として送られるのを監視し、 バッファ`*shell*'のデフォルトディレクトリと シェルのカレントディレクトリが一致するようにします。 これらのシェルコマンドは、送られる入力行の文字列を構文的に調べて識別します。 これらのシェルコマンドに別名を付けるのなら、 Emacsにもその別名について教えておくことができます。 たとえば、変数shell-pushd-regexpの値がシェルへの入力行の先頭に 一致する場合は、その行はpushdコマンドであるとみなされます。 `pushd'に別名を付けたら、この変数の値を変更します。 同様に、shell-popd-regexpshell-cd-regexpは、 `popd'と`cd'を識別するのに使われます。 これらのコマンドはシェルへの入力行の先頭部分にあるときだけ 正しく認識されます。

Emacsは、`cd'、`pushd'、`popd'のシェルコマンドだと 思われるものを処理中にエラーに遭遇すると、 フックshell-set-directory-err-hookを実行します (see Hooks)。

Emacsがサブシェルのカレントディレクトリを正しく追従できていない場合は、 コマンドM-x dirsを使ってシェルにカレントディレクトリを問い合わ せてください。 このコマンドは一般的なコマンドの構文を持つシェルでは動作します。 ですが、とても変わったシェルでは動かないかもしれません。

M-x dirtrackを使うと、 別のもっと積極的なやり方でカレントディレクトリの変更に 追従する(しない)ようにもできます。

Emacsは、サブシェルの環境変数EMACStを設定します。 シェルスクリプトでこの変数を検査すれば、 Emacsのサブシェルとして動いているかどうか判定できます。