209 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
		
		
			
		
	
	
			209 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
| 
								 | 
							
								;;; fuel-help.el -- accessing Factor's help system
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								;; Copyright (C) 2008 Jose Antonio Ortega Ruiz
							 | 
						|||
| 
								 | 
							
								;; See http://factorcode.org/license.txt for BSD license.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
							 | 
						|||
| 
								 | 
							
								;; Keywords: languages, fuel, factor
							 | 
						|||
| 
								 | 
							
								;; Start date: Wed Dec 03, 2008 21:41
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								;;; Comentary:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								;; Modes and functions interfacing Factor's 'see' and 'help'
							 | 
						|||
| 
								 | 
							
								;; utilities, as well as an ElDoc-based autodoc mode.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								;;; Code:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(require 'fuel-base)
							 | 
						|||
| 
								 | 
							
								(require 'fuel-font-lock)
							 | 
						|||
| 
								 | 
							
								(require 'fuel-eval)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								;;; Customization:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defgroup fuel-help nil
							 | 
						|||
| 
								 | 
							
								  "Options controlling FUEL's help system"
							 | 
						|||
| 
								 | 
							
								  :group 'fuel)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defcustom fuel-help-minibuffer-font-lock t
							 | 
						|||
| 
								 | 
							
								  "Whether to use font lock for info messages in the minibuffer."
							 | 
						|||
| 
								 | 
							
								  :group 'fuel-help
							 | 
						|||
| 
								 | 
							
								  :type 'boolean)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defcustom fuel-help-always-ask t
							 | 
						|||
| 
								 | 
							
								  "When enabled, always ask for confirmation in help prompts."
							 | 
						|||
| 
								 | 
							
								  :type 'boolean
							 | 
						|||
| 
								 | 
							
								  :group 'fuel-help)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defcustom fuel-help-use-minibuffer t
							 | 
						|||
| 
								 | 
							
								  "When enabled, use the minibuffer for short help messages."
							 | 
						|||
| 
								 | 
							
								  :type 'boolean
							 | 
						|||
| 
								 | 
							
								  :group 'fuel-help)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defcustom fuel-help-mode-hook nil
							 | 
						|||
| 
								 | 
							
								  "Hook run by `factor-help-mode'."
							 | 
						|||
| 
								 | 
							
								  :type 'hook
							 | 
						|||
| 
								 | 
							
								  :group 'fuel-help)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defface fuel-help-font-lock-headlines '((t (:bold t :weight bold)))
							 | 
						|||
| 
								 | 
							
								  "Face for headlines in help buffers."
							 | 
						|||
| 
								 | 
							
								  :group 'fuel-help
							 | 
						|||
| 
								 | 
							
								  :group 'faces)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								;;; Autodoc mode:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defvar fuel-help--font-lock-buffer
							 | 
						|||
| 
								 | 
							
								  (let ((buffer (get-buffer-create " *fuel help minibuffer messages*")))
							 | 
						|||
| 
								 | 
							
								    (set-buffer buffer)
							 | 
						|||
| 
								 | 
							
								    (fuel-font-lock--font-lock-setup)
							 | 
						|||
| 
								 | 
							
								    buffer))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defun fuel-help--font-lock-str (str)
							 | 
						|||
| 
								 | 
							
								  (set-buffer fuel-help--font-lock-buffer)
							 | 
						|||
| 
								 | 
							
								  (erase-buffer)
							 | 
						|||
| 
								 | 
							
								  (insert str)
							 | 
						|||
| 
								 | 
							
								  (let ((font-lock-verbose nil)) (font-lock-fontify-buffer))
							 | 
						|||
| 
								 | 
							
								  (buffer-string))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defun fuel-help--word-synopsis (&optional word)
							 | 
						|||
| 
								 | 
							
								  (let ((word (or word (fuel-syntax-symbol-at-point)))
							 | 
						|||
| 
								 | 
							
								        (fuel-eval--log nil))
							 | 
						|||
| 
								 | 
							
								    (when word
							 | 
						|||
| 
								 | 
							
								      (let ((ret (fuel-eval--eval-string/context
							 | 
						|||
| 
								 | 
							
								                  (format "\\ %s synopsis fuel-eval-set-result" word))))
							 | 
						|||
| 
								 | 
							
								        (when (not (fuel-eval--retort-error ret))
							 | 
						|||
| 
								 | 
							
								          (if fuel-help-minibuffer-font-lock
							 | 
						|||
| 
								 | 
							
								              (fuel-help--font-lock-str (fuel-eval--retort-result ret))
							 | 
						|||
| 
								 | 
							
								            (fuel-eval--retort-result ret)))))))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(make-variable-buffer-local
							 | 
						|||
| 
								 | 
							
								 (defvar fuel-autodoc-mode-string " A"
							 | 
						|||
| 
								 | 
							
								   "Modeline indicator for fuel-autodoc-mode"))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(define-minor-mode fuel-autodoc-mode
							 | 
						|||
| 
								 | 
							
								  "Toggle Fuel's Autodoc mode.
							 | 
						|||
| 
								 | 
							
								With no argument, this command toggles the mode.
							 | 
						|||
| 
								 | 
							
								Non-null prefix argument turns on the mode.
							 | 
						|||
| 
								 | 
							
								Null prefix argument turns off the mode.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								When Autodoc mode is enabled, a synopsis of the word at point is
							 | 
						|||
| 
								 | 
							
								displayed in the minibuffer."
							 | 
						|||
| 
								 | 
							
								  :init-value nil
							 | 
						|||
| 
								 | 
							
								  :lighter fuel-autodoc-mode-string
							 | 
						|||
| 
								 | 
							
								  :group 'fuel
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  (set (make-local-variable 'eldoc-documentation-function)
							 | 
						|||
| 
								 | 
							
								       (when fuel-autodoc-mode 'fuel-help--word-synopsis))
							 | 
						|||
| 
								 | 
							
								  (set (make-local-variable 'eldoc-minor-mode-string) nil)
							 | 
						|||
| 
								 | 
							
								  (eldoc-mode fuel-autodoc-mode)
							 | 
						|||
| 
								 | 
							
								  (message "Fuel Autodoc %s" (if fuel-autodoc-mode "enabled" "disabled")))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								;;;; Factor help mode:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defvar fuel-help-mode-map (make-sparse-keymap)
							 | 
						|||
| 
								 | 
							
								  "Keymap for Factor help mode.")
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(define-key fuel-help-mode-map [(return)] 'fuel-help)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defconst fuel-help--headlines
							 | 
						|||
| 
								 | 
							
								  (regexp-opt '("Class description"
							 | 
						|||
| 
								 | 
							
								                "Definition"
							 | 
						|||
| 
								 | 
							
								                "Examples"
							 | 
						|||
| 
								 | 
							
								                "Generic word contract"
							 | 
						|||
| 
								 | 
							
								                "Inputs and outputs"
							 | 
						|||
| 
								 | 
							
								                "Methods"
							 | 
						|||
| 
								 | 
							
								                "Notes"
							 | 
						|||
| 
								 | 
							
								                "Parent topics:"
							 | 
						|||
| 
								 | 
							
								                "See also"
							 | 
						|||
| 
								 | 
							
								                "Syntax"
							 | 
						|||
| 
								 | 
							
								                "Vocabulary"
							 | 
						|||
| 
								 | 
							
								                "Warning"
							 | 
						|||
| 
								 | 
							
								                "Word description")
							 | 
						|||
| 
								 | 
							
								              t))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defconst fuel-help--headlines-regexp (format "^%s" fuel-help--headlines))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defconst fuel-help--font-lock-keywords
							 | 
						|||
| 
								 | 
							
								  `(,@fuel-font-lock--font-lock-keywords
							 | 
						|||
| 
								 | 
							
								    (,fuel-help--headlines-regexp . 'fuel-help-font-lock-headlines)))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defun fuel-help-mode ()
							 | 
						|||
| 
								 | 
							
								  "Major mode for displaying Factor documentation.
							 | 
						|||
| 
								 | 
							
								\\{fuel-help-mode-map}"
							 | 
						|||
| 
								 | 
							
								  (interactive)
							 | 
						|||
| 
								 | 
							
								  (kill-all-local-variables)
							 | 
						|||
| 
								 | 
							
								  (use-local-map fuel-help-mode-map)
							 | 
						|||
| 
								 | 
							
								  (setq mode-name "Factor Help")
							 | 
						|||
| 
								 | 
							
								  (setq major-mode 'fuel-help-mode)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  (fuel-font-lock--font-lock-setup fuel-help--font-lock-keywords t)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  (set (make-local-variable 'view-no-disable-on-exit) t)
							 | 
						|||
| 
								 | 
							
								  (view-mode)
							 | 
						|||
| 
								 | 
							
								  (setq view-exit-action
							 | 
						|||
| 
								 | 
							
								        (lambda (buffer)
							 | 
						|||
| 
								 | 
							
								          ;; Use `with-current-buffer' to make sure that `bury-buffer'
							 | 
						|||
| 
								 | 
							
								          ;; also removes BUFFER from the selected window.
							 | 
						|||
| 
								 | 
							
								          (with-current-buffer buffer
							 | 
						|||
| 
								 | 
							
								            (bury-buffer))))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  (setq fuel-autodoc-mode-string "")
							 | 
						|||
