Next: , Previous: , Up: System Interface   [Contents][Index]


38.19 ファイル変更による通知

いくつかのオペレーティングシステムは、ファイル変更にたいする、ファイルシステムの監視をサポートします。正しく設定されている場合には、Emacsはgfilenotifyinotifyw32notifyのようなライブラリーを静的にリンクします。これらのライブラリーにより、ローカルマシン上でのファイルシステムの監視が有効になります。

リモートマシン上のファイルシステムの監視も可能です。Remote Files in The GNU Emacs Manualを参照してください。これはEmacsにリンク済みのライブラリーのいずれかに依存する訳ではありません。

通知されたファイル変更によりこれらすべてのライブラリーは異なるイベントを発行するので、Emacsは一意な参照を提供するライブラリーfilenotifyを提供しています。

Function: file-notify-add-watch file flags callback

fileに関するファイルシステムイベントの監視を追加する。これはfileに関するファイルシステムイベントがEmacsに報告されるように取り計らう。

リターン値は追加された監視ディスクリプター(descriptor)。タイプは背景にあるライブラリーに依存しており、以下の例に示すとおり整数とみなすことはできない。比較にはequalを使用すること。

何らかの理由によりfileが監視不可能なら、この関数はエラーfile-notify-errorをシグナルする。

マウントされたファイルシステムでファイル変更を監視できないことがある。これはこの関数により検出されないので、非nilのリターン値がfileの変更の通知を保証するものではない。

flagsは何を監視するかセットするためのコンディションのリスト。以下のシンボルを含めることができる:

change

ファイル変更を監視。

attribute-change

パーミッションや変更時刻のようなファイル属性の変更を監視。

fileがディレクトリーならディレクトリー内のすべてのファイルの変更が通知される。これは再帰的に機能しない。

Emacsは何らかのイベント発生時には以下の形式のeventを単一の引数として関数callbackを呼び出す:

(descriptor action file [file1])

descriptorはこの関数がリターンするオブジェクトと同じ。actionはイベントを示し、以下のシンボルのいずれか:

created

fileが作成された。

deleted

fileが削除された。

changed

fileが変更された。

renamed

filefile1にリネームされた。

attribute-changed

fileの属性が変更された。

filefile1はイベントが報告されたファイルの名前。たとえば:

(require 'filenotify)
     ⇒ filenotify

(defun my-notify-callback (event)
  (message "Event %S" event))
     ⇒ my-notify-callback

(file-notify-add-watch
  "/tmp" '(change attribute-change) 'my-notify-callback)
     ⇒ 35025468

(write-region "foo" nil "/tmp/foo")
     ⇒ Event (35025468 created "/tmp/.#foo")
        Event (35025468 created "/tmp/foo")
        Event (35025468 changed "/tmp/foo")
        Event (35025468 deleted "/tmp/.#foo")

(write-region "bla" nil "/tmp/foo")
     ⇒ Event (35025468 created "/tmp/.#foo")
        Event (35025468 changed "/tmp/foo") [2 times]
        Event (35025468 deleted "/tmp/.#foo")

(set-file-modes "/tmp/foo" (default-file-modes))
     ⇒ Event (35025468 attribute-changed "/tmp/foo")

アクションrenamedがリターンされるかどうかは、使用する監視ライブラリーに依存する。filefile1の両方が同じディレクトリーに属し、そのディレクトリーが監視されていればリターンを期待できる。それ以外ではアクションdeletedcreatedがランダムな順にリターンされる。

(rename-file "/tmp/foo" "/tmp/bla")
     ⇒ Event (35025468 renamed "/tmp/foo" "/tmp/bla")

(file-notify-add-watch
  "/var/tmp" '(change attribute-change) 'my-notify-callback)
     ⇒ 35025504

(rename-file "/tmp/bla" "/var/tmp/bla")
     ⇒ ;; gfilenotify
        Event (35025468 renamed "/tmp/bla" "/var/tmp/bla")

     ⇒ ;; inotify
        Event (35025504 created "/var/tmp/bla")
        Event (35025468 deleted "/tmp/bla")
Function: file-notify-rm-watch descriptor

descriptorに指定された既存のファイル監視を削除する。descriptorfile-notify-add-watchがリターンしたオブジェクトであること。