対話的にサブシェルを実行するには、M-x shellとタイプします。これは*shell*という名前のバッファーを作成(または再使用)して、そのバッファーにたいして入出力を行なう、シェルのサブプロセスを実行します。つまりサブシェルからの端末出力はポイントの後に挿入されてポイントを進め、サブシェルにたいする端末入力はそのバッファーのテキストになります。サブシェルにたいして入力を与えるには、バッファーの最後に移動して入力をタイプし、RETで終了します。
デフォルトでは、サブシェルが対話的に呼び出された際、カレントウィンドウですでに*shell*バッファーを表示していない場合は、新たなウィンドウに*shell*バッファーが表示されます。この動作はdisplay-buffer-alist
(display-buffer
が機能する方法を参照)を通じてカスタマイズできます。
サブシェルがコマンドの実行を待つ間、ウィンドウまたはバッファーを切り替えてEmacsで他の編集を行なうことができます。Emacsはそれを処理するときがきたら(たとえばキーボード入力待ちになったとき)、サブシェルからの出力をShellバッファーに挿入します。
Shellバッファーでは、プロンプトはフェイスcomint-highlight-prompt
で表示され、サブミットされた入力行はフェイスcomint-highlight-input
で表示されます。これにより入力行とシェル出力を容易に区別することができます。テキストのフェイスを参照してください。
複数のサブシェルを作成するには、(C-u M-x shell)のように)プレフィクス引数を指定してM-x shellを呼び出します。その後、このコマンドはバッファー名を読み取り、そのバッファーでサブシェルを作成(または再使用)します。M-x rename-uniquelyを使用して*shell*バッファーをリネームしてから、M-x shellで新しい*shell*バッファーを作成することもできます。異なるバッファーのサブシェルは、並行して独立に実行されます。
Emacsはあなたがエンターしたコマンドを調べて‘cd’といったコマンドを探すことによってカレントディレクトリーの追跡を試みます。カレントディレクトリーを変更する方法は多数存在するために、これはエラーの起きやすい解決手段です。したがってEmacsはこの情報をより信頼性の高い流儀で伝達するようデザインされた特別なOSC (Operating System Commands: オペレーティングシステムコマンド)のエスケープシーケンスも探します。たとえば以下のコマンドによって、シェルがそれぞれのプロンプトに適切なエスケープシーケンスをプリントするようアレンジする必要があります:
printf "\e]7;file://%s%s\e\\" "$HOSTNAME" "$PWD"
M-x
shellによりシェルファイル名を指定するには、変数explicit-shell-file-name
をカスタマイズします。これがnil
(デフォルト)の場合、もし存在すればEmacsは環境変数ESHELL
を使用します。そうでない場合は通常、変数shell-file-name
を使用します(単一のシェルコマンドを参照してください)。しかしデフォルトディレクトリーがリモートの場合(リモートファイルを参照してください)、シェルファイル名の入力を求めます。リモートファイル名を正しくタイプする方法に関するヒントは、ミニバッファーでのファイル名を参照してください。
Emacsは新しいシェルにたいする入力として、もしそれが存在すればファイル~/.emacs_shellnameの内容を送ります。ここでshellnameは、そのシェルがロードされたファイルの名前です。たとえばbashを使う場合、送られるファイルは~/.emacs_bashになります。ファイルが見つからない場合、Emacsは~/.emacs.d/init_shellname.shの使用を試みます。
シェルにたいしてコーディングシステムを指定するには、M-x shellの直前にコマンドC-x RET cを使用します。C-x RET pとタイプすることにより、実行されているサブシェルにたいするコーディングシステムを変更することもできます。プロセス間通信にたいするコーディングシステムを参照してください。
サブシェルでは、Emacsは環境変数INSIDE_EMACS
に‘version,comint’をセットします。ここでversionは、Emacsのバージョン(たとえば‘28.1’)です。プログラムはこの変数をチェックして、Emacsの内部で実行されているかを判断することができます。