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

Quicksearch support in Emacs-w3m



Hi,

I need a way to perform searches in search engines in a fast way, and I
don't really like the C-u S way of doing it. I have therefore
implemented a similar system to Konqueror's "Enhanced Browsing", which
allows the user to use a regular url to launch searches. If you're not
familiar with this system, it's very simple: each search engine is
identified by a small prefix (e.g. "gg" for Google) and you begin a
search by going to a url like "gg:emacs-w3m". It takes you to the
result page of the search on Google. You don't need to use the normal
search interface.

Launching a new search in a new session while reading another page is
easy with this system: use G, then type a quicksearch url. My patch also
works with Emacs-w3m's grouping features, you can use for example
"group:gg:emacs&ya:w3m" to launch two searches: one on Google for
"emacs" and the other on Yahoo! for "w3m". You can also bookmark a
search by using its short name, for example if you want to keep an eye
on what people say about you on Usenet, bookmark "ggg:John Doe" and
you'll be set.

It has a few drawbacks though: 
- w3m-search needs to always be loaded in w3m.el since the quicksearch
  function insinuates the main w3m function (w3m-goto-url). Maybe
  making the quicksearch feature optional would be nice?
- you cannot use accentuated characters in quicksearch urls
- to use a space, you have to prefix it with C-q (since it completes
  the url by default)

I believe my code to be quite reliable since I've been using it for
some days without problems. However, I'm not a very skilled Elisp
programmer, nor do I know Emacs-w3m in depth, so I'd be glad to hear
comments from the authors about it.

Thanks,

Romain.

PS the patch also contains a few docfixes to w3m-search.el.
-- 
Romain FRANCOISE <romain@orebokech.com> | I've become someone else's
it's a miracle -- http://orebokech.com/ | nightmare...
Index: w3m-search.el
===================================================================
RCS file: /storage/cvsroot/emacs-w3m/w3m-search.el,v
retrieving revision 1.18
diff -u -r1.18 w3m-search.el
--- w3m-search.el	18 Jun 2002 07:30:18 -0000	1.18
+++ w3m-search.el	8 Nov 2002 20:09:29 -0000
@@ -35,8 +35,8 @@
 
 ;;; How to install:
 
