ふと思い立ったのでこんなコードを書いてみました。

Emacs Lispプログラミングをしている人にはもはや当たり前かもしれないけど、
propertize 関数がどう見ても Rubyの特異メソッド に見えてきたので。

しかも helm の情報源を記述するときに、
display-to-real 属性で テキストプロパティ
つけてあげると、文字列に付随するデータを渡せます。

コード 140812145540.propertize.el(以下のコードと同一)

(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))))))))

20140812150326.png
Fig1: M-x helmetstでbarを選択したところ

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