[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

w3m-searchを書き換えたいのですが



はじめましてlightcyanと申します。
いつも便利にemacws-w3m使わせてもらって、ありがとうございます。

簡単なことなので既出かもしれませんが、質問させてください。
ちょっと長文になりますが…

w3m-searchを書き換えて、仕事用の関数を作ろうと
試行錯誤していたのですが完成せず、いくつか質問があります。

1.
C-u M-x w3m-search[RET]cybozu[ret]人名[ret]で、サイボウズの
アドレス帳のその人のページを開きたいのですが、

(setq w3m-search-engine-alist
		(append
		 (list
		  '("cybozu" "http://...%s" euc-japan)
		  ) w3m-search-engine-alist))

を(consを使ったほうが良いのかも知れませんが…)、w3m-search.elをロードした後に
実行すればいいと思うのですが、~/.emacs-w3mに書いたり、M-x w3mを実行した時に、
w3m-search.elをロードしてみたり、w3m-mode-hookに引っ掛けたりしたのですが、
w3m-search-engine-alistがないとエラーが返ってきます。

まぁこれは起動時に一回手でやればいいのでそんなに問題でないですが…

2.
1を手で実行したとして、その後で実行できる関数をw3m-searchをもとに書きました。

(defun n2m (search-engine query)
  "Convert name 2 mail using cybozu"
  (interactive
   (let ((engine "cybozu"))
     (re-search-forward "^.+$")
     (list engine
	   (buffer-substring (match-beginning 0) (match-end 0)))))
  (unless (string= query "")
    (let ((info (assoc search-engine w3m-search-engine-alist)))
      (let ((query-string (w3m-search-escape-query-string query
							  (caddr info)))
	    (post-data (cadddr info))
	    (buff (current-buffer)))
	(save-excursion (w3m-goto-url
			 (format (cadr info) query-string)
			 post-data
			 nil
			 (and post-data (format post-data query-string)))
			(if (re-search-forward "[a-zA-Z0-9_-]+@[a-zA-Z0-9_.-]+" nil t)
			    (message (buffer-substring (match-beginning 0) (match-end 0)))
			  (message "%s not found" query))
			(switch-to-buffer buff))))))

カーソル位置にある名前に対応するメールアドレスをミニバッファに表示したかったのですが…

w3m-goto-urlを実行した後に re-search-forwardを実行していますが、
w3m-goto-urlが画面を書き換える前にre-search-forwardが実行されてしまって
出力が前回の検索結果になって一つずつ遅れます。

名前の入力間違いなどで、見つからなかった時の(message "%s not found" query)が
ずれるのがつらいです(1個前が見つからない時、今の名前でエラーが出ます)。

w3m-goto-urlを使うべきでないんでしょうけど、代わりにどんな関数を
どう使ったら良いのか分かりません。

また messageで出力しているので、後で*Message*バッファからアドレスを
抽出しなければいけないのも、全然スマートでないですが、これも
何とかする方法が簡単なら教えてほしいです。

3.
2.の関数が完成はいったんあきらめて
(defun n2m-buffer ()
  "Convert name list 2 mail list using cybozu"
  (interactive)
  (while 1
    (call-interactively 'n2m)))

としてバッファにある、一行一人の名前のリストを一度に
メールアドレスのリストにしようとしたのですが、
Cannot run two w3m processes simultaneously (Type `C-c C-k' to stop asynchronous process)
のエラーとなります。これは2の関数が完成すれば解決するでしょうか。
最後は、(re-search-forward "^.+$")がエラーになって止まると思うのですが。

以上3点ご教授いただければと思います。よろしくお願いします。
-- 
lightcyan