‘w3m-search’ provides a convenient interface to various internet search engines. By default,
‘w3m-search’ is bound to S in WThreeM buffers.
See also: w3m support for Emacs Wiki.
The following provides an example of how to customize the behaviour of
‘w3m-search’. In particular, how to change the default search engine, how to add new search engines, and how to make the search engine default to the previous one selected.
(setq w3m-search-default-engine "google-groups")
(add-to-list 'w3m-search-engine-alist '("emacs-wiki" "http://www.emacswiki.org/cgi-bin/wiki.pl?search=%s"))
;; Make the previous search engine the default for the next ;; search.
(defadvice w3m-search (after change-default activate) (let ((engine (nth 1 minibuffer-history))) (when (assoc engine w3m-search-engine-alist) (setq w3m-search-default-engine engine))))
Here are some more entries that can be added to
‘w3m-search-engine-alist’, as above:
If you don’t want to build the list from scratch, wholesale removal of unwanted search engines can be done with something like:
(let ((unwanted (regexp-opt '("altavista" "eiei" "eiwa" "iij-archie" "rpmfind" "yahoo" "-ja" "-jp")))) (mapcar (lambda (elt) (when (or (string-match unwanted (car elt)) (eq 'euc-japan (nth 2 elt))) (setq w3m-search-engine-alist (delete elt w3m-search-engine-alist)))) w3m-search-engine-alist))
Note: At least in the developer version of emacs-w3m (it’s pretty stable, don’t be afraid to grab a fresh CVS co) you can simply type
gg:<your search string>
to do a google search. There are some other search engines predefined and you can easily add your other favorite engines. Have a look at
You know how Firefox or Internet Explorer lets you type in the address bar any search query if you define a bookmark with “keyword” (IE requires the registry, hm). Let’s do the same thing with w3m by defining a new function.
Add the following to your init files (eg. .emacs). Then run M-x piyo-w3m-search. By default, if you don’t type your search engine name, the whole string will be the query. If you do type a search engine name “google” for example, that search engine will be used. I also enabled completion on the search engine name but allow space to enter as self-insert-command (thanks offby1).
Here’s a use case.
;(require 'w3m-search) ; or auto-load? (defvar piyo-w3m--query-history nil "The query history isn't saved seperately!") (defun piyo-w3m-search (line) "Modeled on `w3m-search', but if the first word is a search engine as defined in `w3m-search-default-engine', then use that engine instead." (interactive (piyo-w3m--read-query-smart)) (let* ((defeng w3m-search-default-engine) (srceng (mapcar 'car w3m-search-engine-alist)) (sepr " ") (brok (split-string line sepr)) (possiblesea (pop brok))) (apply 'w3m-search (if (member possiblesea srceng) (list possiblesea (join-string brok " ")) (list defeng (join-string (push possiblesea brok) " ")))))) (defun join-string (lst &optional seperator) "The reverse of `split-string'" (interactive) (mapconcat 'identity lst seperator)) (defun piyo-w3m--read-query-dumb () "For reference. Not reference by running code." (let ((defeng w3m-search-default-engine)) (list (w3m-search-read-query (format "%s search: " defeng) (format "%s search (default %%s): " defeng) 'piyo-w3m--query-history)))) (defun piyo-w3m--read-query-smart () "Use `completing-read' to find the first matching search engine. But allow space input." (let ((defeng w3m-search-default-engine) (minibuffer-local-completion-map (copy-sequence minibuffer-local-completion-map))) (setcdr (assoc ?\s ; change space character minibuffer-local-completion-map) 'self-insert-command) (let ((completion-ignore-case t)) (list (completing-read (format "%s search: " defeng) w3m-search-engine-alist nil nil nil 'piyo-w3m--query-history)))))
This is tested on Emacs 22.0.50 / Meadow 3.00 -r 4152.