Previous: Backup, Up: Saving


12.3.2 同時編集に対する保護

2人のユーザーが同じファイルを訪問し、両者がそれを編集し、 両者がそれを保存すると、同時編集が発生します。 こういったことが起きていることを誰も知らせなければ、 最初に保存したユーザーは、あとになって自分の変更が失われていることを知るでしょう。

ある種のシステムでは、2人目のユーザーがファイルを変更し始めたことを Emacsがただちに検知して警告を発します。 すべてのシステムでは、ファイルを保存するときにEmacsが検査して、 他人の変更を上書きしようとしているならば警告します。 ファイルを保存するかわりに適切な修正操作を行えば、 他人の作業結果を失うことを避けられます。

ファイルを訪問しているEmacsバッファで初めて修正を行うと、 Emacsはそのユーザーがファイルをロックしたと記録します。 (同じディレクトリ内に異なる名前のシンボリックリンクを作ることで実現する。) 変更を保存するとEmacsはロックを消します。 つまり、ファイルを訪問しているEmacsバッファに未保存の変更があるときには ファイルをロックしておくのです。

他人がロックしているファイルを訪問先とするバッファを 修正し始めると衝突が起こります。 Emacsが衝突を検知すると、Lisp関数ask-user-about-lockを呼び出して、 どうするかを聞いてきます。 この関数をカスタマイズのために再定義することもできます。 この関数の標準の定義では、ユーザーに質問をし、3つの返答を受理します。

s
ロックを横取りする。 ファイルをすでに変更していた人はロックを失い、 あなたがロックを得る。
p
続行する。 誰かがファイルをロックしたままであるにもかかわらず、 ファイルを編集する。
q
放棄する。 これはエラー(file-locked)を引き起こし、 バッファ内で修正しようとしたことは、実際には行われない。

ロックはファイル名に基づいて動作することに注意してください。 ファイルに複数の名前があると、Emacsには2つの名前が同じファイルで あることはわからないので、 2人のユーザーが異なる名前で同じファイルを編集することは防げません。 しかし、名前に基づいたロックなので、 保存しない限り実在しない新規ファイルの編集をEmacsはインターロック 1 できます。

Emacsがロックを作れる構成になっていないシステムもあります。 また、ロックファイルを書けない場合もあります。 こういった状況では、 Emacsがあらかじめトラブルを検知することはできませんが、 他人の変更を上書きしてファイルを保存しようとしたときには、 衝突を検知できます。

Emacsやオペレーティングシステムがクラッシュすると、 古いロックファイルが残っていることあります。 そのため、ときどき偽の衝突についての警告を受けとることがあるかもしれません。 偽の衝突であると確信できれば、 Emacsにとにかく続行するように指示するpを使います。

Emacsは、バッファを保存するたびに、 ディスク上のファイルの最終変更日時が最後に訪問/保存したときから 更新されていないことをまず検査します。 変更日時が不一致ならば、なんらかの方法でそのファイルが変更されたことを示し、 Emacsが本当に保存するとそれらの変更が失われてしまいます。 これを避けるために、Emacsは警告のメッセージを表示し、 保存するまえに確認を求めます。 ファイルが変更された理由を承知していて、 それが問題でないことを知っていることもあるでしょう。 そうならば、yesと答えて続行できます。 さもなければ、C-gで保存を中断して、その事態を調査するべきです。

同時編集が発生したことを知らされたときにまず行うべきことは、 C-u C-x C-d(see Directories)でディレクトリ一覧を見ることです。 このコマンドは、ファイルの現在の所有者を表示します。 その人に連絡して、編集を続けないように警告しましょう。 そのつぎの段階は、別の名前でEmacsバッファを保存して、 diffで2つのファイルを比較することでしょう。


Footnotes

[1] 【訳注】進行中の動作が完了するまでは、 つぎの動作を開始させないようにすること。