前章でEmacsの基本的な操作を説明した。一通りの操作ができるようになったと思う。
この章では、1章で説明しなかったEmacsの持つ基本的な概念と、それに関連する
コマンドを説明する。Emacsの設計思想に織り込まれた、これら概念を理解すれば、
何故Emacsがこのようなコマンド体系をとったのかも理解し易いだろう。
また、その過程で1章で簡単に述べただけだったコマンドを説明し直すことにする。
Emacsが大きな特徴としている、マルチファイル/マルチバッファ/
マルチウィンドウの概念が本章の軸となるだろう。
●画面構成
本節の説明は、素直に文献0303を参考にした。文章は筆者のオリジナルである。
Emacsの大きな特長のひとつに、ウィンドウ(window)とバッファ(buffer)の概念が
ある。これらを使用することによって、同時に複数のファイルを編集したり、
また、1つのファイルを複数のウィンドウに表示することができる。
さて、起動したEmacsの画面(screen)は再掲図0101のようになっている。
Emacsはこれをいくつかの領域に分割している。
以下に順に、この画面構成に関係する概念を解説する。
Emacsにおけるウィンドウおよびバッファの概念は図0201のようになっている。
図0201では、ファイルfile1がバッファbuffer1に読み込まれ、
その始めの部分がウィンドウwindow2に表示され、終りの部分がウィンドウwindow1に
表示されている。ファイルfile2は、バッファbuffer2に読み込まれているが、
どのウィンドウにも表示されていない。ファイルfile3は、バッファbuffer3に
読み込まれていて、その前半がウィンドウwindow3に表示されている。
また、バッファbuffer4は、どのファイルにも関係していない。中に何らかの
テキストを含むと考えられるが、どのウィンドウにもその中身は表示されていない。
○バッファ(buffer)
ディスク上のファイルは、まずバッファの中に読み込まれる。読み込まれた
ファイルは、バッファから削除されるまでバッファ内に存在し続ける。
通常バッファとファイルとは1対1に対応する。
ユーザが行う文字入力、削除等の編集は、全てこのバッファに対して行なわれる。
バッファ上での編集が終わった後に、バッファ上のデータをファイルに書き戻す。
こうして、ファイルの編集が行われる。ここでいうデータは、テキスト・データ
(text data; 文書データ)である
○ウィンドウ(window)
ウィンドウは、バッファ内のテキストを表示する「窓」である。起動直後のEmacsは
ただ1つのウィンドウを持っているが、必要に応じて分割して複数のウィンドウを
持つことも可能である。この時バッファ内の1つのテキストを同時に複数の
ウィンドウに表示することもできる。バッファとウィンドウは、1対多に対応する。
従って、1つのバッファを複数のウィンドウに表示している時に、片方のウィンドウで
テキストの編集を行うと、その編集結果は即座に他のウィンドウに反映される。
テキスト・ウィンドウ(text window)は、上記の説明にあるように、様々な
バッファの内容を表示できる。また、適当なコマンドを使用して複数に分割することも
できる。ウィンドウの分割/削除に関するコマンドは、後述する。
○エコー領域(echo erea)
エコー領域は、Emacsからのメッセージを表示するために使われる。
エコー(echo)というのは、タイプした文字がそこに反響(echo)して表示されるから、
そのように呼ばれる。C-xと入力して、暫く待ってみれば分かるが、
エコー領域にその通りに表示される。
Emacsは、1キーで完結するコマンドは決してエコーしない。また、
複数キーで実行されるコマンドの場合も、入力時に間を空けない限り
エコーしない。エコーは、コマンドのキー操作全体がエコーされるか、
全くエコーされないかのどちらかである。
コマンドが実行できない場合には、エラー・メッセージがこのエコー領域に
表示される。エラーの場合、ビープ音と共にメッセージがここに表示される。
エラーの場合には、先行入力(それ迄に入力され、Emacsがまだ処理していないキー)は
キャンセルされる。
Emacsはエラーではないメッセージをエコー領域に表示することもあるが、
この場合はビープ音を伴わない。勿論先行入力もキャンセルされない。
ある種のコマンドは、このエコー領域にのみ結果を表示する。
○ミニバッファ(minibuffer)
エコー領域は、或いは、ミニバッファ・ウィンドウ(minibuffer window)と呼ばれて、
コマンドやファイル名等コマンドに与える引数を入力するために使用される。
実のところ、ユーザの入力はバッファに対してのみ行うことが可能である。
そのため、ミニバッファという入力専用の特殊なバッファ(ファイルと関連しない)が
用意されている。エコー領域は、このミニバッファを表示するためのウィンドウ
としても利用されるのである。
ミニバッファからの入力要求がある場合には、':'で終わるプロンプト(prompt)が
このミニバッファ・ウィンドウに表示され、カーソルもそこに移動する。
入力が[CR]キーによって正常に完了するか、C-gによってキャンセルするかすると、
カーソルは、ミニバッファ・ウィンドウを抜ける。
○モード行(mode line)
モード行(mode line)は、通常反転表示されている。モード行は、
その直上のテキスト・ウィンドウについての情報を表示している。
モード行の情報については、図0202に説明した。
○現バッファ/現ウィンドウ
さて、Emacsのカーソルは画面上のいづれか一つのウィンドウに存在する。
キーをタイプした時に、文字が挿入されたり削除されたりするのは、
このカーソルが存在するウィンドウである。実際には、このウィンドウに
関連づけられているバッファの内容が変更されることになる。
このウィンドウを、現ウィンドウ(current window)、このバッファを
現バッファ(current buffer)ということもある。
一部のコマンドは、ミニバッファからの入力を必要とするので、
カーソルが一時的に現ウィンドウからミニバッファ・ウィンドウに移動する。
ミニバッファからの入力が終われば、カーソルは再び現ウィンドウに戻る。
ウィンドウ間のカーソル移動のためのコマンドに付いても後に触れる。
○継続行の表示
第4章で定義するが、Emacsでは「行」というものを、「改行迄の連続した文字列」
と定義している。従って、行の桁数は可変で任意である。一方、画面やプリンタ
用紙の1行の桁幅といったものは、固定幅である。
一般的には、「改行までの連続した文字列」である行を「論理行(logical line)」、
画面(Emacsの場合は、どちらかと言えばウィンドウ)の1行のことを
「物理行(physical line)」という。
論理行の桁数は任意であるのに対し、物理行の桁幅は固定であるため、
論理行幅が物理行幅に収まりきれないことがある。このような場合には、
表示に何らかの工夫を要する。
Emacsでは、2通りの方法が提供されている。
1. 1物理行に収まりきらなかった1論理行は、溢れた分を次の物理行に
継続することで、複数の物理行に分けて表示する。
2. 1物理行に収まりきらなかった1論理行は、溢れたところで、
論理行の残りの文字列の表示を単純に諦める(表示を打ち切る)。
通常のバッファでは、1.の設定がなされている。次の行に継続する場合には、
その行の最後の桁に'\'マークが表示される。NEmacsで漢字を使用する場合や
Muleでの漢字表示のように多桁で1文字を表す場合には、
最後の2桁に'\\'を表示することで、継続を表すこともある。
2.の場合、表示が切り捨てられたことを示すために、その行の最後の桁に'$'マークが
表示される。NEmacs, Muleのように多桁文字を使用する場合、
最後の2桁に'$$'を表示することで、切り捨て(truncate)を表すこともある。
表示が打ち切られた(truncate)論理行の残りの文字列は、この後で説明する
左スクロールコマンドを使用することで見ることができる。
1.の設定になっていても、左右へのスクロールを行った場合、
自動的に一時的に、スクロールされている間だけ2.に切り替わる。
第5章で説明する変数のカスタマイズによって、バッファ単位で1.か2.かを
選ぶことができる。具体的にはtruncate-linesという変数にnilを設定すると1.になり、
tに設定すると2.になる。
第8章に、truncate-partial-width-windowsというものも説明したので、
参照して欲しい。
●ポイント
今迄漠然と「カーソル」と読んでいたものの実態を解説しよう。
これは、Emacsでは厳密には「ポイント」と呼ばれる。
この節は順序からいってここに置くのが適当だから、ここに置いたのだが、
その解説文の理解は、マルチウィンドウの概念を必要とする。従って、
この章全体を読み終わった後に、再びこの節に戻って読み直すことで、
理解を確かなものとして頂きたい。
○ポイントとカーソル位置
現バッファを色々と切り替えると、各バッファが以前のカーソル位置を記憶している
ことに気づく。Emacsでは、このカーソル位置をポイント(point)と呼ぶ。
元々は、Emacsが一番初めに開発された言語TECOの'.'コマンドをこう呼んだらしい。
正確にはポイントは、バッファ毎に存在する編集の影響が及ぶ点である。
これを、バッファ・ポイント(buffer point)と言うのだが、
ポイントは文字と文字との間に存在する点である。
カーソルとの関係で説明すれば、カーソル位置の文字と、その1つ前の文字との間に
ポイントは存在する。
文字を入力すれば、それは「ポイントの直前(before point)」に
挿入される。この時文字は、ポイントの直前に挿入されるので、
ポイントは新しく挿入された文字の直後に位置することになる。
依然としてカーソルの直前がポイントとなる。これをまとめると、図0203になる。
この本では、「カーソル(cursor)」という言葉を「ポイント」の代わりに使用した。
従って、状況によっては読者の方で「カーソル」を「ポイント」に読み替える
必要があるかも知れない。
同様に、「カーソル直前」は、「ポイント直前(before point)」を表し、
「カーソル直後」は、「ポイント直後(after point)」を表している。
只殆どの場合、カーソルとポイントとを同一視して問題ない筈である。
様々なカーソル移動コマンドは、カーソルに追随してポイントを移動させる。
逆に言えば、ポイントを移動させるには、目的のバッファ内で
カーソルを移動させれば良いということである。
このようにして、バッファ毎に存在するポイントを、各々独立に動かすことが
できる。この本ではこれを、「バッファ・ポイント」と呼ぶ。
もっと細かいことを言えば、ポイントはウィンドウ毎にも存在できる。
これをウィンドウ・ポイント(window point)という。1つのバッファが
複数のウィンドウに表示されていると仮定しよう。この時、
各々のウィンドウは、各々同一のバッファの異なる部分を表示できる。
これらウィンドウ間をカーソル移動すれば、それぞれのウィンドウが
別々のポイントを持っていることが分かるだろう。然し、
これらは皆同じバッファを表示しているのである。
このような場合、他バッファからそのバッファにテキストを挿入すると、
意図したのと別の結果を引き起こす可能性がある。ポイントが一意に
定まらないためであろう(Emacs内部では、最後に使用したウィンドウ・ポイントが
バッファ・ポイントになるといったことによって、バッファ・ポイントが
一意になるように規則づけられている)。
(cf. 文献0503、25.8 Window Point)
結局、カーソル位置とポイントとの関係は、
現ポイントの直後にカーソルが位置する
と、定義できるだろう。ここでいう「現ポイント」は、「現ウィンドウのポイント」の
ことである。
○カーソル移動コマンド
ポイントはカーソルを移動することで移動できる。
カーソル移動コマンドは、第1章で紹介したが、ここでもう一度
説明する。また、簡単な一覧ならば附録のクイック・リファレンスに
まとめたので、そちらを参照のこと。
ARGは数値引数(cf. 第4章)である。特に記述がない場合のデフォルトは、
1と思って欲しい。文字、語、行の厳密な定義は、第4章を参照のこと。
文字単位:
C-f forward-char ARG文字前進する。
C-b backward-char ARG文字後退する。
goto-char ARGのポイント位置にジャンプ。
ARGを無指定なら、ミニバッファ入力。
注:
Emacsでは、文字とバイトとは一致している。NEmacsでは、日本語文字は
Emacsの内部表現で2バイトに相当する。C-fやC-bでは、日本語文字は
2バイトで1文字というように「文字」指向で勘定され、goto-charの場合には
厳密にバイト位置で勘定される。
Muleの場合には、文字種によってバッファ内部の表現形式が異なるため、
一概に1文字が何バイトということができない。C-fやC-bは、
NEmacsよりも更に文字指向となっている。goto-charは、バッファ内部表現での
バイト位置で勘定される。
「ポイント位置」については、次の項で解説する。
語単位:
M-f forward-word ARG語前進する。
M-b backward-word ARG語後退する。
行単位:
C-n next-line ARG行前進する。
C-p previous-line ARG行後退する。
C-a beginning-of-line 行頭にジャンプ。
C-e end-of-line 行末にジャンプ。
goto-line 1から数えて、ARG行にジャンプ。
ARGが無指定なら、
ミニバッファ入力。
C-n/C-pにおいては、デフォルトでは可能な限り現在の桁位置を保存しようとする。
つまり、C-nによって次の行にカーソルを移動しても、そこにテキストがある限り
カーソルは同じ桁位置を保持する。これは、次のように変更可能である。
・目標桁
カーソルを行移動したときに、カーソルが移動する目的先の桁位置を
「目標桁(goal-column)」という。C-n/C-pを行うと、カーソルの桁位置は
この目標桁に移動する。目標桁が設定されていなければ、
行移動の前後でカーソルの桁位置は可能な限り変化しないのが普通。
作表時等に便利な機能である。
また、誤って設定してしまうことも多いので、解除法を知っておくと良い。
C-x C-n set-goal-column 現在桁を目標桁に設定する。
ARGが指定すれば、目標桁の解除。
他に、第8章で解説する変数track-eolの設定によって、
常に行末にカーソルが行くようにできる。
その他のテキスト単位:
第4章及び第6章を参照のこと。
ウィンドウ単位:
本章「●マルチウィンドウ」を参照のこと。
バッファ単位:
本章「●マルチバッファ」を参照のこと。
○ポイント位置
Emacsでのポイントの絶対位置は、バイト単位で勘定される。
これをポイント位置(position)という。ポイント位置の範囲は、
バッファの冒頭、第1文字の直前を、ポイント位置1とし、バッファの末端、
最終文字の直後を、ポイント位置(バッファのバイト数+1)とする。
カーソルは、ポイントの直後の文字にあるため、
「ポイント位置の文字(character at position)」と言った場合には、
実際にはポイント直後の文字を指す。
○カーソル位置の情報
カーソル位置(現ポイント)が、バッファ全体のどこに位置するかという情報を
得ることができる。
C-x = what-cursor-position カーソル位置を表示する
what-line カーソルの行位置を表示する
what-page カーソル位置の
ページ番号/ページ内行番号
を表示する
これらコマンドは全て、結果をエコー領域に表示する。
図0204に、表示の読み方を示した。
○マークとマーク・リング
ポイント位置は、バッファ内の絶対的な位置表現であった。
その一方で、Emacsユーザは、マークを使用することで、
マーカーというテキスト中の文字列に相対的な位置表現を使うこともできる。
マーク(mark)というのは、マーカー(marker)の特殊なものである。
マーカーというのは、「バッファ中のテキストのある文字とある文字の
間のポイント」という形で決められた、バッファ内の位置である。
マーカーは、Emacs-Lisp(cf. 第5章)での概念である。
このように決められたため、バッファのテキストを編集しても、
マーカーは常に目的の文字間に位置するように再配置(relocate)される。
また、マーカーの両脇の文字が削除された場合には、マーカーは削除した文字列が
存在した位置に再設定される。
Emacsでは、マークというものを1つだけ設け、ここにマーカーを記憶させることが
できる。そうして、このマークを各種の編集操作に利用できる。
Emacsには、マークを設定するための各種コマンドが用意されている。
マークを設定した後、ポイントを移動すれば、マークとポイントで囲まれた
領域(region)ができる。これをリージョン(region)と呼ぶ。
第1章に述べた通りである。
殆どの複数文字を挿入(insert)するコマンドでは、文字列はポイント直前に
挿入される。この時、同時にマークが挿入された文字列の末尾に設定されている。
つまり、リージョンが挿入されたばかりのテキスト全体に設定されている。
マークは、同時には1つしか設定できない。然し、以前に設定したマーク位
置(マーカー)はマーク・リング(変数mark-ring)というところに保存されていて、
暫くの間は参照できる。マーク・リングは、バッファ毎に存在し、バッファの
消去と同時に消去される。この仕組みを利用して、以前マークした場所にカー
ソルをジャンプすることができる。
このためには、例のC-@(set-mark-command)に数値引数を与える。
C-u C-@
のように操作すれば良い。マーク・リングの最初にあるマーカーがマークに
移動し、マークのポイント位置がマーク・リング最後に移動する。
同時に、カーソルはマーク位置にジャンプする。この操作を
繰り返すことで、以前にマークした位置に次々ジャンプできる。
マークとマーク・リングの関係と、マーク・リングからのマーカーの移動の
様子を図0205に示す。
マーク・リングの大きさは、デフォルトでは16である。
変数mark-ring-maxを変更することで、この大きさを変更できる。
変数の概念については、第5章を参照のこと。
注:
カーソル位置を大きく変化させる幾つかのコマンドは、
コマンド本体の処理の前に、現カーソル位置をマークする。
このようなコマンドの例には、M-<(beginning-of-buffer)やC-s(isearch-forward)が
ある。マークが設定された場合、エコー領域に'Mark set'と表示されるので、
これを見て判断すればいい。
○マークの設定に関するコマンド
マークの設定に関するコマンドを、ここにまとめる。
ここにある、語、段落、ページの概念は、第4章で定義する。
S式、関数定義については、第6章で定義する。
C-@ set-mark-command カーソル位置にマークを設定する。
ARGが指定されれば、以前のマーク位置に
カーソル・ジャンプする。
M-@ mark-word 次の語尾にマークを設定する。
M-C-@ mark-sexp 次のS式末にマークを設定する。
M-h mark-paragraph 現段落をリージョンにする。
M-C-h mark-defun 現関数定義をリージョンにする。
C-x h mark-whole-buffer 現バッファ全体をリージョンにする。
C-x C-x exchange-point-and-mark カーソル位置とマーク位置との交換
上記コマンドで、「マークを設定」と書いたものは、カーソル移動を伴わない。
「リージョンにする」と書いたものは、マークをリージョン末に設定し、
カーソルをリージョン先頭に移動する。
C-x hについては、ナローイング(cf. 第4章)がかかっている場合には、
バッファ全体の代わりにナローイングされた領域全体がリージョンに設定される。
●マルチウィンドウ
画面は複数のウィンドウに分割できることを述べた。分割されたそれぞれの
ウィンドウは、独立に異なるバッファのテキストを表示できる。こういう
機能を一般的に「マルチウィンドウ(multiple windows)」という。
○ウィンドウ操作のコマンド群
分割された複数のウィンドウの操作を行うコマンド群を
以下に挙げる。ウィンドウの操作であって、バッファとは関係ない。
説明中ARGとあるのは、第4章で詳説する数値引数である。
特に断りのない限り、ARGのデフォルトは1である。
ウィンドウの分割/削除:
C-x 2 split-window-vertically カーソル位置で現ウィンドウを
上下に分割する。
C-x 5 split-window-horizontally
カーソル位置で現ウィンドウを
左右に分割する。
C-x 0 delete-window 現ウィンドウを削除する。
C-x 1 delete-other-windows 現ウィンドウ以外の全ての
テキスト・ウィンドウを
削除する。
delete-windows-on 指定したバッファを表示する
全ウィンドウを削除する。
ウィンドウを消去しても、そこに表示されていたバッファが消えてしまう訳
ではない。単にバッファ内のテキストを表示していたウィンドウが消去されただけ
である。
ウィンドウの拡大/縮小:
C-x ^ enlarge-window 現ウィンドウを上下方向に
ARG行拡大する。
shrink-window 現ウィンドウを上下方向に
ARG行縮小する。
C-x { shrink-window-horizontally
現ウィンドウを左右方向に
ARG桁縮小する。
C-x } enlarge-window-horizontally
現ウィンドウを左右方向に
ARG桁拡大する。
ウィンドウの縮小時に、ウィンドウが小さくなり過ぎると、
そのウィンドウは削除される(変数 window-min-height, window-min-width)。
拡大コマンドでARGが負の値の場合には、-ARG分縮小する。
縮小コマンドでARGが負の値の場合には、-ARG分拡大する。
ウィンドウ内/ウィンドウ間のカーソル移動:
C-l recenter 画面を一旦消去して書き直す。
カーソル行が現ウィンドウの
中央にくる。ARGがあれば、
カーソル行がARGウィンドウ行に
移動する。
M-r move-to-window-line 現ウィンドウの中央行に
移動する。ARGがあれば、
現ウィンドウ内の
指定ARGウィンドウ行に
カーソルを移動する。
C-x o other-window ARG番目の他ウィンドウに
カーソルを移動する。
「ウィンドウ行(window line)」という表現は、
非負の場合は、ウィンドウの上から0から数えた行数である。
負の場合には、ウィンドウの下から1から数えた行数である。
「他ウィンドウ(other window)」という表現がある。ウィンドウは、
画面の左上から、上から下、左から右の順に数える。右下の次は左上に戻る。
負の値ならば、この逆方向に数える。この時、現ウィンドウの次の順番にあるものを
こう呼ぶ。
スクロール:
スクロール(scroll)とは、ウィンドウ内のテキストを上下左右に動かすことを言う。
バッファのテキストの行数・桁数の方がウィンドウの行数・桁数よりも大きい場合、
ウィンドウにはバッファの一部しか表示されない。ウィンドウに
テキストの違う部分を表示するためには、ウィンドウ内のテキストを上下に
移動する必要がある。これをスクロールという。EmacsではC-nやC-p等で、
自動的にスクロールするが、以下のコマンドで明示的にスクロールすることもできる。
ここでのARGのデフォルトは、約現ウィンドウ1つ分の行/桁である。
C-v scroll-up 現ウィンドウをARG行
スクロールする。
M-v scroll-down 現ウィンドウをARG行
逆スクロールする。
M-C-v scroll-other-window 他ウィンドウをARG行
スクロールする。
「他ウィンドウ」である点を
除けばC-vと同じ。
C-x < scroll-left 現ウィンドウを左にARG桁
スクロールする。
C-x > scroll-right 現ウィンドウを右にARG桁
スクロールする。
明示的なスクロールについてのデフォルトは、約現ウィンドウ1つ分となっている。
スクロール後にも、スクロール前の状態が分かるように何行かを
重ねて(スクロール前の行も残して)表示されるようになっている。
このスクロール前後に重なり合う行数は、変数(cf. 第5章)
next-screen-context-linesの値によって決定する。この変数のデフォルト値は
2である。
(C-nやC-pの結果起こる)自動的なスクロールでは、カーソル行がウィンドウの
中央に来るようにスクロールするのがデフォルトである。ただし、
変数scroll-stepが0以外に設定されていれば、その行数分だけスクロールを行う。
明示的に行う左右方向のスクロールでのデフォルトは、約現ウィンドウ1つ分と
なっている。実際には、それより2桁少ない桁数分スクロールする。
左右方向のスクロールが自動的に起こることはない。
●マルチバッファ
「●画面構成」
で簡単に説明したが、Emacsでは全ての編集操作は
このバッファ(buffer)に対して行われる。従って、ディスク上のファイルを
編集する場合にはファイル中のテキスト全体を、
一旦このバッファに読み込む必要がある。
読み込まれたテキストは、バッファから削除されるまでバッファ内に存在し続ける。
通常バッファとファイルとは1対1に対応するので、感覚的には
バッファとファイルとを同一視して構わないだろう。
元々バッファというのは「緩衝(地帯)」とか、「ものを溜めておくところ」とかいう
意味がある。Emacsでもそのようにとらえられていることが分かるだろう。
本節では、Emacsで複数バッファ(multiple buffers)の概念とそれを扱うための
コマンドとを紹介する。
○特殊なバッファ
バッファを生成する一番単純な方法は、ファイルを読み込むことである。
この場合、バッファとファイルとは1対1に対応している。
その他にもバッファを生成する方法はある。それらのバッファの多くは、
ファイルと関連を持たない、特殊なものといえるだろう。
こういったバッファの殆どは、何らかのEmacsのコマンドの出力を蓄えるために
Emacsによって一時的に作成されるものが殆どである。
そういったバッファの例としては、
1. 補完機能を利用した際に、選択候補が表示される
'*Completions*'バッファ
2. 第3章で解説するヘルプ機能を利用した時に、ヘルプの
ドキュメントが格納される'*Help'バッファ
3. 第6章で解説する、コンパイル・コマンドの出力が格納される
'*compilation*'バッファ
等々が存在する。注意すれば分かるが、いづれも'*文字列*'というように
バッファ名が'*'でくくられている。
Emacs起動時に存在する最初のバッファである、'*scratch*'も
特殊なバッファの1つであり、ファイルと関係を持たない。
この'*scratch*'バッファは、文字通り「落書き」用として使用できる。
○現バッファ
「●画面構成」
でウィンドウを解説したときに、現ウィンドウというものと
現バッファというものを解説した。簡単に言えば、現在カーソルがある
ウィンドウに結び対応するバッファを「現バッファ(current buffer)」と呼ぶ。
考えればすぐに分かることだが、現バッファは同時には1つしかない。
ウィンドウ間をカーソル移動することで、1つのウィンドウを選択することになる。
この時自動的に、唯1つのバッファを選択したことになる。
編集コマンドの殆どは、この現バッファに作用する。別のバッファを
編集したい場合には、別のバッファを、現ウィンドウを切り替えることで
選択する必要がある。
或いは、次に述べるコマンドを使用して、現バッファを切り替えることもできる。
○現バッファを切り替えるコマンド
ウィンドウの選択によらずに、バッファを選択することができる。
C-x b switch-to-buffer 現ウィンドウを
指定したバッファに切り替える
C-x 4 b switch-to-buffer-other-window
他ウィンドウを
指定したバッファに切り替える
C-x bを実行すると、ミニバッファにバッファ名の入力を促してくる。
デフォルトは、ミニバッファに表示されているので、単に[CR]キーを
タイプすればデフォルトのバッファが選択される。通常デフォルトは、
画面上に存在しない、最後に選択されたバッファである。
ミニバッファには、存在するバッファ名を
入力することも可能である。この時、[SPACE]または[TAB]キーによる
バッファ名補完機能も利用できる。存在しないバッファ名を入力すれば、
その名前のバッファが新たに作成される。
このバッファにはファイルは対応していないので、
必要ならばC-x C-w等でファイル名を指定して、ファイルに書き出す。
C-x bは、現ウィンドウに対応するバッファを、指定したバッファに
対応させるように切り替える。この結果、指定したバッファがそれ迄
画面上に存在しなければ、新たに表示されるようになる。
C-x 4 bは、現バッファの代わりに他ウィンドウを使用する点を除けば、
C-x bと同じである。尤も、指定したバッファが既に画面上に存在すれば、
単にカーソルがそのウィンドウに移動するだけである。また、画面上に
テキスト・ウィンドウが1つしかない場合に、現在表示されていないバッファを
選択しようとすれば、まず画面分割された後に、そちらの新しいウィンドウに
指定したバッファが表示される。
後述する「バッファ・メニュー」機能を利用すれば、もっと簡単にバッファを
選択できる。
○バッファの削除
Emacsで様々なファイルを編集していると、作業が終わり不要になったバッファが
段々と増えてくる。不要になったバッファは、削除できる。
C-x k kill-buffer 指定したバッファを削除する。
デフォルトは現バッファ。
kill-some-buffers 全てのバッファ各々を
yes/noで削除するかしないかを
決定する。
C-x kは、ミニバッファで、削除すべきバッファ名の入力を要求する。
デフォルトは現バッファなのでそのまま[CR]すればよい。或いは、
削除したいバッファ名を入力する。バッファ名は補完可能である。
指定したバッファが、「修正されている」ならば、本当に削除するか否かを
yes/noで確認する。表示されているバッファが削除されれば、そのウィンドウには
代わりに別のバッファが表示されるようになる。このバッファには、
表示されていない最後に使用されたバッファが選ばれる。
kill-some-buffersは、存在する全てのバッファについて、削除するか否かを
yes/noで訊いてくる。つまり、不要なバッファをまとめて削除できる。
それ以外は、C-x kと同様である。
後述する「バッファ・メニュー」機能を利用すれば、もっと簡単に複数の
バッファを削除できる。
○バッファ修正の可否
バッファは「修正された(modified)」状態というのを覚えている。
バッファに編集を加えると、バッファ生成の時の
テキスト状態と、編集後のテキスト状態とが異なることになる。
この状態を、「修正された(modified)」という。
「修正された」状態は、モード行に表示されている。
再掲図0202
ファイルと関連するバッファならば、修正された状態では、
バッファのテキストとファイルのテキストとが異なることになる。
この状態を解消するには、バッファをファイルに書き戻してやれば良い。
そうすれば、修正された状態は解消(クリア)される。
バッファ/ファイル間でテキストをやり取りするためのコマンドは、後述する。
こういったバッファに対する修正の可否等を操作するコマンドがある。
C-x C-q toggle-read-only バッファの修正可否を切り替える
M-~ not-modified バッファの修正された状態を
クリアする
C-x C-qによって、修正を禁じられたバッファのことを、
「読み出し専用(read only)」なバッファということもある。
M-~では、バッファのテキストをファイルに書き戻すことなく、
「修正された状態」をクリアする。勿論、この時点ではバッファとファイルの
テキスト内容は異なったままである。
○その他のバッファ関係のコマンド
ファイルと関連するバッファの名前は、ファイル名(パス名最後のリンク名)が
使われる。その名前のバッファが既に存在する場合には、
ファイル名<数字>
という形で、順次数字を使用して'file<2>', 'file<3>'のように
異なる名前が付けられていく。
バッファ名は変更できる。
rename-buffer 現バッファの名前を変更する
Emacs中では、バッファはその名前でユニークに決定できる。
○バッファ・メニュー
現在どのようなバッファがEmacs上に存在するか、その一覧を出力できる。
C-x C-b list-buffers 現存する全バッファのリストを
表示する。
buffer-menu 現存する全バッファのリストを
表示し、カーソルを
そこに移動する。
両コマンド共、'*Buffer List*'という名前の新たなバッファを生成し
(既にあれば、再利用する)、そこに図0206の形式で現存する全バッファのリストを
表示する。画面上に存在するテキスト・ウィンドウが1つの場合には、
自動的にウィンドウ分割が行われ、'*Buffer List*'が表示される。
元々ウィンドウが複数あった場合は、「他ウィンドウ」に表示するだけである。
C-x C-bは、カーソル移動を伴わない。
buffer-menuはそのバッファにカーソルを移動する。
'*Buffer List*'バッファは、'Buffer Menu'モードという特別なモードに
設定されている。「モード(mode)」については、第4章で詳しく述べるが、
ここでは'Buffer Menu'モードを「一般の編集が禁じられて、キーの動作も
特殊化してある」ととらえて欲しい。
図0206に例を示したが、バッファ・メニューでは、1行が1つのバッファを表す。
各行は、複数の欄に分割され、そのバッファの属性が表示されている。
各欄の読み方を、左から順に解説する。
一番左の桁は、どこかの行に'.'が表示されている。これは'*Buffer List*'が
作成された時点の現バッファを表す。
次のM桁は、'*'があれば、そのバッファが修正されている(modified)ことを表す。
次のR桁は、'%'があれば、そのバッファが読み出し専用(read only)であることを
表す。
次のBuffer欄は、バッファ名が表示される。
次のSize欄は、そのバッファのバイト・サイズが表示される。
次のMode欄は、そのバッファのメジャー・モード名を表す。
次のFile欄は、そのバッファに対応するファイルのパス名を表示する。
ファイルと関連していないバッファの場合、ここは空欄になる。
バッファ・メニューでのコマンド:
バッファ・メニューは、単純なキー操作によって、バッファに対する様々な
操作を行うことができる。1行が1バッファに対応するので、各行に対して
適当なキー操作を行なうだけでよい。こういったコマンドを、図0207にまとめた。
図0207を見て貰えば分かるが、すぐに実行されるコマンドと、
将来のために「印(mark)」をつけるだけのコマンドとが存在する。
バッファ・メニューは、このように便利であるにも関わらず、
何故かデフォルトではbuffer-menuコマンドはキーに割り当てられていない。
筆者は、第5章に説明する通り、このコマンドをキーに割当て、
簡単に使えるようにした上で、常用している。
デフォルトのままなら、
C-x C-b C-x o
といった操作で使用することになるのだろう。
○バッファ間テキスト操作
バッファからバッファにテキストを移動するためのコマンドがある。
普通なら、killしてyankすればいいので、これらコマンドを筆者が使用したことは
殆どないが、一応紹介しておく。
C-x a append-to-buffer 指定バッファのポイント直前に
リージョンを挿入する。
prepend-to-buffer 指定バッファのポイント直後に
リージョンを挿入する。
copy-to-buffer リージョンの内容で、
指定バッファの内容を置換する。
insert-buffer 指定したバッファの内容を
現ポイント直前に挿入する。
C-x aでは、目的のバッファのポイント直前にリージョンのテキストを挿入する。
従って、これを連続すると、目的のバッファには挿入したテキストが、
テキスト1、テキスト2、……
と、正順に並ぶ。これは通常のテキスト挿入コマンドである。
prepend-to-bufferでは、ポイント直後に挿入するため、連続実行すれば
……、テキスト2、テキスト1
と、逆順に並ぶだろう。これは特殊なテキスト挿入コマンドである。
●バッファとファイルとの関連
バッファの最も単純な生成方法は、ファイルを読み込むことである。
然し、それ以外にもバッファをファイルに関連づけるコマンドは存在する。
ここでは、ファイルとの関連において、バッファのテキストを操作する
コマンドを紹介する。
○ファイルとバッファとを関連づけるコマンド
ファイルの読み込みによるもの:
C-x C-f find-file 指定ファイルを
対応するバッファに読み込む。
C-x C-r find-file-read-only 指定ファイルを
対応するバッファに読み込み、
バッファを読み出し専用にする。
C-x C-v find-alternate-file 現バッファを削除した後、
find-fileと同じ動作をする。
view-file 指定ファイルを
対応バッファに読み込み、
Viewモードに設定する。
find-fileが最も基本的なコマンドである。指定ファイルが存在しなければ、
そのファイルに対応する中身が空のバッファを作成する。指定ファイルの
属性(mode)に書き込み権がなければ、バッファは自動的に読み出し専用になる。
既にバッファに読み込まれているファイルについては、新たにファイルを
読み込まずに、単に対応するバッファを選択するだけである。
NEmacsやMuleの場合、ファイルの中身をバッファに読み込む際に、
文字の表現形式を変更する。通常適切な自動変換をするので、気にする必要はない。
NEmacsの場合、find-fileに数値引数を渡すことで、漢字コード変換を抑止できる。
Muleで、数値引数をfind-fileに渡すと、どの種類の文字コード変換を行うかを
指定できる。これについては、第8章及び附録「NEmacs 3.3.2/Muleにおける、
日本語文字コードの扱い」を参照のこと。
C-x C-rは、C-x C-f C-x C-q等と同じ。
C-x C-vは、C-x k [CR] C-x C-fと同じなので、筆者は使用したことがない。
view-fileは、指定ファイルを読み込んで、「Viewモード」(cf. 第4章)という
特別なキー操作が利用できるようにしたもの。[SPACE], [DEL]で
上下スクロール可能なので、単純にファイルを眺めたい時に便利な機能である。
筆者は、時々使用する。
ファイルの保存によるもの:
C-x C-s save-buffer 現バッファを対応するファイルに
保存する。
C-x s save-some-buffers ファイルに対応する全バッファを
保存する。
C-x C-w write-file 現バッファを指定ファイルに
保存し、現バッファをその
ファイルに対応づける。
C-x C-sは、現バッファを対応するファイルに保存する。これは、元々の
バッファ⇔ファイル対応関係を利用するだけであって、新しく対応を
確立するものではない。
ファイルに対応していないバッファに対して、本コマンドを実行した場合、
C-x C-wと同じ動作になる。
このコマンドに数値引数を与えると、
「保存の際のバックアップを制御する」
という意味になる。詳しくは、本章で後述する。
C-x sは、存在するファイルに対応するバッファのうち、
「修正された」状態にあるもの全てを対応するファイルに保存する。
通常ファイル1つ1つについて、保存するかしないかを確認してくる。
数値引数を渡せば、確認無しで保存する。
これも、C-x C-s同様に、元々のバッファ⇔ファイル対応関係を
利用するだけであって、新しく対応を確立するものではない。
C-x C-wは、現バッファを指定ファイルに書き出す。この結果、それ迄の
バッファ⇔ファイル対応関係は破棄され、新たな対応関係が確立する。
ファイルの読み出し/保存によらないもの:
set-visited-file-name 現バッファを、指定ファイルに
対応づける。
このコマンドによって、現バッファのバッファ⇔ファイル対応関係を
設定し直すことができる。対応関係を変更するだけなので、現バッファの内容が
ファイルに保存されるわけではない。後に、C-x C-s等によって保存する必要がある。
○ファイルとバッファ間のテキスト転送関連コマンド
これらコマンドは、バッファとファイルとの間でテキスト転送を行うが、
バッファ⇔ファイル対応関係には、全く影響を及ぼさない。
ファイル→バッファ:
C-x i insert-file 現ポイント直後に、
指定ファイルの内容を挿入する。
バッファ→ファイル:
write-region リージョンを指定ファイルに
保存する。
append-to-file リージョンを指定ファイル末に
追加する。
●ファイル操作のコマンド
Emacsでは、バッファを介さずに、単にファイルを操作することもできる。
特に、ディレクトリ・エディタ(Dired; Directory Editor)は、強力である。
一部のエディタで、「ファイラー・モード」等と呼ばれているものが、
これに相当すると思う。
○ファイル操作のコマンド
滅多に使用することがないと思われる、ファイル操作のコマンドである。
一応紹介するが、これらコマンドでできることは、Diredで可能だし、
第7章で紹介する、シェル・コマンドに頼った方が、簡明で確かだろう。
各コマンドの説明の最後の欄に書いたのは、対応するUnixコマンドである。
delete-file 指定ファイル削除。 rm
copy-file 指定ファイルのコピー cp
rename-file 指定ファイル名の変更。 mv
add-name-to-file 指定ファイルに別名を追加する。 ln
make-symbolic-links 指定ファイルのシンボリック・リンク ln -s
○ディレクトリ・エディタ(dired)
ディレクトリ・エディタは、ディレクトリ内のファイルを1行1ファイルで
一覧表示し、各ファイルに対する様々な操作を簡単なキー操作で行えるようにした
機能である。使用感は、バッファ・メニューに類似したもので、大変に操作性がよい。
ディレクトリ・エディタは、find-file関係のコマンドにディレクトリ名を
指定すれば起動する。通常は、以下のどちらかで起動する。
C-x C-f find-file ファイル名にディレクトリ名を
指定すると、ディレクトリ・
エディタが起動する。
C-x d dired 指定ディレクトリで、
ディレクトリ・エディタが
起動する。
C-x dの方は、'*'や'?'といった、所謂ファイル名タイプの
ワイルド・カード(wild card)が使用できる。
'?'は、任意の1文字に一致し、'*'任意文字列に一致する。
一方、C-x C-fの方はワイルド・カードの使用は不可である。
もし、'*'や'?'といったメタキャラクタをファイル名に使用すると、
正にその文字をファイル名の一部とするファイルが作られてしまう。
図0212 ディレクトリ・エディタ実行例
図0208 ディレクトリ・エディタで使用するコマンド
diredモードは、Emacs 19で大きく機能拡張されるらしい。
●テキスト回復機能
Emacsでは、1度タイプしたテキストは、可能な限り失わずに済むように
工夫されている。間違えて削除したテキストを元に戻すために、
次のような機能を備えている。
undo 実行したコマンドを取り消す
kill-ring killコマンド群で削除した文字列の保存
auto-save 修正されたバッファを、自動的にファイルに退避(save)する
backup 書き戻しの際、以前の版のファイルを削除せずに残して置く
undoについては、第1章で述べた。
それ以外については、順に解説する。
○kill-ring
第1章では、kill-ringというものがあることだけ触れた。
kill-ringには、killコマンド群で削除した文字列がLIFO(Last In First Out;
後入れ先出し)形式で格納されている。図0209
C-yを実行すると、最も最近killしたテキストが取り出される(yank)。
これが普通の使い方だが、kill-ringにはそれ以前にkillされたテキストも
保存されているので、それらを取り出すことも可能である。
2つの方法がある。
1. C-yに数値引数を渡して、何回前にkillしたテキストであるかを指定する。
2. M-yというコマンドを、C-yに続いて行い、目的のテキストが
yankされるまで、M-yを繰り返す。
1.よりは、2.を使うことが多いだろう。
C-yには、特殊な使い方があって、厳密にC-uだけを指定した場合は、
テキストをyankして、カーソルをyankしたテキストの始めに置き、
マークを終わりに置く。つまり、yankしたテキスト全体に
リージョンが設定されている
という、動作をする。これ以外の使い方では、カーソルは
リージョンの最後に移動する。
この動作と区別するために、1.の使い方をしたい場合には、必ず'C-u 数値'とか、
'M-数字'という使い方をするのがいいだろう。
2.の使い方をする場合。
次のコマンドを利用する。
M-y yank-pop C-y或いはM-yの直後でのみ有効。
killされたテキストを、順次取り出す。
数回killコマンドを実行した状態で、
C-y M-y M-y
と連続操作してみよう。yankされたテキストが、次々と以前にkillしたものに
置き代わっていくのが見られる筈だ。
M-yの数値引数が非負ならば、
「今yankしたテキストよりもn回前にkillしたテキスト」
の意味で、負ならば、
「今yankしたテキストよりも-n回新しいkillテキスト」
の意味になる。
図0209のkill-ring-yank-pointerから、±nの位置にあるテキストを取り出すという
ことである。
このようにEmacsでは、kill-ringの大きさ分だけkillしたテキストを
保持し続ける。誤ってkillして、失われてしまったテキストも、
このkill-ringに残っている限り取り戻すことができる。
kill-ringに保持されるべきテキストの個数は、変数kill-ring-maxで決定する。
○オート・セーブ機能
Emacsには、オート・セーブ(auto save)の概念がある。
これは、ファイルに対応するバッファの内容を時折オート・セーブ・ファイルという
ファイルに自動的に退避(save)する機能である。この機能によって、
Emacsが不慮の事故により強制終了/異常終了しても、再びEmacsを起動することで、
それまでの変更内容をオート・セーブ・ファイルから取り戻すことが可能である。
オート・セーブの時期は、キーの打数によって決められる。
入力されたキーが一定数に達する度に、オート・セーブが行われる。
この間隔は、変数auto-save-intervalによって設定される。
筆者はこの値を極最近になって、変更した。普通は変更無用だろう。
もう一つの場合は、Emacs自体が異常終了する場合である。
この時Emacsは、オート・セーブしようと努力する。
オート・セーブをすると決まれば、Emacsは全バッファを検査し、
適当なものだけをセーブする。
1. オート・セーブ onになっているバッファである。
2. 前回のセーブ(通常の書きだし、或いはオート・セーブ)以降、
変更が加えられたバッファである。
この両方の条件に合うバッファだけが、対象となる。
オート・セーブ処理が始まると、エコー領域にメッセージが表示される。
終了すれば、その旨の表示になる。図0210
オート・セーブ中は、他の処理は行われないので、一瞬Emacsが停止したかのような
錯覚を受けることもある。こういう事態を避けるために、不要なバッファは
明示的にセーブし、削除した方がいいだろう。
○オート・セーブ・ファイル名
通常オート・セーブ・ファイルは、バッファに対応するファイルの
ファイル名(ディレクトリ・パスを除いた残り)の前後に'#'を付加したものが
使用される。つまり、
/Amber/castle/Random/.emacs
というファイルを編集するバッファのオート・セーブ・ファイルは、
/Amber/castle/Random/#.emacs#
になる。
普通に使用している、ファイルに対応するバッファの場合、
オート・セーブがonになっているので、先のような名前のオート・セーブ・ファイルが
作られる。バッファをファイルに保存すれば、このオート・セーブ・ファイルは
不要になるため、削除される。
幾つかの特殊なバッファ、ファイルと関係づけられていないバッファでは、
オート・セーブは殆どoffになっている。
onになっている場合、オート・セーブ・ファイル名は、バッファ名の前後に
'#'を付けたものになる。ディレクトリは、そのバッファの
現ディレクトリ(cf. 第7章)になるだろう。
使用することは余り無いと思うが、オート・セーブをon/offするのが
次のコマンドである。
auto-save-mode 現バッファのオート・セーブのon/offをトグルする。
どちらに切り替わったかは、エコー領域に表示される。
正の数値引数を与えると、必ずonにする。
それ以外では、offにする。
○オート・セーブ・ファイルからの復旧
何らかの事故によって失われたテキストを、オート・セーブ・ファイルから
復旧したい場合は、次の手順による。
M-x recover-file [CR]
目的ファイル名 [CR]
目的ファイルのディレクトリ名を使用してもいい。
これによって、ミニバッファから復旧するファイルを訊いてくる。
通常、そのままyesと答えればいいだろう。
このコマンドによる復旧が適切でない場合には、このコマンド自体がエラーとなる。
図0211は、エラー・メッセージの例である。
復旧したテキストが無事であることを確認したら、通常の保存を行えば良い。
このコマンドによって、テキストを復旧した場合、以後そのバッファでは
オート・セーブはoffになる。新たなオート・セーブによって、
元のテキストを破壊しないためである。きちんと通常の保存を行った後に、
M-x auto-save-mode [CR]
によって、そのバッファのオート・セーブをonに戻せばいいだろう。
オート・セーブ関係のカスタマイズ(cf. 第5章)のための変数は、
色々ある。筆者は、一度もいじったことがないが。ここでは、
煩瑣になるため詳細を省略したが、気になる方は、
Info: Emacs → Auto Save
を、参照して欲しい。このInfo表記の意味は、第3章を参照のこと。
○バックアップ・ファイル
Emacsで、ファイルを読み込み、バッファ上で修正し、再びファイルに書き戻す。
当然この時、ファイルの中身が書き変わってしまう。この修正が、誤りない
ものならば、これで全く問題がないが、人間という生き物は誤りを犯す。
バッファ上で編集を行う際に、消去すべきでない文字列を消去してしまうとか、
何らかの誤りを犯す可能性が常にある。
もし、バッファをファイルに書き戻すときに、以前のファイルの内容を
そっくり消してしまうと、このような誤りによる損失を取り戻すことができない。
然し、例えばファイルに書き戻す前に、以前のファイルを別の名前で
保存してから、同じ名前の新たなファイルに、編集結果のバッファを
書き込めば、仮に今回の編集結果が誤りであったとしても、
名前を変えて保存しておいたファイルの内容から、
損失を取り戻すことが可能かも知れない。
Emacsでは、このような作業を自動的に行うようになっている。
以前のファイル内容を保存しておくことを、「バックアップ(backup)」という。
以前のファイル内容が保存されたファイルを、バックアップ・ファイルと呼ぶ。
デフォルトでは、Emacsであるファイルを編集し、保存し直すと、
そのファイルのバックアップ・ファイルが1つだけ作られる。
バックアップ・ファイルは、元のファイルと同じディレクトリに
作成される。ファイル名は、元のファイル名の最後に'~'を付けたものになる。
既にそういうバックアップ・ファイルが存在すれば、古い方の
バックアップ・ファイルは削除される。
もし、ファイルの保護許可の関係等でバックアップ・ファイルが通常の名前で
作成できなかった場合には、"~/%backup%~"という名前でバックアップされる。
エコー領域にその旨表示されるので、直ちに適切な手段を講じた方が良いだろう。
Emacsが、バックアップ・ファイルを作成するのは、初めてそのファイルを
変更するときだけである。具体的に説明すると、
1. C-x C-f で、ファイルを読み込む。
2. そのバッファを修正する。
3. C-x C-s で、保存する。
4. そのバッファを修正する。
5. C-x C-s で、保存する。
6. そのバッファを修正する。
7. C-x C-s で、保存する。
……
このような編集経過を辿ったとすれば、バックアップ・ファイルが作成されるのは
3.の時だけである。5., 7.では、単にファイルを書き直すだけである。
従って、7.の保存が完了した状態では、
編集対象ファイル: 6.迄の編集を反映した状態
バックアップ・ファイル: 1.の時の編集対象ファイルと同一の状態
となっている。朝、1.を実行し、丸々1日そのファイルを編集し続けたとする。
約1時間置きに保存したと仮定する。
夕方、誤りに気づき、昼頃の状態に戻したいと思っても、
その時点で存在するファイルは、
編集対象ファイル: 夕方の最新状態
バックアップ・ファイル: 朝編集を開始する前の状態
の2本しかないため、不可能、ということになる。
1.〜7.に続き、
8. C-x kで、そのバッファを一旦破棄する。
9. C-x C-f で、ファイルを読み込む。
10. そのバッファを修正する。
11. C-x C-sで、保存する。
とすれば、11.が完了した時点では、
編集対象ファイル: 11.が完了した状態
バックアップ・ファイル: 7.が完了した状態
という2本が存在することになる。
Emacsのバックアップ・ファイル生成のこのような癖は覚えておく必要が
あるだろう。
実は、一々バッファを破棄せずともバックアップ・ファイルを生成し直す
方法がある。本章の「●バッファとファイルとの関連」で触れたが、
C-x C-sに数値引数を与えることで可能になっている。
C-u C-x C-s 今回保存したものが、次回の保存時にバックアップされる。
C-u C-u C-x C-s 現在のファイル内容をバックアップしてから、
今回の保存をする。
C-u C-u C-u C-x C-s
現在のファイル内容をバックアップしてから、
今回の保存をする。更に今回保存したものは、
次回の保存時にバックアップされる。
このように、バックアップ・ファイルを1つしか残さないのがデフォルトだが、
設定次第では複数のバックアップを残すようにできる。また、
バックアップ・ファイルの作り方も、
・元のファイルをコピーして、バックアップとする
・元のファイルをrenameして、バックアップとする
というように、選択できる。
こういった設定の方法は、所謂カスタマイズ(cf. 第5章)の一種であるが、
このバックアップ・ファイル関連の話は第8章にまとめる。
○編集途中で気が変わった場合
ファイルを読み込んだバッファを、大きく内容変更した後で(但し、書き戻す前)、
矢張この修正を取り消そうと考えた場合、undo等を行うよりも、
元のファイルそのものの状態に戻した方が話が早いことがある。
こういった時には、次のコマンドを使用する。
revert-buffer 現バッファの全テキストを削除し、
対応するファイルの内容で置き換える。
オート・セーブ・ファイルから戻すか、元ファイルから戻すのかを、
yes/noで答えればよい。