しょぼしょぼすくりぷと xyzzy > xyzzyの初歩講座(機能と操作) > hook

hook

ここでは hookという便利な機能を紹介します。

hookとは

hookとは javaやC#でよくあるような、イベントトリガータイプの機能です。 hookとはあるタイミングで、処理を実行させたいときに使います。 xyzzyの中に、例えばファイルを開いた時hook関数が呼び出されて、そのhook変数に登録された関数を次々に呼び出すようになっています。

用意されているhook(イベント)は ファイルを保存したとき、javaファイルを開いたときなどたくさんあります。また自分で用意することも可能です。

またその仕組みとして、実質遅延ロードのようなメリットを享受できます。

使い方

add-hook で定義をすると 、そのモードの処理が終わった後呼び出されます。この例の場合java-mode になるまで実行されないので (require) みたいに xyzzy起動時に呼び出すことが無いので、起動時間が短くなります。

具体的には *naninani-hook* という 引っかける変数に ”これをついでに実行してね”と言う意味で渡します。xyzzyは ある状態(例えばxyzzy が始まった時とか、検索するときとか)になると、hook 変数を見ながら引っかかっているファンクションを実行していきます。

標準hook変数

だいたいhookには、このようなものがあります。

※M-x apropos[RET] hook[RET]で一覧が出ます。

Version 0.2.1.140

    * *before-save-buffer-hook* [until-success]
    * *after-save-buffer-hook*
    * *save-buffer-no-filenames-hook* [until-success]
    * *find-file-file-not-found-hook* [until-success]
    * *before-find-file-hook* [until-success]
    * *grepd-hook*
    * *grep-hook* 
until-success は 最後に nil指定が必要(っぽい?)
少なくとも*before-save-buffer-hook* は 最後にnilしないと保存が中断される。問題あった場合tにして中止させる
run-hook-with-args-until-success は 成功するまでhookを読み続ける。途中でOKすると止まる。

使用例

java-modeには、こんな設定をしてjavaが起動したときに、インデントの設定などをする関数を呼び出されるようにしています。

java-mode.l が *java-mode-hook*関数に登録されているものを 起動時に実行するようにプログラミングされています。modeでは暗黙のルールで、modeが起動されたときにこの命名規則で造られるようにして、使うときに呼ぶようになっています

(defun my-setting-java ()
  (setq editor::*java-indent-tabs-mode* t)
  (setq java-brace-offset -2)
  (setq java-label-offset 0)
  (abbrev-mode t)
)

;abbrev
(add-hook 'ed::*java-mode-hook* #'my-setting-java);



しょぼしょぼすくりぷと xyzzy > xyzzyの初歩講座(機能と操作)