- 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 |
インストール
パッケージシステムを初めて使う人は
以下の設定を ~/.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/"
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。