GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/emacs/Interactive-Shell.html ・ emacs-doc.conao3.com

40.2 インタラクティブ・サブシェル

サブシェルを対話的に実行するには、M-x shell と入力します。これにより *shell* という名前のバッファが作成(または再利用)され、そのバッファを入出力先とするシェルのサブプロセスが実行されます。つまり、サブシェルからのターミナル出力はすべてバッファに格納されてポインタが前進し、サブシェルへのターミナル入力はバッファ内のテキストから行われます。サブシェルに入力を与えるには、バッファの末尾に移動し、RET で区切って入力内容を入力してください。

デフォルトでは、サブシェルを対話的に起動すると、現在のウィンドウに既に *shell* バッファが表示されている場合を除き、*shell* バッファが新しいウィンドウに表示されます。この動作は display-buffer-alist でカスタマイズ可能です(display-buffer の仕組み を参照してください)。

サブシェルが待機中またはコマンドを実行している間、Emacsではウィンドウやバッファを切り替えたり、その他の編集作業を行ったりできます。Emacsは、処理する時間があるたびに(例えばキーボード入力を待機している間など)、サブシェルからの出力をシェルバッファに挿入します。

シェルバッファでは、プロンプトはフェイス comint-highlight-prompt で、送信された入力行はフェイス comint-highlight-input で表示されます。これにより、入力行をシェルの出力と区別しやすくなります。テキストフェイスを参照してください。

複数のサブシェルを作成するには、プレフィックス引数を指定して M-x shell を呼び出します(例:C-u 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"

次に、Emacsにエスケープコードを処理するように指示します:

(add-hook 'comint-output-filter-functions #'comint-osc-process-output)

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 を試します。

変数 comint-terminfo-terminal を値 ‘"dumb-emacs-ansi"’ に設定することで、多くのコマンドでカラー出力を有効にできます(シェルモードオプションを参照してください)。

シェルのコーディングシステムを指定するには、M-x shellの直前にC-x RET cコマンドを使用できます。また、シェルバッファにC-x RET pと入力することで、実行中のサブシェルのコーディングシステムを変更することもできます。プロセス間通信のコーディングシステムを参照してください。

Emacsは、サブシェル内の環境変数 INSIDE_EMACS に ‘version,comint’ を設定します。ここで version はEmacsのバージョンです(例:‘28.1’)。プログラムはこの変数を確認することで、自身がEmacsのサブシェル内で動作しているかどうかを判定できます。