いくつかのオペレーティングシステムはファイルやファイル属性の変更にたいするファイルシステムの監視をサポートします。正しく設定されていれば、Emacsはinotify、kqueue、gfilenotify、w32notifyのようなライブラリーを静的にリンクします。これらのライブラリーによりローカルマシン上でのファイルシステムの監視が有効になります。
リモートマシン上のファイルシステムの監視も可能です。Remote Files in The GNU Emacs Manualを参照してください。これはEmacsにリンク済みのライブラリーのいずれかに依存する訳ではありません。
通知されたファイル変更によりこれらすべてのライブラリーは異なるイベントを発行するので、Emacsはアプリケーションにたいして統一されたインターフェースを提供するライブラリーfilenotify
を提供しています。ファイル通知を受け取りたいLispプログラムは、ネイティブのライブラリーよりこのライブラリーを優先する必要があります:このセクションではfilenotify
ライブラリーの関数と変数について説明します。
fileに関するファイルシステムイベントの監視を追加する。これはfileに関するファイルシステムイベントがEmacsに報告されるように取り計らう。
リターン値は追加された監視ディスクリプター(descriptor)。タイプは背景にあるライブラリーに依存しており、以下の例に示すとおり一般的には整数とみなすことはできない。比較にはequal
を使用すること。
何らかの理由によりfileが監視不可能なら、この関数はエラーfile-notify-error
をシグナルする。
マウントされたファイルシステムでファイル変更を監視できないことがある。これはこの関数により検出されないので、非nil
のリターン値が実際にfileが変更された通知であることを保証するものではない。
fileがシンボリックリンクの場合には、そのリンクのフォローは行わずfileそのものだけを監視する。
flagsは何を監視するかセットするためのコンディションのリスト。以下のシンボルを含めることができる:
change
ファイル内容の変更を監視。
attribute-change
パーミッションや変更時刻のようなファイル属性の変更を監視。
fileがディレクトリーなら、change
はそのディレクトリーでのファイルの作成と削除を監視する。このような場合にファイルの変更もレポートするファイル通知バックエンドもいくつかある。これは再帰的に機能しない。
Emacsは何らかのイベント発生時には以下の形式のeventを単一の引数として関数callbackを呼び出す:
(descriptor action file [file1])
descriptorはこの関数がリターンするオブジェクトと同じ。actionはイベントを示し、以下のシンボルのいずれか:
created
fileが作成された。
deleted
fileが削除された。
changed
fileの内容が変更された。w32notifyライブラリーでは属性の変更でも同様に報告される。
renamed
fileがfile1にリネームされた。
attribute-changed
fileの属性が変更された。
stopped
fileの監視が中断された。
w32notifyライブラリーはattribute-changed
イベントを報告しないことに注意。このライブラリーはパーミッションや変更時刻のようなファイル属性が何か変更された際にはchanged
イベントを報告する。同じようにkqueueライブラリーでは、ディレクトリー監視時にはファイル属性変更の報告に信頼性がない。
stopped
イベントはファイル監視の停止を意味する。これはfile-notify-rm-watch
の呼び出された(以下参照)、監視中のファイルが削除された、、監視中ファイルがあるファイルシステムのマウントが解除された、または背後にあるライブラリーから別のエラーが報告されてそれ以上の監視が不可能になった可能性がある。
fileとfile1はイベントが報告されたファイルの名前。たとえば:
(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") Event (35025468 deleted "/tmp/.#foo")
(set-file-modes "/tmp/foo" (default-file-modes) 'nofollow) ⇒ Event (35025468 attribute-changed "/tmp/foo")
アクションrenamed
がリターンされるかどうかは使用する監視ライブラリーに依存する。それ以外ではdeleted
とcreated
のアクションがランダムな順にリターンされる。
(rename-file "/tmp/foo" "/tmp/bla") ⇒ Event (35025468 renamed "/tmp/foo" "/tmp/bla")
(delete-file "/tmp/bla") ⇒ Event (35025468 deleted "/tmp/bla")
descriptorに指定された既存のファイル監視を削除する。descriptorはfile-notify-add-watch
がリターンしたオブジェクトであること。
Removes all existing file notification watches from Emacs.
ファイル監視にもとづくパッケージでは予期せぬ副作用が起こり得るので、このコマンドの使用には注意を要する。これは主にデバッグ目的やEmacsがフリーズした際の使用を意図した関数である。
descriptorで指定された監視の有効性をチェックする。descriptorはfile-notify-add-watch
がリターンしたオブジェクトであること。
監視するファイルやディレクトリーの削除や別の理由による監視スレッドの異常exitにより監視が無効になる可能性がある。file-notify-rm-watch
の呼び出しで削除することにより監視も無効になる。
(make-directory "/tmp/foo") ⇒ Event (35025468 created "/tmp/foo")
(setq desc (file-notify-add-watch "/tmp/foo" '(change) 'my-notify-callback)) ⇒ 11359632
(file-notify-valid-p desc) ⇒ t
(write-region "bla" nil "/tmp/foo/bla") ⇒ Event (11359632 created "/tmp/foo/.#bla") Event (11359632 created "/tmp/foo/bla") Event (11359632 changed "/tmp/foo/bla") Event (11359632 deleted "/tmp/foo/.#bla")
;; ディレクトリーのファイル削除では監視は無効にならない (delete-file "/tmp/foo/bla") ⇒ Event (11359632 deleted "/tmp/foo/bla")
(write-region "bla" nil "/tmp/foo/bla") ⇒ Event (11359632 created "/tmp/foo/.#bla") Event (11359632 created "/tmp/foo/bla") Event (11359632 changed "/tmp/foo/bla") Event (11359632 deleted "/tmp/foo/.#bla")
;; ディレクトリー削除により監視は無効になる ;; 別の監視ディスクリプターからイベントが到着 (delete-directory "/tmp/foo" 'recursive) ⇒ Event (35025468 deleted "/tmp/foo") Event (11359632 deleted "/tmp/foo/bla") Event (11359632 deleted "/tmp/foo") Event (11359632 stopped "/tmp/foo")
(file-notify-valid-p desc) ⇒ nil