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-modeorhtml-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-modecases match.
This has proved to be really useful in the few days that I've been using it.
3 Comments