2010.09.19
■[elisp] アドバイスを返すマクロの解説
関数 f1 とその事後アドバイスを定義します。
(defun f1 () (insert "a")) (f1) ;=> a (defadvice f1 (after my-f1 activate) (insert "z")) (f1) ;=> az
最後に "z" を挿入するこのアドバイスを汎用化する方法の一つは、アドバイスを返すマクロを定義することです。
(defmacro install-insert-z-advice (target-function) `(defadvice ,target-function (after dummy activate) (insert "z")))
新規に作成した関数f2, f3 に対して、install-insert-z-advice マクロで上記の事後アドバイスを設定します。
(defun f2 () (insert "b")) (f2) ;=> b (install-insert-z-advice f2) (f2) ;=> bz (defun f3 () (insert "c")) (install-insert-z-advice f3) (f3) ;=> cz
anything-follow-mode を強制的にオンにした anything コマンドを創りたい - hchbaw記 が実践的な例です。
追記
もう一つ実例を見つけました。anything-migemo.el
(defmacro anything-migemize-command (command) "Use migemo in COMMAND when selectiong candidate by `anything'. Bind `anything-use-migemo' = t in COMMAND." `(defadvice ,command (around anything-use-migemo activate) (let ((anything-use-migemo t)) ad-do-it)))
■[CL] 処理系ごとの分岐は #+sbcl など
#+sbcl で 「sbcl なら」という意味。
(defun impli-cheack () #+allegro (use-package xxx) #+sbcl (use-package xxx) #+clisp (use-package xxx) #+cmu (use-package xxx) #-(or allegro sbcl clisp cmu) (error "Not implemented"))
*features* の要素かを判定している。#+cl-ppcre などでもマッチするけど処理系の判定用途らしい。それからこれは、読み込み時の分岐でありコンパイラは該当しない式の存在を知ることはない。
以下はclispではタイプ要素にnil,それ以外なら:wildを設定しているPCLでの使用例
(defun directory-wildcard (dirname) (make-pathname :name :wild :type #-clisp :wild #+clisp nil :defaults (pathname-as-directory dirname)))
初見だと大胆に見える次の例も、関数clisp-subdirectories-wildcardがclispなら読み込まれる、という意味(PCLより)。
#+clisp (defun clisp-subdirectories-wildcard (wildcard) (make-pathname :directory (append (pathname-directory wildcard) (list :wild)) :name nil :type nil :defaults wildcard))
■[ubuntu] urxvt 256色化/文字間の幅指定を可能にする
rxvt-unicodeで、xftフォントの文字間が広すぎる件に関して - 記録:dandan(β) で文字間の幅を指定できるようにするパッチを知った。思わぬ収穫だった。
$ sudo apt-get build-dep rxvt-unicode $ cd ~/source $ sudo apt-get source rxvt-unicode $ wget http://lists.schmorp.de/pipermail/rxvt-unicode/attachments/20090507/24c782dd/attachment.bin $ mv attachment.bin doc/ $ patch -p1 < doc/attachment.bin $ patch -p1 < doc/urxvt-8.2-256color.patch $ ./autogen.sh $ ./configure --enable-xterm-colors=256 $ make $ sudo make install $ echo "urxvt*letterSpace: -3" >>~/.Xdefaults
