7.7 KiB
7.7 KiB
title | author | date | wordtwit_post_info | categories | ||
---|---|---|---|---|---|---|
anything の source を作ってみる (initの使い方) | kazu634 | 1969-12-31 |
|
|
Anything.el の source で init を使ってみて、うまくいかなかったのでここに書いておきます。
駄目だったソース
init の説明にはこうありました。
- init (オプション)
- anything が実行された際に引数なしで呼び出される関数。この要素は、候補のリストを作成するために現在の状況を収集するのに便利である。
例えば、 source がカレントディレクトリを対象とした場合、init 要素に指定することでカレントディレクトリの情報を収集することができる。なぜならば、それ以降 anything はミニバッファーと anything-buffer で動作し、カレントディレクトリが変わる可能性が出てくるからである。
これは candidates を表示する前に実行される関数なのだろうと単純に考えていたのですが、間違えていたようでした。
つくってみたソースはこちら:
(setq anything-c-source-testtest '((name . "test Search") (init . (lambda () (read-string "?: "))) (candidates . ("foo" "bar")) (action . (("Insert" . insert)))))
これを実行すると、下のような形で候補が表示されるのと、ミニバッファーでの問い合わせが同時に行われてしまいます:
スクリプトの引数を入力してもらってから、スクリプトを実施、候補の表示という流れにしたかったのですが、 init ではできないようです。。。
やりたかったことはこうすればできました
;; グローバル変数を定義 (defvar anything-c-source-amazon-work "a") ;; 事前にこの関数を呼び出して、引数を取得→anything-c-source-amazon-workに代入 ;; その後、anything-c-source-amazonでanythingを起動する ;; anything-c-source-amazonは、anything-c-source-amazon-workを引数として ;; 外部スクリプトを実行し、候補を生成する (defun anything_amazon (key) (interactive "sISBN13 or ASIN: ") (if (string-match "[0-9]+" key) (progn (setq anything-c-source-amazon-work key) (anything 'anything-c-source-amazon nil "Title: " nil nil anything-call-source-buffer)) (message "Please enter ISBN13 or ASIN!"))) (defvar anything-c-source-amazon '((name . "Amazon Search") (candidates . (lambda () (if (string-match "[0-9]+" anything-c-source-amazon-work) (delete "" (split-string (shell-command-to-string (format "access_amazon %s" anything-c-source-amazon-work)) "\n")) "No Results"))) (candidate-transformer . (lambda (candidates) (mapcar (function (lambda(arg) (apply 'cons (split-string arg "\t")))) candidates))) (action . (("Insert" . insert)))))