ふと思い立ったのでこんなコードを書いてみました。
Emacs Lispプログラミングをしている人にはもはや当たり前かもしれないけど、 propertize 関数がどう見ても Rubyの特異メソッド に見えてきたので。
しかも helm の情報源を記述するときに、 display-to-real 属性で テキストプロパティ を つけてあげると、文字列に付随するデータを渡せます。
(setq s1 "foo"
;; s2にテキストプロパティをつけてあげる
s2 (propertize "foo"
'value "bar"
:number 1
'func (lambda (self) (capitalize self))))
(string= s1 s2) ; => t
;;; もはやただの文字列ではない(笑)
(get-text-property 0 'value s2) ; => "bar"
(get-text-property 0 :number s2) ; => 1
;;; 見ろよこれ、どう見ても特異メソッドじゃねーか!
(funcall (get-text-property 0 'func s2) s2) ; => "Foo"
;;; helmで応用できる
(require 'helm)
(defun helmtest ()
(interactive)
(helm :sources '(((name . "test")
(init
. (lambda ()
(with-current-buffer (helm-candidate-buffer 'global)
(insert "foo\n"
"bar\n"
"baz\n"))))
(candidates-in-buffer)
(display-to-real
. (lambda (x) (propertize x 'capitalize (capitalize x))))
(action
. (lambda (x) (message "%s (%s)" x (get-text-property 0 'capitalize x))))))))
http://rubikitch.com/f/20140812150326.png Fig1: M-x helmetstでbarを選択したところ