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

Re: 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がないとエラーが返ってきます。
> 
> まぁこれは起動時に一回手でやればいいのでそんなに問題でないですが…

eval-after-loadはいかがでしょうか。例えば

(eval-after-load
    "w3m-search"
  (message "w3m-search is loaded."))

とするとw3m-searchがloadされたあとに
	(message "w3m-search is loaded.")
が評価されます。役に立たないでしょうか?

> 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を使うべきでないんでしょうけど、代わりにどんな関数を
> どう使ったら良いのか分かりません。

まったくの勘ですが、w3m-async-execがtになってませんか?
tの場合w3m-goto-urlの処理が非同期に、すなわちページの描画が完了する前に、
n2mが実行されてしまうのではないでしょうか。応急処置としては、


(w3m-goto-url ...)をletでくくって

(let ((w3m-async-exec nil)) (w3m-goto-url ...))
としてしまえば、ページの描画が完了するまでw3m-goto-urlから制御が戻ってこなくなるはずです。

はずれてたらすいません。


以下は僕の手元にあったコードです。
gaucheというschemeのインタープリタのマニュアルがウェブ上にあります。
指定した関数の説明をそのウェブページから引いきます。

    (defun gauche-find-doc (sym)
      (interactive "sSymbol: ")
      (let ((w3m-async-exec nil))
	(w3m (format "http://www.shiro.dreamhost.com/scheme/gauche/man/?l=jp&p=%s"
		     sym))
	(goto-char (point-min))
	(re-search-forward (concat "^[A-Za-z]+: " (regexp-quote sym )))
	(recenter 1)))