Next: , Previous: , Up: ファイルの保存   [Contents][Index]


19.3.4 同時編集からの保護

同時編集(Simultaneous editing)は、2人のユーザーが同じファイルをvisitして、両者が変更と保存を行ったときに発生します。これが発生していることを誰も知らせなければ、最初に保存したユーザーは、後で自分の変更が失われていることに気付くでしょう。

いくつかのシステムでは、Emacsは2番目のユーザーがファイルの変更を開始すると、すぐに警告を発します。また、すべてのシステムにおいて、Emacsはファイルを保存するときにチェックして、他のユーザーの変更を上書きすることを警告します。ファイルを保存するかわりに適切な訂正アクションをとることにより、他のユーザーの変更を失わなわずに済みます。

ファイルをvisitしているEmacsバッファーで最初の変更を行うとき、Emacsはファイルがロック(locked)されていることを記録します(これは同じディレクトリーにある、特別な内容の、特別な名前のシンボリックリンク7を作ることにより行われます。詳細は(elisp)File Locksを参照のこと)。変更を保存したとき、Emacsはロックを解除します。このアイデアは、ファイルをvisitしているEmacsバッファーに保存されていない変更があるとき、ファイルはロックされているとするものです。

変数create-lockfilesnilにセットすることにより、ロックファイルの作成を抑制することができます。警告:これにより、この機能が提供する利点を失うことになります。lock-file-name-transforms変数を使用すればロックファイルの書き込み場所の制御もできます。

他のユーザーによりロックされているファイルをvisitしているバッファーの変更を開始すると、衝突(collision)が起こります。Emacsが衝突を検知すると、Lisp関数ask-user-about-lockを呼び出して、何を行うか尋ねます。カスタマイズのためにこの関数を再定義できます。この関数の標準定義は、ユーザーに質問をして、3つの有効な応えを受け取ります。

s

ロックを横取りします。すでにファイルを変更したユーザーはロックを失い、あなたがロックを取得します。

p

続行します。他のユーザーがロックしている如何にかかわらずファイルの編集を続けます。

q

終了します。これはエラー(file-locked)を引き起こし、バッファーの内容は変更されません。あなたが試みた修正は実際には行われません。

Emacsまたはオペレーティングシステムがクラッシュすると、偽のロックファイルが残ることがあり、このような偽のロックファイルによる警告を受けることがあります。偽の衝突だと確信できるときは、Emacsにとにかく実行させるpを使います。

ロックはファイル名にもとづいて機能するので、ファイルが複数の名前を持っていて、2人のユーザーがそれぞれ別のファイル名で同時編集を行うことを、Emacsが防ぐことはできないことに注意してください。

ロックファイルに書き込みできない状況がいくつかあります。たとえばシステム権限不足や他の理由により、Emacsがロックファイルが作成できない場合です。このような場合でも保存を試みたときに、ファイルの最終変更日時をチェックすることにより、Emacsは衝突を検知できます。最後にEmacsがvisitまたは保存したときからファイルが変更されているとき、それは他の何らかの手段によりファイルが変更されたことを示し、Emacsが保存を行うことによりそれらが失われることを意味します。そのようなときEmacsは警告メッセージを表示して、保存する前に確認を求めます。保存するときはyes、保存を取り消すときはnoまたはC-gと応えてください。

すでに同時編集が発生しているとき、バッファーとファイルを比較する方法の1つは、M-x diff-buffer-with-fileコマンドです。ファイルの比較を参照してください。

変数remote-file-name-inhibit-lockstにセットすることによって、リモートロックファイルの作成を抑制することができます。警告:これにより、この機能が提供する利点を失うことになります。

インタラクティブに呼び出されるマイナーモードlock-file-modeは、カレントバッファーでのcreate-lockfilesのローカル値を切り替えます。


Footnotes

(7)

システムがシンボリックリンクをサポートしていなければ、通常のファイルが使われます。