abort-recursive-edit
)。
keyboard-escape-quit
)。
undo
)。
実行を完了していないコマンドを取り消すには、2つの方法があります。 1つはC-gで中断すること、 もう1つはC-]やM-x top-levelで アボートすることです。 中断とは、打鍵途中のコマンドや動作中のコマンドを取り消すことをいいます。 アボートとは、再帰編集レベルから抜け出し、かつ、 その再帰編集レベルを起動したコマンドを取り消すことをいいます (see Recursive Edit)。
C-gでの中断は、打鍵途中のコマンドや 不要な数引数を打ってしまったときにとりやめるのに使います。 また、実行途中のコマンドを比較的安全な方法で止めますから、 長時間かかるコマンドをうっかり始めてしまったときにも使えます。 特に、キル操作を中断しても安全です。 テキストは、まだすべてバッファ内にあるか、 または、すべてキルリングに入っている (あるいは、その両方に入っている)からです。 なお、インクリメンタルサーチを中断する場合には、 文字列探索のところで説明してあるように、特別な動作を行います。 一般には、サーチから抜け出すにはC-gを2回連打する必要があります (see Incremental Search)。
MS-DOSでは、C-<BREAK>はC-gと同様に中断として働きます。 MS-DOSでは、コマンドの実行中にユーザーとのやりとりを行う状態にないときには、 C-gを検出できないからです。 これに対して、C-<BREAK>はつねに認識できます。 See MS-DOS Input。
C-gはつぎのように動作します。
C-gが打鍵されると変数quit-flag
にt
が設定されます。
Emacs Lispはこの変数を頻繁に調べ、値がnil
以外だと中断処理を行います。
C-gが実際にコマンドとして実行されるのは、
Emacsが入力待ち状態にあるときにC-gを打った場合だけです。
最初のC-gが認識されないうちに2つめのC-gを打って中断すると、 『緊急脱出』機能を発動したことになりシェルに戻ります。 See Emergency Escape。
中断できない場合もありえます。 Emacsがオペレーティングシステムに何かを頼んで待っているときには、 待ち状態を起こしたシステムコールを使ったEmacs側で特別な手当てをしない限り 中断できません。 Emacsでは、ユーザーが中断しそうなシステムコールには 手当てを施してありますが、手当てしていない場所を叩く可能性はあります。 よくあるのは、NFS経由の入出力を待っているときです。 Emacs側ではこれを中断する方法はわかっているのですが、 多くのNFSの実装では、NFSサーバーが固まったときにユーザープログラムが NFSの待ちを中断することを許していないのです。
C-]によるアボート(abort-recursive-edit
)は、
再帰編集レベルから脱出し、かつ、その再帰編集レベルを
起動したコマンドを取り消すのに使います。
C-gによる中断はこのような目的には使えませんし、
このようなことはできません。
というのは、C-gは、ある再帰編集レベルの中で
打ちかけたコマンドを取り消すのに使うからです。
どちらの操作も必要なものです。
たとえば、再帰編集中に数引数を入力しようとしてC-u 8と打鍵した場合、
C-gで数引数を取り消しても再帰編集に留まったままです。
コマンド<ESC> <ESC> <ESC>
(keyboard-escape-quit
)は、中断かアボートのいずれかを行います。
このキーを使うのは、多くのPCのソフトで<ESC>が
『抜け出す』の意味に使われているからです。
C-gと同様に、数引数を取り消したり、
選択したリージョンをクリアしたり、問い合わせ型置換操作から抜け出します。
C-]と同様に、ミニバッファや再帰編集から抜け出します。
また、C-x 1のように、フレームを複数ウィンドウに分割しているのを
やめることもできます。
しかしながら、実行中のコマンドを止めることはできません。
なぜなら、このコマンドは普通のコマンドとして実行されるので、
Emacsがコマンドを読み込む状態にならないとこのコマンドを認識しないからです。
コマンドM-x top-levelは、現在入っているすべての再帰編集レベルから 抜け出すのに『十分な』数のC-]と同等です。 C-]は一度に1レベルだけ抜け出すのに対し、 M-x top-levelはすべてのレベルを一気に抜け出します。 C-]もM-x top-levelも他のコマンドと同様の普通のコマンドですから、 C-gとは違って、Emacsがコマンドを受け付ける状態のときだけ動作します。 C-]は普通のキーであり、キーマップにそのバインディングがあるので そのように動作するのです。 See Recursive Edit。
C-x u(undo
)は、正確にいえばコマンドを
取り消すわけではありませんが、
動作を完了してしまったコマンドを取り消すものと考えることができます。
See Undo。