diff options
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-hoogle.el')
-rw-r--r-- | configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-hoogle.el | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-hoogle.el b/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-hoogle.el new file mode 100644 index 000000000000..62aaaaad7a3a --- /dev/null +++ b/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-hoogle.el @@ -0,0 +1,151 @@ +;;; 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 "http://haskell.org/hoogle/?q=%s" + "Default value for hoogle web site." + :group 'haskell + :type '(choice + (const :tag "haskell-org" "http://haskell.org/hoogle/?q=%s") + (const :tag "fp-complete" "https://www.stackage.org/lts/hoogle?q=%s") + (const :tag "hayoo" "http://hayoo.fh-wedel.de/?query=%s") + string)) + +;;;###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) + (if (executable-find "hoogle") + (unless (haskell-hoogle-server-live-p) + (set 'haskell-hoogle-server-process + (start-process + haskell-hoogle-server-process-name + (get-buffer-create haskell-hoogle-server-buffer-name) + "hoogle" "server" "-p" (number-to-string haskell-hoogle-port-number)))) + (error "\"hoogle\" executable not found"))) + +(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 |