Difference between revisions of "Haskell mode for Emacs/Hoogle.el"

From HaskellWiki
Jump to: navigation, search
m (Note about documentation)
(Provide cross-references in docstring; actually use hoogle-local-command)
Line 1: Line 1:
 
An Emacs Lisp library to integrate [[Hoogle]] with [[Emacs]]. The documentation is mostly the docstring of the hoogle-lookup function.
 
An Emacs Lisp library to integrate [[Hoogle]] with [[Emacs]]. The documentation is mostly the docstring of the hoogle-lookup function.
   
<pre>;; This code comes from hyperclim.el and was originally written by
 
  +
<pre-lisp>
 
;; This code comes from hyperclim.el and was originally written by
 
;; Andy Hefner (andy.hefner@verizon.net)
 
;; Andy Hefner (andy.hefner@verizon.net)
 
;; modified for Hoogle -- clemens@endorphin.org
 
;; modified for Hoogle -- clemens@endorphin.org
Line 13: Line 14:
 
(defvar hoogle-local-command "hoogle"
 
(defvar hoogle-local-command "hoogle"
 
"The name of the executable used for Hoogle. If this isn't
 
"The name of the executable used for Hoogle. If this isn't
found in $PATH (using executable-find), then a web lookup is used.")
+
found in $PATH (using `executable-find'), then a web lookup is used.")
 
(defvar hoogle-always-use-web nil
 
(defvar hoogle-always-use-web nil
 
"Set to non-nil to always use web lookups.")
 
"Set to non-nil to always use web lookups.")
Line 22: Line 23:
 
"Lookup the identifier at point in Hoogle. If we can't find an
 
"Lookup the identifier at point in Hoogle. If we can't find an
 
identifier at the point, or with a prefix arg of 1, prompts for a
 
identifier at the point, or with a prefix arg of 1, prompts for a
name to look up. If we can find a 'hoogle' in the $PATH (using
+
name to look up. If we can find a Hoogle in the $PATH (using
executable-find), it will be used, unless hoogle-always-use-web
+
`executable-find' on `hoogle-local-command'), it will be used,
is non-nil. For web Hoogling, the name is appended to
+
unless `hoogle-always-use-web' is non-nil. For web Hoogling, the
hoogle-url-base and browse-url is invoked."
+
name is appended to `hoogle-url-base' and `browse-url' is
  +
invoked."
 
(interactive "p")
 
(interactive "p")
 
(let ((symbol-name (haskell-ident-at-point)))
 
(let ((symbol-name (haskell-ident-at-point)))
Line 37: Line 38:
 
;; a web Hoogle, use the local Hoogle, otherwise use the web Hoogle.
 
;; a web Hoogle, use the local Hoogle, otherwise use the web Hoogle.
 
(if (and (fboundp 'executable-find)
 
(if (and (fboundp 'executable-find)
(executable-find "hoogle")
+
(executable-find hoogle-local-command)
 
(not hoogle-always-use-web))
 
(not hoogle-always-use-web))
 
(let ((b (get-buffer-create "*Hoogle output*")))
 
(let ((b (get-buffer-create "*Hoogle output*")))
Line 46: Line 47:
 
(browse-url (concat hoogle-url-base symbol-name)))))
 
(browse-url (concat hoogle-url-base symbol-name)))))
   
(provide 'hoogle)</pre>
+
(provide 'hoogle)
  +
</pre-lisp>

Revision as of 20:48, 2 March 2007

An Emacs Lisp library to integrate Hoogle with Emacs. The documentation is mostly the docstring of the hoogle-lookup function.

<pre-lisp>

This code comes from hyperclim.el and was originally written by
Andy Hefner (andy.hefner@verizon.net)
modified for Hoogle -- clemens@endorphin.org
Improved by David House <dmhouse@gmail.com> - Mar 07

(require 'browse-url) (eval-when-compile (require 'cl))

(defvar hoogle-url-base "http://haskell.org/hoogle/?q="

 "The base for the URL that will be used for web Hoogle lookups.")

(defvar hoogle-local-command "hoogle"

 "The name of the executable used for Hoogle. If this isn't

found in $PATH (using `executable-find'), then a web lookup is used.") (defvar hoogle-always-use-web nil

 "Set to non-nil to always use web lookups.")

(defvar hoogle-history nil

 "The history of what you've Hoogled for.")

(defun hoogle-lookup (p)

 "Lookup the identifier at point in Hoogle. If we can't find an

identifier at the point, or with a prefix arg of 1, prompts for a name to look up. If we can find a Hoogle in the $PATH (using `executable-find' on `hoogle-local-command'), it will be used, unless `hoogle-always-use-web' is non-nil. For web Hoogling, the name is appended to `hoogle-url-base' and `browse-url' is invoked."

 (interactive "p")
 (let ((symbol-name (haskell-ident-at-point)))
   ;; Read a name to lookup from the minibuffer if we couldn't find one in the
   ;; file.
   (unless (and (= 1 p) (stringp symbol-name))
     (setq symbol-name 
           (read-from-minibuffer 
            "Hoogle lookup name: " "" nil nil 'hoogle-history)))
   ;; If we can find a local Hoogle, and the user hasn't told us to always use
   ;; a web Hoogle, use the local Hoogle, otherwise use the web Hoogle.
   (if (and (fboundp 'executable-find)
            (executable-find hoogle-local-command)
            (not hoogle-always-use-web))
       (let ((b (get-buffer-create "*Hoogle output*")))
         (shell-command (concat "hoogle " symbol-name) b)
         (with-current-buffer b 
           (toggle-read-only)
           (set-buffer-modified-p nil)))
     (browse-url (concat hoogle-url-base symbol-name)))))

(provide 'hoogle) </pre-lisp>