Mode-Aware Google Help in Emacs

While surfing the other night, I ran across a nice Emacs Lisp function for using Google to do context-sensitive help from inside Emacs. I liked how simple it was, and had always been curious about writing some Emacs lisp code (my .emacs file is a random collection of snippets I egregiously pilfered from various locations), so I thought I would enhance the solution by making it aware of what major-mode I was in.



Building the Search URL

John Conners, the author of the original post built his URLs with the site: and inurl: keywords to limit the search to a specific site and with a specific string or pattern in the URL. He also appends the "I Feel Lucky" button (btnI) query string parameter so you will jump directly to the top hit. I simply modified his function to make the site, inurl and lucky parameters optional to give me a little more control over the search.

(defun search-site-url (keyword &optional site inurl lucky)
  "Do a Google search for KEYWORD. Restrict to SITE and INURL, if specified.
Jump to best match (I Feel Lucky) if LUCKY set.
"
  (concat "http://www.google.com/"
          (format "search?q=%s" (url-hexify-string keyword))
          (if site (format "+site:%s" (url-hexify-string site)))
          (if inurl (format "+inurl:%s" (url-hexify-string inurl)))
          (if lucky "&btnI")))

Making the Search Mode-Aware

Next I changed John's wxhelp function to check the major-mode you are editing in, and use that to configure the arguments to the search-site-url function (I also renamed the function to the more general context-help). This makes it easy to add new search modes and customize them so they work well based on what you are looking for.

(defun context-help ()
  "Open a browser window showing documentation for the word under the point.
Uses `major-mode' to optionally refine the search to a specific web site,
or a specific pattern in the URL. Defaults to a simple keyword search.
Uses `search-site-url' to do the actual search.
"
  (interactive)
  (browse-url
   (apply 'search-site-url
          (thing-at-point 'symbol)
          (cond
            ((equal major-mode 'css-mode)
             '("www.w3schools.com" "/css/" t))
            ((equal major-mode 'emacs-lisp-mode)
             '("www.gnu.org" "/emacs/"))
            ((or (equal major-mode 'html-mode)
                 (equal major-mode 'html-helper-mode))
             '("www.htmlquick.com" "/reference/" t))
            ((equal major-mode 'javascript-mode)
             '("www.w3schools.com" nil t))
            ((equal major-mode 'python-mode) 
             '("docs.python.org" "/ref/" t))
            (t nil)))))

You can see different uses of the various arguments in the code:

  • CSS: searches www.w3schools.com and looks for URLs with /css/ in them.
  • Emacs Lisp: searches www.gnu.org and looks for /emacs/ in the URL, but does not automatically jump to the top hit. I did this because sometimes I'm looking for the Emacs editor sections of the help and sometimes I'm looking for the Emacs Lisp sections. This way I just get the usual Google search hits and can scan them to find the best one.
  • HTML: for HTML help, I use the same search against www.htmlquick.com in either html-mode or html-helper-mode.
  • JavaScript: searches www.w3schools.com again, but does not limit with the inurl: keyword. This is because JavaScript language pages and JavaScript DOM pages do not have a common URL substring on that site.
  • Python: searches the standard Python documentation web site. This is the one I've been using the most and seems to provide good results most of the time.
  • The final default case just does a Google keyword search. This is reached if none of the major-mode cases match.

This has proved to be really useful in the few days that I've been using it.

|