GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/emacs/Interlocking.html ・ emacs-doc.conao3.com

20.3.4 同時編集に対する保護

同時編集は、2人のユーザーが同じファイルにアクセスし、それぞれ変更を加えた後、両者が保存した際に発生します。この現象について誰も知らされていない場合、先に保存したユーザーは、後から自分の変更内容が失われていることに気づくことになります。

一部のシステムでは、2人目のユーザーがファイルを変更し始めるとEmacsが即座にそれを検知し、直ちに警告を表示します。すべてのシステムにおいて、Emacsはファイルの保存時にチェックを行い、他のユーザーの変更内容を上書きしようとしている場合に警告を表示します。ファイルを保存する代わりに適切な是正措置を講じることで、他のユーザーの作業内容が失われるのを防ぐことができます。

ファイルを開いているEmacsバッファで最初の変更を行うと、Emacsはそのファイルがユーザーによってロックされていることを記録します。(これは、同じディレクトリ内に特殊な内容を持つ、特別な名前のシンボリックリンク9を作成することで行われます。詳細は(elisp)File Locksを参照してください。)変更内容を保存すると、Emacsはそのロックを解除します。これは、そのファイルを開いているEmacsバッファに未保存の変更がある限り、ファイルがロックされているという考え方に基づいています。

変数 create-lockfiles を nil に設定することで、ロックファイルの作成を防ぐことができます。 注意: この設定を行うと、本機能が提供するメリットが得られなくなります。 また、変数 lock-file-name-transforms を使用することで、ロックファイルの書き込み先を制御することも可能です。

アクセス先のファイルが他者によってロックされている間にバッファの変更を開始すると、これは衝突となります。Emacsは衝突を検出すると、Lisp関数ask-user-about-lockを呼び出して、どう対処するかをユーザーに問いかけます。カスタマイズのために、この関数を再定義することも可能です。この関数の標準的な定義では、ユーザーに問いかけを行い、3つの選択肢を受け付けます:

s

ロックを奪え。すでにファイルを変更していた者がロックを失い、君がロックを得る。

p

進めて。他の人がロックしていても、そのままファイルを編集して。

q

やめてください。これによりエラー(file-locked)が発生し、バッファの内容はそのままになります—行おうとしていた変更は実際には行われません。

Emacsやオペレーティングシステムがクラッシュすると、古いロックファイルが残ることがあり、その結果、時折誤衝突に関する警告が表示されることがあります。衝突が誤衝突であると判断した場合は、p を使用して、そのまま処理を進めるようEmacsに指示してください。

なお、ロックはファイル名を基準に動作します。ファイルに複数の名前がある場合、Emacsは2人のユーザーが異なる名前で同時に編集することを妨げません。

状況によっては、ロックファイルを作成できない場合があります(例:Emacsにシステム権限がない場合や、その他の理由でロックファイルを作成できない場合など)。このような場合でも、Emacsはファイルを保存しようとする際に、ファイルの最終更新日を確認することで衝突を検出できます。Emacsが最後にそのファイルにアクセスまたは保存した時点から変更が加えられている場合、それは別の方法で変更が行われたことを意味しており、そのまま保存を進めるとその変更内容は失われます。このときEmacsは警告メッセージを表示し、保存前に確認を求めます。yes と入力すると保存され、no または C-g と入力すると保存がキャンセルされます。

すでに同時編集が行われた旨の通知を受けた場合、バッファとファイルを比較する方法の一つに M-x diff-buffer-with-file コマンドがあります。ファイルの比較を参照してください。

変数 remote-file-name-inhibit-locks を t に設定することで、リモートロックファイルの作成を防ぐことができます。

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


脚注

(9)

ファイルシステムがシンボリックリンクに対応していない場合は、通常のファイルが使用されます。