-;; Please put this file to appropriate directory, and if you want
-;; byte-compile it.  And add following lisp expressions to your
+;; Put this file in the appropriate directory, and if you want,
+;; byte-compile it.  Then add the following lisp expression to your
 ;; ~/.emacs.
 ;;
 ;;     (autoload 'w3m-search "w3m-search" "Search QUERY using SEARCH-ENGINE." t)
@@ -55,6 +55,7 @@
       (, (if (equal "Japanese" w3m-language)
 	     '("google" "http://www.google.com/search?q=%s&hl=ja"; shift_jis)
 	   '("google" "http://www.google.com/search?q=%s"; nil)))
+      ("google groups" "http://groups.google.com/groups?q=%s"; nil)
       ("google-ja" "http://www.google.com/search?q=%s&hl=ja&lr=lang_ja"; shift_jis)
       ("goo-ja" "http://www.goo.ne.jp/default.asp?MT=%s"; euc-japan)
       ("excite-ja" "http://www.excite.co.jp/search.gw?target=combined&look=excite_jp&lang=jp&tsug=-1&csug=-1&search=%s"; shift_jis)
@@ -66,7 +67,7 @@
       ("freebsd-users-jp" "http://home.jp.FreeBSD.org/cgi-bin/namazu.cgi?key=\"%s\"&whence=0&max=50&format=long&sort=score&dbname=FreeBSD-users-jp"; euc-japan)
       ("iij-archie" "http://www.iij.ad.jp/cgi-bin/archieplexform?query=%s&type=Case+Insensitive+Substring+Match&order=host&server=archie1.iij.ad.jp&hits=95&nice=Nice";)))
   "*An alist of search engines.
-Each elemnt looks like (ENGINE ACTION CODING)
+Each element looks like (ENGINE ACTION CODING)
 ENGINE is a string, the name of the search engine.
 ACTION is a string, the URL that performs a search.
 ACTION must contain a \"%s\", which is substituted by a query string.
@@ -86,6 +87,21 @@
   :group 'w3m
   :type 'string)
 
+(defcustom w3m-search-quick-search-engine-alist
+  '(("gg"   . "google")
+    ("ggg"  . "google groups")
+    ("ya"   . "yahoo")
+    ("al"   . "altavista")
+    ("bts"  . "debian-bts")
+    ("dpkg" . "debian-pkg"))
+  "*An alist of short names for defined search engine names.
+Each element follows the scheme (NAME . ENGINE)
+NAME if the short name you want to use for this engine.
+ENGINE is the name of the engine as defined in `w3m-search-engine-alist'.
+Be careful: the names you use here must match exactly the names of the 
+engines defined in `w3m-search-engine-alist'."
+  :group 'w3m)
+
 (defcustom w3m-search-word-at-point t
   "*Non-nil means that the word at point is used as initial string."
   :group 'w3m
@@ -101,8 +117,8 @@
 ;;;###autoload
 (defun w3m-search (search-engine query)
   "Search QUERY using SEARCH-ENGINE.
-When called interactively with prefix argument, you can choose search
-engine deinfed in `w3m-search-engine-alist'.  Otherwise use
+When called interactively with a prefix argument, you can choose one of
+the search engines defined in `w3m-search-engine-alist'.  Otherwise use
 `w3m-search-default-engine'."
   (interactive
    (let ((engine
@@ -135,6 +151,22 @@
 		       (w3m-search-escape-query-string query (caddr info))))
 	(error "Unknown search engine: %s" search-engine)))))
 
+;;;###autoload
+(defun w3m-search-quick-search-handler (url)
+  "Check if the url is a quicksearch url.
+If URL is a quicksearch url, replace it with the real url needed to access
+the search engine.  If not, leave it alone."
+  (let ((ret url))
+    (dolist (quick-search-engine w3m-search-quick-search-engine-alist ret)
+      (if (string-match (concat "\\`" (car quick-search-engine) ":") url)
+	  (let ((query (substring url (match-end 0))))
+	    (unless (string= query "")
+	      (let ((info (assoc (cdr quick-search-engine) 
+				 w3m-search-engine-alist)))
+		(if info
+		    (setq ret (format (cadr info)
+				      (w3m-search-escape-query-string 
+				       query (caddr info))))))))))))
 
 (provide 'w3m-search)
 
Index: w3m.el
===================================================================
RCS file: /storage/cvsroot/emacs-w3m/w3m.el,v
retrieving revision 1.762
diff -u -r1.762 w3m.el
--- w3m.el	6 Nov 2002 23:04:45 -0000	1.762
+++ w3m.el	8 Nov 2002 20:09:30 -0000
@@ -103,6 +103,7 @@
     "Add link of current page to bookmark." t)
   (autoload 'w3m-search "w3m-search"
     "Search QUERY using SEARCH-ENGINE." t)
+  (autoload 'w3m-search-quick-search-handler "w3m-search")
   (autoload 'w3m-weather "w3m-weather"
     "Display weather report." t)
   (autoload 'w3m-about-weather "w3m-weather")
@@ -5811,7 +5812,11 @@
 car of a cell is used as the content-type and the cdr of a cell is
 used as the body.
 If the fifth argument REFERER is specified, it is used for a Referer:
-field for this request."
+field for this request.
+You can also use \"quicksearch\" url schemes such as \"gg:emacs\" which
+would search for the term \"emacs\" with the Google search engine.  See
+the `w3m-search' function and the variable 
+`w3m-search-quick-search-engine-alist'."
   (interactive
    (list
     (w3m-input-url nil
@@ -5825,7 +5830,8 @@
     (w3m-static-if (fboundp 'universal-coding-system-argument)
 	coding-system-for-read)))
   (set-text-properties 0 (length url) nil url)
-  (setq url (w3m-uri-replace url))
+  ;; quicksearch
+  (setq url (w3m-search-quick-search-handler (w3m-uri-replace url)))
   (cond
    ;; process mailto: protocol
    ((string-match "\\`mailto:\\(.*\\)" url)