2人のユーザーが同時に同じファイルを編集すると、互いに干渉し合う可能性が高くなります。Emacsは、ファイルが変更される際にファイルロックを記録することで、このような状況の発生を防ごうとします。これにより、Emacsは、別のEmacsジョブによってロックされているファイルを参照しているバッファを変更しようとする最初の試みを検出し、ユーザーにどう対処するかを尋ねることができます。ファイルロックは実際にはファイルであり、編集中のファイルと同じディレクトリに格納された、特別な名前を持つシンボリックリンクです。その名前は、バッファのファイル名の先頭に.#を付加して構成されます。シンボリックリンクのリンク先はuser@host.pid:bootという形式になり、ここでuserは現在のユーザー名(user-login-nameから)、hostはEmacsが動作しているホスト名(system-nameから)、pidはEmacsのプロセスID、bootは前回の再起動からの経過時間にそれぞれ置き換えられます。起動時刻が不明な場合は、:bootは省略されます。(シンボリックリンクをサポートしていないファイルシステムでは、代わりに通常のファイルが使用され、その内容はuser@host.pid:bootという形式になります。)
NFSを用いてファイルにアクセスする場合、あなたと別のユーザーが同時に同じファイルをロックしてしまう可能性がわずかにあります。この場合、2人のユーザーが同時に変更を加えることもあり得ますが、Emacsは後から保存したユーザーに警告を表示します。また、ディスク上で変更されたファイルを参照しているバッファの変更検出機能により、同時編集の一部のケースを検知できます。詳細はバッファの変更時刻を参照してください。
この関数は、ファイル filename がロックされていない場合は nil を返します。この Emacs プロセスによってロックされている場合は t を返し、他のジョブによってロックされている場合は、それをロックしたユーザー名を返します。
(file-locked-p "foo")
⇒ nil
この関数は、現在のバッファが変更されている場合にファイル filename をロックします。引数 filename
のデフォルト値は、現在のバッファが参照しているファイルです。現在のバッファがファイルを参照していない場合、変更されていない場合、またはオプション
create-lockfiles が nil
である場合は、何も行われません。
この関数は、現在のバッファが変更されている場合に、当該バッファで参照中のファイルをロック解除します。バッファが変更されていない場合は、ファイルがロックされているべきではないため、この関数は何も行いません。また、現在のバッファがファイルを参照していない場合や、ロックされていない場合も同様に何も行いません。この関数は、display-warningを呼び出すことでファイルシステムエラーを処理し、それ以外の場合はエラーを無視します。
この変数が nil の場合、Emacs はファイルをロックしません。
デフォルトでは、Emacsはロック対象のファイルと同じディレクトリにロックファイルを作成します。この変数をカスタマイズすることで、この動作を変更できます。この変数の構文は
auto-save-file-name-transforms と同じです(自動保存
を参照)。例えば、Emacsにすべてのロックファイルを /var/tmp/
に書き込ませるには、次のように記述します。
(setq lock-file-name-transforms
'(("\\`/.*/\\([^/]+\\)\\'" "/var/tmp/\\1" t)))
この関数は、ユーザーが file を変更しようとした際、other-user という別のユーザーによってロックされている場合に呼び出されます。この関数のデフォルトの定義では、ユーザーに何を行うかの指示を求めます。この関数が返す値によって、Emacs の次の動作が決まります:
t
という値は、ファイルのロックを取得することを意味します。その後、このユーザーはファイルを編集でき、other-user でロックが解除されます。
nil という値は、ロックを無視して、このユーザーにそのままファイルを編集させることを意味します。
file-locked エラーを通知する場合があり、その場合、ユーザーが行おうとしていた変更は行われません。
このエラーのエラーメッセージは、次のようになっています。
error→ File is locked: file other-user
ここで、fileはファイル名、other-userはファイルをロックしたユーザー名です。
ご希望であれば、ask-user-about-lock
関数を、別の方法で判定を行う独自のバージョンに置き換えても構いません。
変数 remote-file-name-inhibit-locks を t に設定することで、リモートロックファイルの作成を防ぐことができます。
このコマンドを対話的に実行すると、現在のバッファにおける create-lockfiles
のローカル値が切り替わります。