| 
								 | 
							
								  (fuel-autodoc-mode)
							 | 
						|||
| 
								 | 
							
								  (run-mode-hooks 'fuel-help-mode-hook))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defun fuel-help--help-buffer ()
							 | 
						|||
| 
								 | 
							
								  (with-current-buffer (get-buffer-create "*fuel-help*")
							 | 
						|||
| 
								 | 
							
								    (fuel-help-mode)
							 | 
						|||
| 
								 | 
							
								    (current-buffer)))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defvar fuel-help--history nil)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defun fuel-help--show-help (&optional see)
							 | 
						|||
| 
								 | 
							
								  (let* ((def (fuel-syntax-symbol-at-point))
							 | 
						|||
| 
								 | 
							
								         (prompt (format "See%s help on%s: " (if see " short" "")
							 | 
						|||
| 
								 | 
							
								                         (if def (format " (%s)" def) "")))
							 | 
						|||
| 
								 | 
							
								         (ask (or (not (memq major-mode '(factor-mode fuel-help-mode)))
							 | 
						|||
| 
								 | 
							
								                  (not def)
							 | 
						|||
| 
								 | 
							
								                  fuel-help-always-ask))
							 | 
						|||
| 
								 | 
							
								         (def (if ask (read-string prompt nil 'fuel-help--history def) def))
							 | 
						|||
| 
								 | 
							
								         (cmd (format "\\ %s %s" def (if see "see" "help")))
							 | 
						|||
| 
								 | 
							
								         (fuel-eval--log nil)
							 | 
						|||
| 
								 | 
							
								         (ret (fuel-eval--eval-string/context cmd))
							 | 
						|||
| 
								 | 
							
								         (out (fuel-eval--retort-output ret)))
							 | 
						|||
| 
								 | 
							
								    (if (or (fuel-eval--retort-error ret) (empty-string-p out))
							 | 
						|||
| 
								 | 
							
								        (message "No help for '%s'" def)
							 | 
						|||
| 
								 | 
							
								      (let ((hb (fuel-help--help-buffer))
							 | 
						|||
| 
								 | 
							
								            (inhibit-read-only t)
							 | 
						|||
| 
								 | 
							
								            (font-lock-verbose nil))
							 | 
						|||
| 
								 | 
							
								        (set-buffer hb)
							 | 
						|||
| 
								 | 
							
								        (erase-buffer)
							 | 
						|||
| 
								 | 
							
								        (insert out)
							 | 
						|||
| 
								 | 
							
								        (set-buffer-modified-p nil)
							 | 
						|||
| 
								 | 
							
								        (pop-to-buffer hb)
							 | 
						|||
| 
								 | 
							
								        (goto-char (point-min))))))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								;;; Interface: see/help commands
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defun fuel-help-short (&optional arg)
							 | 
						|||
| 
								 | 
							
								  "See a help summary of symbol at point.
							 | 
						|||
| 
								 | 
							
								By default, the information is shown in the minibuffer. When
							 | 
						|||
| 
								 | 
							
								called with a prefix argument, the information is displayed in a
							 | 
						|||
| 
								 | 
							
								separate help buffer."
							 | 
						|||
| 
								 | 
							
								  (interactive "P")
							 | 
						|||
| 
								 | 
							
								  (if (if fuel-help-use-minibuffer (not arg) arg)
							 | 
						|||
| 
								 | 
							
								      (fuel-help--word-synopsis)
							 | 
						|||
| 
								 | 
							
								    (fuel-help--show-help t)))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(defun fuel-help ()
							 | 
						|||
| 
								 | 
							
								  "Show extended help about the symbol at point, using a help
							 | 
						|||
| 
								 | 
							
								buffer."
							 | 
						|||
| 
								 | 
							
								  (interactive)
							 | 
						|||
| 
								 | 
							
								  (fuel-help--show-help))
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								(provide 'fuel-help)
							 | 
						|||
| 
								 | 
							
								;;; fuel-help.el ends here
							 |