signal 20160816.738(in MELPA)
Advanced hook

概要

あなたは、hookやadviceを活用していますか?
これらは関数の挙動をあなた色に染めるものです。

さて、、、

Emacsを極めるにはEmacs Lispを学ぶことが不可欠です。
なぜなら、hookやadviceに適切なコードを設定することでEmacsを強力にカスタマイズできるからです

たとえば、ファイルを開いたり保存したりするときに自動的にやって欲しい処理を記述できたりします。
だからこそ、Emacs Lispを学んでいれば作業を効率化できるんですね。

ということで、、

この signal パッケージはhookの進化形ともいえるものです。
今回はsignalをhookと同じように使う方法を示します。
進化形なのですから、元の機能をエミュレートすることなど簡単なことなのです。

hookとsignalの対応関係は以下のようになっています

定義 defvar(defcustom) defsignal
呼び出し run-hooks signal-emitb
追加 add-hook signal-connect
削除 remove-hook signal-disconnect

明日はsignalがhookとは違うことを示します!

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてsignalを使う方は
以下のコマンドを実行します。

M-x package-install signal

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name signal

使用例

(require 'signal)
;;; 定義
(defvar my-hook nil
  "Test hook")
(defsignal my-signal
  "Test signal")
;;; 元の関数を呼び出す
(defun test-func ()
  (with-output-to-string
    (princ "Hook")
    (run-hooks 'my-hook)
    (princ "/")
    (princ "Signal")
    (signal-emitb 'my-signal)
    (princ "/")))
(test-func)                             ; => "Hook/Signal/"

;;; 関数を追加する
(setq test-count 0)
(defun print-count ()
  "呼ばれた回数を表示する"
  (princ (cl-incf test-count)))
;; hookとは違い、signalは追加された数だけ同じ関数が実行される
(add-hook 'my-hook 'print-count)
(signal-connect :signal 'my-signal :worker 'print-count)
(add-hook 'my-hook 'print-count)
(signal-connect :signal 'my-signal :worker 'print-count)
(test-func)                             ; => "Hook1/Signal23/"
;;; 関数を削除する
(remove-hook 'my-hook 'print-count)
(signal-disconnect 'my-signal 'print-count)
(test-func)                             ; => "Hook/Signal/"


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。