Go to the first, previous, next, last section, table of contents.

同時編集に対する保護

2人の利用者が同じファイルを読み込み,ともに修正し,セーブを行なうと同 時編集が起こります.利用者がどちらも同時編集の発生を知らなければ,最初に 編集した人はあとになって自分の行なった修正が失われていることに気づくこと になります.2番目の利用者がファイルを修正しようとしていることに気づくと, すぐに警告を与えることができるシステムがあります.これが不可能な場合,あ るいは2番目の利用者が警告に関わらず修正を続ける場合には,Emacsはあとでファ イルがセーブされる際にチェックを行ない,他の利用者の行なった変更を無効に するようなセーブを行なおうとしている利用者に警告を与えます.利用者がこの 時点で適切な処置をとれば,作業を無駄にせずに済みます.

ファイルを読み込んでいるバッファで最初の修正を行なったときにEmacsは, ファイルをロックします.これはこの目的のためのディレクトリにファイルを作 ることによって行なわれます.修正したバッファをセーブするとロックは解除さ れます.つまりバッファが修正されるときにはファイルが必ずロックされている ということです.読み込んだファイルが他の利用者によってロックされていると きバッファの修正を始めると衝突が起こるため,Emacsはどうすべきか聞いてき ます.これにはLisp関数ask-user-about-lockを呼び出します.この関数 はカスタム化のために再定義できます.この関数の標準の定義では質問を行ない, 以下の3つの答えを受け取ります.

s
ロックを解除します.すでにファイルが変更されていても,そのロックを解除し, 自分のロックをかけます.
p
続けます.他の利用者がロックしていてもファイルの編集を続けます.
q
中止します.エラー(file-locked)がおき,現在バッファで行なおうとし ている修正はなされません.

ロック機能はファイル名に基づいて動作する点に注意してください.ファイル が複数の名前を持つ場合には,Emacsは2つの名前が同一ファイルとはわからない ため,二人の利用者が別々の名前で同一ファイルを同時に編集することを防ぐこ とができません.しかしファイル名に基づいたロックなので,Emacsは実際に存 在しない新しいファイルの編集をセーブするまでロックできます.

システムによっては,Emacsがロックできないようなものもあります.このよ うなシステムではEmacsは前もって同時編集を見つけることはできませんが,そ れでも,他の利用者の修正に上書きしようとしていることは発見できます.

Emacsはバッファをセーブする際,必ず最初にディスク上の既存ファイルの最 新の修正時刻をチェックします.これによってファイルが最後に読み込んでから, また最後のセーブのあとに変更されていないことを確認します.時刻が一致しな い場合には,ファイルに何らかの方法で変更が加えられたということを意味しま す.ここで,Emacsがセーブを行なうとこの変更は無効になります.これを防ぐ ために,Emacsは警告メッセージを表示し,セーブ前に確認を求めてきます.ファ イルの変更理由や上書きに問題がないことがわかっているなら,yesと答 えればそのまま続けられます.そうでない場合には,C-gを使ってセーブ コマンドを取り消して状況を調べます.

同時編集がすでに起こったとわかったら,まずC-u C-x C-dを使ってディ レクトリのリストを表示することです(see section ファイルディレクトリの表示). こうするとファイルの現在の作成者がわかるので,この作成者に編集を続けない よう注意します.次に別のファイル名でEmacsバッファの内容をセーブして, diffを使って2つのファイルを比較します.

C-x C-fを使ってすでに読み込まれているファイルを選択したとき,お よびそのファイルの修正を始めたときにも同時編集チェックが行なわれます.こ の機能は絶対に必要というわけではありませんが,問題が早いうちに発見できる ので,おそらく解決の手間は少なくて済みます.


Go to the first, previous, next, last section, table of contents.