|
|
- ;;; haskell-hoogle.el --- Look up Haskell documentation via hoogle or hayoo -*- lexical-binding: t; -*-
-
- ;; Copyright © 2015 Steve Purcell
- ;; 2016 Arthur Fayzrakhmanov
-
- ;; Author: Steve Purcell <steve@sanityinc.com>
- ;; Keywords: docs
-
- ;; This program is free software; you can redistribute it and/or modify
- ;; it under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation, either version 3 of the License, or
- ;; (at your option) any later version.
-
- ;; This program is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;; GNU General Public License for more details.
-
- ;; You should have received a copy of the GNU General Public License
- ;; along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- ;;; Commentary:
-
- ;; Functions for looking up documentation with hayoo or hoogle, via
- ;; either local or remote servers.
-
- ;;; Code:
-
- (require 'ansi-color)
- (require 'haskell-mode)
- (require 'haskell-utils)
-
-
- (defcustom haskell-hoogle-command
- (if (executable-find "hoogle") "hoogle")
- "Name of the command to use to query Hoogle.
- If nil, use the Hoogle web-site."
- :group 'haskell
- :type '(choice (const :tag "Use Web-site" nil)
- string))
-
- (defcustom haskell-hoogle-url "https://hoogle.haskell.org/?hoogle=%s"
- "Default value for hoogle web site."
- :group 'haskell
- :type '(choice
- (const :tag "haskell-org" "https://hoogle.haskell.org/?hoogle=%s")
- (const :tag "fp-complete" "https://www.stackage.org/lts/hoogle?q=%s")
- (const :tag "hayoo" "http://hayoo.fh-wedel.de/?query=%s")
- string))
-
- (defcustom haskell-hoogle-server-command (lambda (port)
- (list "hoogle" "server"
- "--local"
- "-p"
- (number-to-string port)))
- "Command used to start the local hoogle server."
- :group 'haskell
- :type 'function
- )
-
- ;;;###autoload
- (defun haskell-hoogle (query &optional info)
- "Do a Hoogle search for QUERY.
- When `haskell-hoogle-command' is non-nil, this command runs
- that. Otherwise, it opens a hoogle search result in the browser.
-
- If prefix argument INFO is given, then `haskell-hoogle-command'
- is asked to show extra info for the items matching QUERY.."
- (interactive
- (let ((def (haskell-ident-at-point)))
- (if (and def (symbolp def)) (setq def (symbol-name def)))
- (list (read-string (if def
- (format "Hoogle query (default %s): " def)
- "Hoogle query: ")
- nil nil def)
- current-prefix-arg)))
- (if (null haskell-hoogle-command)
- (browse-url (format haskell-hoogle-url (url-hexify-string query)))
- (let ((command (concat haskell-hoogle-command
- (if info " -i " "")
- " --color " (shell-quote-argument query))))
- (with-help-window "*hoogle*"
- (with-current-buffer standard-output
- (insert (shell-command-to-string command))
- (ansi-color-apply-on-region (point-min) (point-max)))))))
-
- ;;;###autoload
- (defalias 'hoogle 'haskell-hoogle)
-
- (defvar haskell-hoogle-server-process-name "emacs-local-hoogle")
- (defvar haskell-hoogle-server-buffer-name (format "*%s*" haskell-hoogle-server-process-name))
- (defvar haskell-hoogle-port-number 49513 "Port number.")
- (defvar haskell-hoogle-server-process nil "The process handle of the local hoogle server.")
-
- (defun haskell-hoogle-start-server ()
- "Start hoogle local server."
- (interactive)
- (unless (haskell-hoogle-server-live-p)
- (set 'haskell-hoogle-server-process
- (apply 'start-process
- (append (list haskell-hoogle-server-process-name
- (get-buffer-create haskell-hoogle-server-buffer-name))
- (funcall haskell-hoogle-server-command haskell-hoogle-port-number))))
- )
- )
-
- (defun haskell-hoogle-server-live-p ()
- "Whether the hoogle server process is live."
- (condition-case _err
- (process-live-p haskell-hoogle-server-process)
- (error nil)))
-
- (defun haskell-hoogle-kill-server ()
- "Kill the hoogle server if it is live."
- (interactive)
- (when (haskell-hoogle-server-live-p)
- (kill-process (get-buffer-create haskell-hoogle-server-buffer-name))
- (set 'haskell-hoogle-server-process nil)))
-
- ;;;###autoload
- (defun haskell-hoogle-lookup-from-local ()
- "Lookup by local hoogle."
- (interactive)
- (if (haskell-hoogle-server-live-p)
- (browse-url (format "http://localhost:%i/?hoogle=%s"
- haskell-hoogle-port-number
- (read-string "hoogle: " (haskell-ident-at-point))))
- (haskell-mode-toggle-interactive-prompt-state)
- (unwind-protect
- (when (y-or-n-p "Hoogle server not running, start hoogle server? ")
- (haskell-hoogle-start-server))
- (haskell-mode-toggle-interactive-prompt-state t))))
-
-
- (defcustom haskell-hayoo-url "http://hayoo.fh-wedel.de/?query=%s"
- "Default value for hayoo web site."
- :group 'haskell
- :type '(choice
- (const :tag "fh-wedel.de" "http://hayoo.fh-wedel.de/?query=%s")
- string))
-
- ;;;###autoload
- (defun haskell-hayoo (query)
- "Do a Hayoo search for QUERY."
- (interactive
- (let ((def (haskell-ident-at-point)))
- (if (and def (symbolp def)) (setq def (symbol-name def)))
- (list (read-string (if def
- (format "Hayoo query (default %s): " def)
- "Hayoo query: ")
- nil nil def))))
- (browse-url (format haskell-hayoo-url (url-hexify-string query))))
-
- ;;;###autoload
- (defalias 'hayoo 'haskell-hayoo)
-
-
-
-
- (provide 'haskell-hoogle)
- ;;; haskell-hoogle.el ends here
|