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

40.3 シェルモード

Shellバッファの主要モードはShellモードです。その特殊コマンドの多くはC-cプレフィックスに割り当てられており、通常のシェルにある一般的な編集・ジョブ制御文字に似ていますが、最初にC-cと入力する必要がある点が異なります。以下にShellモードのコマンド一覧を示します。

RET

現在の行をサブシェル (comint-send-input) への入力として送信します。行頭にあるシェルプロンプトは省略されます(シェルプロンプトを参照)。ポイントがバッファの末尾にある場合、これは通常の対話型シェルでコマンドラインを送信するのと同様です。ただし、シェルバッファ内の別の場所で RET を呼び出して現在の行を入力として送信することも可能です。

TAB

シェルバッファ (completion-at-point) 内で、ポイントより前のコマンド名またはファイル名を補完します。これには通常の Emacs 補完ルール(Completion を参照)が適用され、補完候補にはファイル名、環境変数名、シェルのコマンド履歴、および履歴参照(Shell History References を参照)が含まれます。補完を制御するオプションについては、Shell Mode Options を参照してください。

M-?

カーソル位置より前のファイル名の補完候補一覧を一時的に表示します (comint-dynamic-list-filename-completions)。

C-d

文字を削除するか、EOF (comint-delchar-or-maybe-eof) を送信します。シェルバッファの末尾で入力すると、サブシェルに EOF が送信されます。バッファ内のそれ以外の位置で入力すると、通常通り文字が削除されます。

C-c C-a

行の先頭に移動しますが、プロンプトがある場合はその後ろに移動します(comint-bol-or-process-mark)。このコマンドを2回連続して実行すると、2回目はプロセスマーク(まだサブシェルに送信していない入力の先頭)に戻ります。(通常、そこは同じ場所――この行のプロンプトの末尾――ですが、C-c SPC の後ではプロセスマークが前の行にある場合があります。)

C-c SPC

複数行の入力を蓄積し、まとめて送信します (comint-accumulate)。このコマンドはポイントの前に改行を挿入しますが、直前のテキストをサブシェルへの入力として送信することはありません—少なくとも、現時点では。RET と入力すると、この改行の前の行と後の行の両方が(それらを区切る改行とともに)まとめて送信されます。

C-c C-u

バッファ末尾で入力として送信待ちとなっているすべてのテキストを削除します (comint-kill-input)。ポイントがバッファ末尾にない場合は、ポイントより前の部分のみが削除されます。

C-c C-w

ポイント (backward-kill-word) の直前の単語を削除する。

C-c C-c

シェルまたはその現在のサブジョブが存在する場合、それらを中断します (comint-interrupt-subjob)。また、このコマンドは、シェルバッファ内で保留中でまだ送信されていないシェル入力をすべて破棄します。

C-c C-z

シェル、または(もしあれば)その現在のサブジョブを停止します (comint-stop-subjob)。このコマンドはまた、シェルバッファ内で保留中で、まだ送信されていないシェル入力も破棄します。

C-c C-\

シェルまたはその現在のサブジョブ(もしあれば comint-quit-subjob)に終了シグナルを送信します。また、このコマンドはシェルバッファ内で保留中で、まだ送信されていないシェル入力もすべて破棄します。

C-c C-o

シェルコマンドの直近の出力バッチを削除します (comint-delete-output)。これは、シェルコマンドが邪魔になるほど大量の出力を出す場合に便利です。接頭辞引数を指定すると、このコマンドは削除したテキストを kill-ring に保存します(キルリング を参照)。これにより、後で別の場所でそれをヤンク(ヤンク を参照)することができます。

C-c C-s

シェルコマンドの最後の出力バッチをファイルに書き込みます (comint-write-output)。接頭辞引数を指定すると、代わりにファイルに追記されます。出力末尾のプロンプトは書き込まれません。

C-c C-r
C-M-l

スクロールして、直近の出力バッチの先頭をウィンドウ上部に表示し、カーソルもそこに移動します (comint-show-output)。

C-c C-e

スクロールして、バッファの最終行をウィンドウの最下部に表示します (comint-show-maximum-output)。

C-c C-f

1つのシェルコマンド分前進しますが、現在の行を越えません (shell-forward-command)。変数 shell-command-regexp は、コマンドの終了をどのように判定するかを指定します。

C-c C-b

シェルコマンド1つ分後方に移動するが、現在の行より前には戻らない (shell-backward-command)。

M-x dirs

シェルに作業ディレクトリを問い合わせ、シェルバッファのデフォルトディレクトリを更新します。ディレクトリ追跡を参照してください。

M-x comint-send-invisible RET text RET

text をエコーせずに読み込んだ後、シェルに入力として送信します。これは、シェルコマンドがパスワードを求めるプログラムを実行する場合に便利です。

なお、Emacsではデフォルトでパスワードは出力されません。どうしても出力させたい場合は、以下のLisp式を評価(Emacs Lisp式の評価を参照)してください:

(remove-hook 'comint-output-filter-functions
             'comint-watch-for-password-prompt)
M-x comint-continue-subjob

シェルプロセスを継続します。誤ってシェルプロセスをサスペンドしてしまった場合に便利です。29

M-x comint-strip-ctrl-m

現在のシェル出力グループからすべての Control-M 文字を削除します。このコマンドを利用する最も便利な方法は、サブシェルから出力があった際に自動的に実行されるようにすることです。そのためには、次の Lisp 式を評価してください:

(add-hook 'comint-output-filter-functions
          'comint-strip-ctrl-m)
M-x comint-truncate-buffer

このコマンドは、変数 comint-buffer-maximum-size で指定された最大行数までシェルバッファを切り詰めます。サブシェルから出力が得られるたびにこれを自動的に行う方法は以下の通りです。

(add-hook 'comint-output-filter-functions
          'comint-truncate-buffer)

デフォルトでは、シェルモードは一般的なANSIエスケープコード(例えばテキストの色を変更するものなど)を処理します。また、initファイルに以下を記述すれば、Emacsは一部の拡張エスケープコード(OSC(Operating System Codes)など)もオプションでサポートします:

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

これを有効にすると、例えば ls --hyperlink からの出力が、シェルモードバッファ内でクリック可能なボタンになります。

シェルモードは、対話型サブプロセスとの通信を行う汎用モードであるComintモードから派生したものです。上述のコマンド名からもわかるように、シェルモードの機能の大部分は実際にはComintモードに由来しています。シェルモードの特徴的な機能としては、ディレクトリ追跡機能や、いくつかのユーザーコマンドが挙げられます。

Comintモードの派生形を利用したその他のEmacs機能には、GUD(Emacsでのデバッガの実行を参照)やM-x run-lisp(外部Lispの実行を参照)があります。

M-x comint-run を使用すると、シェルモードの特殊機能を使わず、変更のない Comint モードを用いて、任意のプログラムをサブプロセスで実行できます。プログラムに引数を渡すには、C-u M-x comint-run を使用してください。


脚注

(29)

シェルプロセスをサスペンドすべきではありません。シェルのサブジョブをサスペンドするのは全く別の話であり、それは一般的な手法ですが、サブジョブを再開するにはシェルを使用する必要があります。このコマンドでは対応できません。