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


39.3 Shellモード

ShellバッファーのためのメジャーモードはShellモードです。このモードの特別なコマンドはC-cプレフィクスにバインドされており、最初にC-cをタイプしなければならない点を除けば、通常のシェルでの編集やジョブ制御文字と共通点があります。以下はShellモードのコマンドのリストです:

RET

サブシェルの入力にカレント行を送ります(comint-send-input)。行頭のシェルプロンプトは省略されます(Shellプロンプトを参照してください)。ポイントがバッファーの最後にある場合、これは通常の対話的なシェルにおいてコマンド行をサブミットするのに似ています。しかし、シェルバッファーの他の場所でも、RETを呼び出してカレント行を入力としてサブミットできます。

TAB

シェルバッファーのポイントの前のコマンド名、またはファイル名を補完します(completion-at-point)。これは通常のEmacs補完ルールを使用します(補完を参照してください)。ファイル名、環境変数名、シェルコマンドヒストリー、ヒストリー参照が補完候補になります(Shellヒストリーの参照を参照してください)。補完を制御するオプションについては、Shellモードのオプションを参照してください。

M-?

ポイントの前のファイル名にたいして、可能性のある補完リストを一時的に表示します(comint-dynamic-list-filename-completions)。

C-d

delete文字、またはEOF文字を送ります(comint-delchar-or-maybe-eof)。シェルバッファーの最後でこれをタイプすると、サブシェルにEOFが送られます。バッファーの他の場所でタイプすると、通常どおり文字を削除します。

C-c C-a

行の先頭に移動しますが、プロンプトがある場合はプロンプトの後に移動します(comint-bol-or-process-mark)。このコマンドを連続して繰り返すと、2回目はプロセスマーク(process mark)に戻ります。これはサブシェルにまだ送信されていない入力の開始位置のことです(通常これは同じ場所 — その行のプロンプトの最後 — ですが、C-c SPCの後では、プロセスマークは前の行にあるかもしれません)。

C-c SPC

複数行の入力を累積して、それらを合わせて送ります(comint-accumulate)。このコマンドはポイントの前に改行を挿入しますが、その前のテキストをサブシェルの入力として — 少なくともその時点では — 送りません。改行の前後の行は両方、(それらを分割する改行も含めて)RETをタイプしたとき一緒に送られます。

C-c C-u

まだ入力として送られていない、バッファーの最後のすべてのテキストをkillします(comint-kill-input)。ポイントがバッファーの最後にない場合、これはポイントの前のテキストだけをkillします。

C-c C-w

ポイントの前の単語をkillします(backward-kill-word)。

C-c C-c

シェルまたは(もしあれば)カレントのサブジョブに割り込み(interrupt)ます(comint-interrupt-subjob)。このコマンドはシェルバッファーの最後の、まだ送られていない任意のシェル入力もkillします。

C-c C-z

シェルまたは(もしあれば)カレントのサブジョブを停止(stop)します。(comint-stop-subjob)。このコマンドはシェルバッファーの最後の、まだ送られていない任意のシェル入力もkillします。

C-c C-\

シェルまたは(もしあれば)カレントのサブジョブに、シグナルQUITを送ります(comint-quit-subjob)。このコマンドはシェルバッファーの最後の、まだ送られていない任意のシェル入力もkillします。

C-c C-o

前のシェルコマンドからの出力の一群を削除します(comint-delete-output)。これはシェルコマンドが大量の出力を吐くときに便利です。プレフィクス引数を指定すると、このコマンドは後でどこかにyank (yankを参照)できるように削除したテキストをkill-ring (killリングを参照)に保存します。

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

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

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

シェルプロセスを継続します。これは間違ってシェルプロセスをサスペンドしてしまったときなどに便利です。22

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)

デフォルトでは、Shellモードは(たとえばテキストカラーの変更等に)一般的なANSIエスケープコードを使います。initファイルに以下を記述すれば、EmacsはオプションでOSC (Operating System Codes: オペレーティングシステムコード)のような拡張エスケープコードもいくつかサポートします:

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

これを有効にすれば、たとえばls --hyperlinkからの出力からShellモードバッファーにクリック可能ボタンが作成されるでしょう。

Shellモードは、サブプロセスと対話的に通信を行なう一般的な用途向けのComintモードから派生したモードです。上記のコマンド名からも判るとおり、Shellモードのほとんどの機能は、実際にはComintモードが由来です。Shellモードの特別な機能には、ディレクトリー追跡機能、およびいくつかのユーザーコマンドが含まれます。

Comintモードの変種を使う他のEmacs機能には、GUD (Emacs下でのデバッガーの実行を参照してください)や、M-x run-lisp (外部Lispの実行を参照してください)が含まれます。

サブプロセスとして選択した任意のプログラムを実行するために、Shellモードに特化しない未修正のComintモードを使用するには、M-x comint-runを使用することができます。プログラムに引数を渡すにはC-u M-x comint-runを使用します。


Footnotes

(22)

シェルプロセスをサスペンドするべきではありません。これはシェルのサブジョブのサスペンドとはまったく違います。サブジョブのサスペンドは通常行なわれますが、サブジョブを継続するためにはシェルを使用しなければなりません。このコマンドはそれを行ないません。


Next: Shellプロンプト, Previous: 対話的なサブシェル, Up: Emacsからのシェルコマンドの実行   [Contents][Index]