anything-c-key-chord-describe をいじってみた

id:IMAKADO さんの

をちょこっと改造してみました。

もともとは key-chord-define-global を繰り返し書くのが冗長に感じて リスト+funcall の形にしたのですが、そしたらもうこのリストを使いまわせばよくね? と思ったのでそうしてみました。

↓こんな感じになります。
2011-01-02 22:32:23

(require 'key-chord)
(key-chord-mode 1)

(setq key-chord-list
      '(("fj"  . anything)
        ("^\\" . apropos)
        ("o0"  . howm-menu)
        ("\\]" . block-indent)
        ("@["  . toggle-truncate-lines)
        ("i9"  . describe-key-briefly)
        (";:"  . eval-expression)
        (";@"  . eval-region)
        (";l"  . eval-last-sexp)
        ("vg"  . view-mode)
        ("yu"  . moccur)
        ("dk"  . anything-c-key-chord-describe)
        ))
(dolist (pair key-chord-list)
  (funcall 'key-chord-define-global (car pair) (cdr pair)))

(defvar anything-c-source-key-chord-describe
  `((name . "key-chord describe bindings")
    (action . (("Call Interactively" . (lambda (c)
                                         (call-interactively
                                          (intern
                                           (car (cdr (split-string c " - ")))))))
               ("Add to kill-ring" . kill-new)))
    (candidates . (lambda ()
                    (mapcar
                     (lambda (pair)
                       (format "%s - %s" (car pair) (cdr pair)))
                     key-chord-list)))))

(defun anything-c-key-chord-describe ()
  (interactive)
  (anything '(anything-c-source-key-chord-describe)))
      • -

2011年 1月 3日 月曜日 18:59:08 JST
Call Interactively のとこが動かなくなっていたのを修正

追記 2011年 1月 4日 火曜日 21:41:51 JST

上のを適当に書いた後で Emacsテクニックバイブル の anything のとこをパラパラと見ていたら、335 ページに次のように書いてありました。


candidates 属性は、候補の取得方法を変数名かリストか無引数関数で指定します。変数の値、関数呼び出しの結果はリストである必要があります。リストの要素は文字列かシンボルを受け付けます。

上記のコードでは「文字列 or シンボル」以外のものを返していてダメな感じになってます。

また、real-to-display を使うと良さそうだということも分かり(同348ページ)、それも併せて次のように修正しました。

(defvar anything-c-source-key-chord-describe
  `((name . "key-chord describe bindings")
    (action . (("Call Interactively" . call-interactively)
               ("Add to kill-ring" . kill-new)))
    (candidates . (lambda ()
                    (mapcar (lambda (pair) (cdr pair))
                            key-chord-list)))
    (real-to-display . (lambda (real)
                         (format "%s - %s"
                                 (caar (remove-if-not
                                        (lambda (pair) (string= (cdr pair) real))
                                        key-chord-list))
                                 real)))))