branch: externals/idlwave
commit c046796a643e9a1c8cdef10be171bcfb01c1fd61
Author: jdsmith <jdsmith>
Commit: jdsmith <jdsmith>
Removed in favor of the help code being present in idlw-help.el, and
the topics getting integrated in at make install-help time. All this
code is now a part of idlw-help.el
---
helpcode | 1254 --------------------------------------------------------------
1 file changed, 1254 deletions(-)
diff --git a/helpcode b/helpcode
deleted file mode 100644
index cd4cb79f5c..0000000000
--- a/helpcode
+++ /dev/null
@@ -1,1254 +0,0 @@
-;;;;;;00 -*- mode: emacs-lisp -*-
-;;;;;;00--------------------------------------------------------------------
-;;;;;;00 This code implements most of the online help feature of IDLWAVE.
-;;;;;;00 Do not use the file directly. The progam "get_rinfo"
-;;;;;;00 incorporates this file into idlw-help.el.
-;;;;;;00--------------------------------------------------------------------
-
-(defvar idlwave-completion-help-info)
-(defvar idlwave-help-use-dedicated-frame)
-(defvar idlwave-help-frame-parameters)
-
-(defvar idlwave-help-frame nil
- "The frame for display of IDL online help.")
-(defvar idlwave-help-frame-width 102
- "The default width of the help frame.")
-
-(defvar idlwave-help-file nil
- "The file containing the ASCII help for IDLWAVE.")
-
-(defvar idlwave-help-topics nil
- "List of helptopics and byte positions in `idlw-help.txt'.")
-
-(defvar idlwave-help-current-topic nil
- "The topic currently loaded into the IDLWAVE Help buffer.")
-
-(defvar idlwave-help-mode-line-indicator ""
- "Used for the special mode line in the idlwave-help-mode.")
-
-(defvar idlwave-help-window-configuration nil)
-(defvar idlwave-help-name-translations nil) ; defined by get_rinfo
-(defvar idlwave-help-alt-names nil) ; defined by get_rinfo
-(defvar idlwave-help-special-topic-words) ; defined by get_rinfo
-
-(defvar idlwave-help-stack-back nil
- "Help topic stack for backwards motion.")
-(defvar idlwave-help-stack-forward nil
- "Help topic stack for forward motion.
-Only gets populated when moving back.")
-
-;; Define the key bindings for the Help application
-
-(defvar idlwave-help-mode-map (make-sparse-keymap)
- "The keymap used in idlwave-help-mode.")
-
-(define-key idlwave-help-mode-map "q" 'idlwave-help-quit)
-(define-key idlwave-help-mode-map "w" 'widen)
-(define-key idlwave-help-mode-map "\C-m" (lambda (arg)
- (interactive "p")
- (scroll-up arg)))
-(define-key idlwave-help-mode-map "n" 'idlwave-help-next-topic)
-(define-key idlwave-help-mode-map "p" 'idlwave-help-previous-topic)
-(define-key idlwave-help-mode-map " " 'scroll-up)
-(define-key idlwave-help-mode-map [delete] 'scroll-down)
-(define-key idlwave-help-mode-map "b" 'idlwave-help-back)
-(define-key idlwave-help-mode-map "f" 'idlwave-help-forward)
-(define-key idlwave-help-mode-map "c" 'idlwave-help-clear-history)
-(define-key idlwave-help-mode-map "o" 'idlwave-online-help)
-(define-key idlwave-help-mode-map "*" 'idlwave-help-load-entire-file)
-(define-key idlwave-help-mode-map "h" 'idlwave-help-find-header)
-(define-key idlwave-help-mode-map "H" 'idlwave-help-find-first-header)
-(define-key idlwave-help-mode-map "L" 'idlwave-help-activate-aggressively)
-(define-key idlwave-help-mode-map "."
'idlwave-help-toggle-header-match-and-def)
-(define-key idlwave-help-mode-map "F" 'idlwave-help-fontify)
-(define-key idlwave-help-mode-map "\M-?" 'idlwave-help-return-to-calling-frame)
-(define-key idlwave-help-mode-map "x" 'idlwave-help-return-to-calling-frame)
-
-;; Define the menu for the Help application
-
-(easy-menu-define
- idlwave-help-menu idlwave-help-mode-map
- "Menu for Help IDLWAVE system"
- '("IDLHelp"
- ["Open topic" idlwave-online-help t]
- ["History: Backward" idlwave-help-back t]
- ["History: Forward" idlwave-help-forward t]
- ["History: Clear" idlwave-help-clear-history t]
- "---"
- ["Follow Link" idlwave-help-follow-link (not idlwave-help-is-source)]
- ["Browse: Next Topic" idlwave-help-next-topic (not idlwave-help-is-source)]
- ["Browse: Previous Topic" idlwave-help-previous-topic
- (not idlwave-help-is-source)]
- ["Load Entire Help File" idlwave-help-load-entire-file t]
- "---"
- ["Definition <-> Help Text" idlwave-help-toggle-header-match-and-def
- idlwave-help-is-source]
- ["Find DocLib Header" idlwave-help-find-header idlwave-help-is-source]
- ["Find First DocLib Header" idlwave-help-find-first-header
- idlwave-help-is-source]
- ["Fontify help buffer" idlwave-help-fontify idlwave-help-is-source]
- "--"
- ["Quit" idlwave-help-quit t]))
-
-(defun idlwave-help-mode ()
- "Major mode for displaying IDL Help.
-
-This is a VIEW mode for the ASCII version of IDL Help files,
-with some extras. Its main purpose is speed - so don't
-expect a fully hyper-linked help.
-
-Scrolling: SPC DEL RET
-Topic Histrory: [b]ackward [f]orward
-Topic Browsing: [n]ext [p]revious
-Choose new Topic: [o]pen
-Follow Link: Mouse button 2 finds help on word at point
-Text Searches: Inside Topic: Use Emacs search functions
- Global: Press `*' to load entire help file
-Exit: [q]uit or mouse button 3 will kill the frame
-
-When the hep text is a source file, the following commands are available
-
-Fontification: [F]ontify the buffer like source code
-Jump: [h] to function doclib header
- [H] to file doclib header
- [.] back and forward between header and definition
-
-Here are all keybindings.
-\\{idlwave-help-mode-map}"
- (kill-all-local-variables)
- (buffer-disable-undo)
- (setq major-mode 'idlwave-help-mode
- mode-name "IDLWAVE Help")
- (use-local-map idlwave-help-mode-map)
- (easy-menu-add idlwave-help-menu idlwave-help-mode-map)
- (setq truncate-lines t)
- (setq case-fold-search t)
- (setq mode-line-format
- (list ""
- 'mode-line-modified
- 'mode-line-buffer-identification
- ": " 'idlwave-help-mode-line-indicator
- " -%-"))
- (setq buffer-read-only t)
- (set (make-local-variable 'idlwave-help-def-pos) nil)
- (set (make-local-variable 'idlwave-help-args) nil)
- (set (make-local-variable 'idlwave-help-in-header) nil)
- (set (make-local-variable 'idlwave-help-is-source) nil)
- (run-hooks 'idlwave-help-mode-hook))
-
-(defvar idlwave-current-obj_new-class)
-(defvar idlwave-help-diagnostics)
-(defvar idlwave-experimental)
-(defvar idlwave-last-context-help-pos)
-(defun idlwave-do-context-help (&optional arg)
- "Wrapper around the call to idlwave-context-help1.
-It collects and pronts the diagnostics messages."
- (let ((marker (list (current-buffer) (point)))
- (idlwave-help-diagnostics nil))
- ;; Check for frame switching. When the command is invoked twice
- ;; at the same position, we try to switch to the help frame
- ;; FIXME: Frame switching works only on XEmacs
- (if (and idlwave-experimental
- (equal last-command this-command)
- (equal idlwave-last-context-help-pos marker))
- (idlwave-help-select-help-frame)
- ;; Do the real thing.
- (setq idlwave-last-context-help-pos marker)
- (idlwave-do-context-help1 arg)
- (if idlwave-help-diagnostics
- (message "%s" (mapconcat 'identity
- (nreverse idlwave-help-diagnostics)
- "; "))))))
-
-
-(defun idlwave-do-context-help1 (&optional arg)
- "The work-horse version of `idlwave-context-help', which see."
- (save-excursion
- (if (equal (char-after) ?/)
- (forward-char 1)
- (if (equal (char-before) ?=)
- (backward-char 1)))
- (let* ((idlwave-query-class nil)
- (idlwave-force-class-query (equal arg '(4)))
- (chars "a-zA-Z0-9_$.!")
- (beg (save-excursion (skip-chars-backward chars) (point)))
- (end (save-excursion (skip-chars-forward chars) (point)))
- (this-word (buffer-substring beg end))
- (st-ass (assoc (downcase this-word)
idlwave-help-special-topic-words))
- module keyword cw mod1 mod2 mod3)
- (if (or arg
- (and (not (member (string-to-char this-word) '(?! ?.)))
- (not st-ass)))
- ;; Need the module information
- (progn
- (setq module (idlwave-what-module-find-class)
- cw (nth 2 (idlwave-where)))
- ;; Correct for OBJ_NEW, we may need an INIT method instead.
- (if (equal (idlwave-downcase-safe (car module)) "obj_new")
- (let* ((bos (save-excursion (idlwave-beginning-of-statement)
- (point)))
- (str (buffer-substring bos (point))))
- (if (string-match "OBJ_NEW([
\t]*['\"]\\([a-zA-Z][a-zA-Z0-9$_]+\\)['\"]"
- str)
- (setq module (list "init" 'fun (match-string 1 str))
- idlwave-current-obj_new-class (match-string 1 str))
- )))))
- (cond (arg (setq mod1 module))
- (st-ass (setq mod1 (list (or (cdr st-ass) (car st-ass))
- nil nil nil)))
- ((string-match "\\`![a-zA-Z0-9_]+" this-word)
- ;; A system variable
- (setq mod1 (list "system variables" nil nil
- (match-string 0 this-word))))
- ((string-match "^\\." this-word)
- ;; An executive command
- (setq mod1 (list this-word nil nil nil)))
- ((and (eq cw 'class)
- (or (idlwave-in-quote) ; e.g. obj_new
- (re-search-backward "\\<inherits[ \t]+[A-Za-z0-9_]*\\="
- (max (point-min) (- (point) 40)) t))
- )
- ;; Class completion insite string delimiters should be
- ;; the class inside OBJ_NEW.
- ;; FIXME: Do we really need the in-quotes restriction?
- ;; This is why it does not work after INHERITS.
- (setq mod1 (list nil nil this-word nil)))
- ((and (memq cw '(function-keyword procedure-keyword))
- (stringp this-word)
- (string-match "\\S-" this-word)
- (not (string-match "!" this-word)))
- (cond ((or (= (char-before beg) ?/)
- (save-excursion (goto-char end)
- (looking-at "[ \t]*=")))
- ;; Certainly a keyword. Check for abbreviation etc.
- (setq keyword (idlwave-expand-keyword this-word module))
- (cond
- ((null keyword)
- (idlwave-help-diagnostics
- (format "%s does not accept `%s' kwd"
- (idlwave-make-full-name (nth 2 module)
- (car module))
- (upcase this-word))
- 'ding))
- ((consp keyword)
- (idlwave-help-diagnostics
- (format "%d matches for kwd abbrev `%s'"
- (length keyword) this-word)
- 'ding)
- ;; We continue anyway with the first match...
- (setq keyword (car keyword))))
- (setq mod1 (append module (list keyword)))
- (setq mod2 module))
- ((equal (char-after end) ?\()
- ;; A function - what-module will have caught this
- (setq mod1 module))
- (t
- ;; undecided - try function, keyword, then enclosing mod.
- ;; Check for keyword abbreviations, but do not report
- ;; errors, because it might something else.
- ;; FIXME: is this a good way to handle this?
- (setq keyword (idlwave-expand-keyword this-word module))
- (if (consp keyword) (setq keyword (car keyword)))
- (setq mod1 (append module (list keyword))
- mod2 (list this-word 'fun nil)
- mod3 module))))
- (t
- (setq mod1 module)))
- (if mod3
- (condition-case nil
- (apply 'idlwave-online-help nil mod1)
- (error (condition-case nil
- (apply 'idlwave-online-help nil mod2)
- (error (apply 'idlwave-online-help nil mod3)))))
- (if mod2
- (condition-case nil
- (apply 'idlwave-online-help nil mod1)
- (error (apply 'idlwave-online-help nil mod2)))
- (if mod1
- (apply 'idlwave-online-help nil mod1)
- (error "Don't know which routine to show help for.")))))))
-
-(defvar idlwave-extra-help-function)
-(defun idlwave-do-mouse-completion-help (ev)
- "Display online help on n item in the *Completions* buffer.
-Need additional info stored in `idlwave-completion-help-info'."
- (let* ((cw (selected-window))
- (info idlwave-completion-help-info)
- (what (nth 0 info))
- (name (nth 1 info))
- (type (nth 2 info))
- (class (nth 3 info))
- (need-class class)
- (kwd (nth 4 info))
- (sclasses (nth 5 info))
- word)
- (mouse-set-point ev)
- (setq word (idlwave-this-word))
- (select-window cw)
- (cond ((memq what '(procedure function routine))
- (setq name word)
- (if (or (eq class t)
- (and (stringp class) sclasses))
- (let* ((classes (idlwave-all-method-classes
- (idlwave-sintern-method name)
- type)))
- (if sclasses
- (setq classes (idlwave-members-only
- classes (cons class sclasses))))
- (if (not idlwave-extra-help-function)
- (setq classes (idlwave-grep-help-topics classes)))
- (setq class (idlwave-popup-select ev classes
- "Select Class" 'sort))))
- (if (stringp class)
- (setq class (idlwave-find-inherited-class
- (idlwave-sintern-routine-or-method name class)
- type (idlwave-sintern-class class)))))
- ((eq what 'keyword)
- (setq kwd word)
- (if (or (eq class t)
- (and (stringp class) sclasses))
- (let ((classes (idlwave-all-method-keyword-classes
- (idlwave-sintern-method name)
- (idlwave-sintern-keyword kwd)
- type)))
- (if sclasses
- (setq classes (idlwave-members-only
- classes (cons class sclasses))))
- (if (not idlwave-extra-help-function)
- (setq classes (idlwave-grep-help-topics classes)))
- (setq class (idlwave-popup-select ev classes
- "Select Class" 'sort))))
- (if (stringp class)
- (setq class (idlwave-find-inherited-class
- (idlwave-sintern-routine-or-method name class)
- type (idlwave-sintern-class class)))))
- ((eq what 'class)
- (setq class word))
- ((and (symbolp what) ;; FIXME: document this.
- (fboundp what))
- (funcall what 'set word))
- (t (error "Cannot help with this item")))
- (if (and need-class (not class))
- (error "Cannot help with this item"))
- (idlwave-online-help nil name type class kwd)))
-
-(defvar idlwave-highlight-help-links-in-completion)
-(defun idlwave-highlight-linked-completions ()
- "Highlight all completions for which help is available.
-`idlwave-help-link-face' is used for this."
- (if idlwave-highlight-help-links-in-completion
- (save-excursion
- (set-buffer (get-buffer "*Completions*"))
- (save-excursion
- (let* ((case-fold-search t)
- (props (list 'face 'idlwave-help-link-face))
- (info idlwave-completion-help-info)
- (what (nth 0 info))
- (name (nth 1 info))
- (type (nth 2 info))
- (class (nth 3 info))
- ;; (kwd (nth 4 info))
- (sclasses (nth 5 info))
- (kwd-doit
- (and (eq what 'keyword)
- (if (equal (idlwave-downcase-safe name) "obj_new")
- (idlwave-is-help-topic
- (idlwave-make-full-name
- idlwave-current-obj_new-class "Init"))
- (idlwave-is-help-topic
- (idlwave-make-full-name class name)))))
- word beg end doit)
- (goto-char (point-min))
- (re-search-forward "possible completions are:" nil t)
- (while (re-search-forward "\\s-\\([A-Za-z0-9_]+\\)\\(\\s-\\|\\'\\)"
- nil t)
- (setq beg (match-beginning 1) end (match-end 1)
- word (match-string 1) doit nil)
- (cond
- ((eq what 'class)
- (setq doit (idlwave-is-help-topic word)))
- ((memq what '(procedure function routine))
- (if (eq class t)
- (setq doit (idlwave-any-help-topic
- (idlwave-all-method-classes
- (idlwave-sintern-method word) type)))
- (if sclasses
- (setq doit (idlwave-any-help-topic
- (mapcar (lambda (x)
- (idlwave-make-full-name x word))
- (idlwave-members-only
- (idlwave-all-method-classes
- (idlwave-sintern-method word) type)
- (cons class sclasses)))))
- (setq doit (idlwave-is-help-topic
- (idlwave-make-full-name class word))))))
- ((eq what 'keyword)
- (if (eq class t)
- (setq doit (idlwave-any-help-topic
- (idlwave-all-method-classes
- (idlwave-sintern-method name) type)))
- (if sclasses
- (setq doit (idlwave-any-help-topic
- (mapcar
- (lambda (x)
- (idlwave-make-full-name x name))
- (idlwave-members-only
- (idlwave-all-method-keyword-classes
- (idlwave-sintern-method name)
- (idlwave-sintern-keyword word)
- type)
- (cons class sclasses)))))
- (setq doit kwd-doit))))
- ((and (symbolp what) ; FIXME: document this.
- (fboundp what))
- (setq doit (funcall what 'test word))))
- (if doit
- (add-text-properties beg end props))
- (goto-char end)))))))
-
-;; Arrange for this function to be called after completion
-(add-hook 'idlwave-completion-setup-hook
- 'idlwave-highlight-linked-completions)
-
-(defvar idlwave-help-return-frame nil
- "The frame to return to from the help frame.")
-
-(defun idlwave-help-quit ()
- "Exit IDLWAVE Help buffer. Kill the dedicated frame if any."
- (interactive)
- (cond ((and idlwave-help-use-dedicated-frame
- (eq (selected-frame) idlwave-help-frame))
- (if (and idlwave-experimental
- (frame-live-p idlwave-help-return-frame))
- ;; Try to select the return frame.
- ;; This can crash on slow network connections, obviously when
- ;; we kill the help frame before the return-frame is selected.
- ;; To protect the workings, we wait for up to one second
- ;; and check if the return-frame *is* now selected.
- ;; This is marked "eperimental" since we are not sure when its OK.
- (let ((maxtime 1.0) (time 0.) (step 0.1))
- (select-frame idlwave-help-return-frame)
- (while (and (sit-for step)
- (not (eq (selected-frame) idlwave-help-return-frame))
- (< (setq time (+ time step)) maxtime)))))
- (delete-frame idlwave-help-frame))
- ((window-configuration-p idlwave-help-window-configuration)
- (set-window-configuration idlwave-help-window-configuration)
- (select-window (previous-window)))
- (t (kill-buffer (idlwave-help-get-help-buffer)))))
-
-(defun idlwave-help-follow-link (ev)
- "Try the word at point as a help topic. If positive, display topic."
- (interactive "e")
- (mouse-set-point ev)
- (let* ((beg (or (previous-single-property-change (1+ (point))
- 'idlwave-help-link)
- (point-min)))
- (end (or (next-single-property-change (point) 'idlwave-help-link)
- (point-max)))
- (this-word (downcase (buffer-substring beg end)))
- (ass (assoc this-word idlwave-help-special-topic-words))
- (topic (if ass (or (cdr ass) (car ass)) this-word)))
- (cond ((idlwave-is-help-topic topic)
- (idlwave-online-help
- (idlwave-help-maybe-translate topic)))
- ((string-match "::" this-word)
- (let* ((l (split-string this-word "::"))
- (class (car l))
- (method (nth 1 l)))
- (idlwave-online-help nil method nil class)))
- (t
- (error "Cannot find help for \"%s\"" this-word)))))
-
-(defun idlwave-help-next-topic ()
- "Select next topic in the physical sequence in the Help file."
- (interactive)
- (if (stringp idlwave-help-current-topic)
- (let* ((topic (car (car (cdr (memq (assoc idlwave-help-current-topic
- idlwave-help-topics)
- idlwave-help-topics))))))
- (if topic
- (idlwave-online-help topic)
- (error "Already in last topic")))
- (error "No \"next\" topic")))
-
-(defun idlwave-help-previous-topic ()
- "Select previous topic in the physical sequence in the Help file."
- (interactive)
- (if (stringp idlwave-help-current-topic)
- (let* ((topic (car (nth (- (length idlwave-help-topics)
- (length (memq (assoc
idlwave-help-current-topic
- idlwave-help-topics)
- idlwave-help-topics))
- 1)
- idlwave-help-topics))))
- (if topic
- (idlwave-online-help topic)
- (error "Already in first topic")))
- (error "No \"previous\" topic")))
-
-(defun idlwave-help-back ()
- "Select previous topic as given by help history stack."
- (interactive)
- (if idlwave-help-stack-back
- (let* ((back idlwave-help-stack-back)
- (fwd idlwave-help-stack-forward)
- (goto (car back)))
- (setq back (cdr back))
- (setq fwd (cons (cons idlwave-help-current-topic (window-start)) fwd))
- (if (consp (car goto))
- (apply 'idlwave-online-help nil (car goto))
- (idlwave-online-help (car goto)))
- (set-window-start (selected-window) (cdr goto))
- (setq idlwave-help-stack-forward fwd
- idlwave-help-stack-back back))
- (error "Cannot go back any further in history")))
-
-(defun idlwave-help-forward ()
- "Select next topic as given by help history stack.
-Only accessible if you have walked back with `idlwave-help-back' first."
- (interactive)
- (if idlwave-help-stack-forward
- (let* ((back idlwave-help-stack-back)
- (fwd idlwave-help-stack-forward)
- (goto (car fwd)))
- (setq fwd (cdr fwd))
- (setq back (cons (cons idlwave-help-current-topic (window-start)) back))
- (if (consp (car goto))
- (apply 'idlwave-online-help nil (car goto))
- (idlwave-online-help (car goto)))
- (set-window-start (selected-window) (cdr goto))
- (setq idlwave-help-stack-forward fwd
- idlwave-help-stack-back back))
- (error "Cannot go forward any further in history")))
-
-(defun idlwave-help-clear-history ()
- "Clear the history."
- (interactive)
- (setq idlwave-help-stack-back nil
- idlwave-help-stack-forward nil))
-
-(defun idlwave-help-load-entire-file ()
- "Load the entire help file for global searches."
- (interactive)
- (let ((buffer-read-only nil))
- (idlwave-help-load-topic "***")
- (message "Entire Help file loaded")))
-
-(defun idlwave-find-help (class1 routine1 keyword1)
- "Find help corresponding to the arguments."
- (let ((search-list (idlwave-help-make-search-list class1 routine1 keyword1))
- class routine keyword topic
- entry pre-re pos-re found kwd-re
- pos-p not-first)
-
- (save-excursion
- (set-buffer (idlwave-help-get-help-buffer))
- ;; Loop over all possible search compinations
- (while (and (not found)
- (setq entry (car search-list)))
- (setq search-list (cdr search-list))
- (catch 'next
- (setq class (nth 0 entry)
- routine (nth 1 entry)
- keyword (nth 2 entry))
-
- ;; The [XYZ] keywords need a special search strategy
- (if (and keyword (string-match "^[xyz]" keyword))
- (setq kwd-re (format "\\(%s\\|\\[[xyz]+\\]\\)%s"
- (substring keyword 0 1)
- (substring keyword 1)))
- (setq kwd-re keyword))
-
- ;; Determine the topic, and the regular expressions for narrowing and
- ;; window start during display.
- (setq topic (if class
- (if routine (concat class "::" routine) class)
- routine))
- (setq pre-re nil pos-re nil found nil)
- (setq pos-p nil)
- (cond ((and (stringp keyword) (string-match "^!" keyword))
- ;; A system keyword
- (setq pos-re (concat "^[ \t]*"
- "\\(![a-zA-Z0-9_]+ *, *\\)*"
- keyword
- "\\( *, *![a-zA-Z0-9_]+ *\\)*"
- " *\\([sS]ystem +[vV]ariables?\\)?"
- "[ \t]*$")))
- ((and class routine)
- ;; A class method
- (if keyword
- (setq pos-re (concat
- "^ *"
- kwd-re
- " *\\(( *\\(get *, *set\\|get\\|set\\)
*)\\)?"
- " *$"))))
- (routine
- ;; A normal routine
- (if keyword
- (setq pre-re "^ *keywords *$"
- pos-re (concat
- "^ *"
- kwd-re
- " *$"))))
- (class
- ;; Just a class
- (if keyword
- (setq pre-re "^ *keywords *$"
- pos-re (concat
- "^ *"
- kwd-re
- " *\\(( *\\(get *, *set\\|get\\|set\\)
*)\\)?"
- " *$")))))
- ;; Load the correct help topic into this buffer
- (widen)
- (if (not (equal topic idlwave-help-current-topic))
- ;; The last topic was different - load the new one.
- (let ((buffer-read-only nil))
- (or (idlwave-help-load-topic topic)
- (throw 'next nil))))
- (goto-char (point-min))
-
- ;; Position cursor and window start.
- (if pre-re
- (re-search-forward pre-re nil t))
- (if (and pos-re
- (setq pos-p (re-search-forward pos-re nil t)))
- (progn (goto-char (match-beginning 0))))
- ;; Determine if we found what we wanted
- (setq found (if pos-re
- pos-p
- (not not-first)))
- (setq not-first t)))
- (if found
- (point)
- (or idlwave-help-use-dedicated-frame
- (idlwave-help-quit))
- nil))))
-
-(defvar default-toolbar-visible-p)
-(defvar idlwave-help-activate-links-aggressively)
-(defun idlwave-help-display-help-window (pos &optional nolinks)
- "Display the help window and move window start to POS.
-See `idlwave-help-use-dedicated-frame'."
- (let ((cw (selected-window))
- (buf (idlwave-help-get-help-buffer)))
- (if (and window-system idlwave-help-use-dedicated-frame)
- (progn
- ;; Use a special frame for this
- (if (frame-live-p idlwave-help-frame)
- nil
- (setq idlwave-help-frame
- (make-frame idlwave-help-frame-parameters))
- ;; Strip menubar (?) and toolbar from the Help frame.
- (if (fboundp 'set-specifier)
- (progn
- ;; XEmacs
- (let ((sval (cons idlwave-help-frame nil)))
- ;; (set-specifier menubar-visible-p sval)
- (set-specifier default-toolbar-visible-p sval)))
- ;; Emacs
- (modify-frame-parameters idlwave-help-frame
- '(;;(menu-bar-lines . 0)
- (tool-bar-lines . 0)))))
- ;; We should use display-buffer here, but there are problems on Emacs
- (select-frame idlwave-help-frame)
- (switch-to-buffer buf))
- ;; Do it in this frame and save the window configuration
- (if (not (get-buffer-window buf nil))
- (setq idlwave-help-window-configuration
- (current-window-configuration)))
- (display-buffer buf nil (selected-frame))
- (select-window (get-buffer-window buf)))
- (raise-frame)
- (goto-char pos)
- (recenter 0)
- (if nolinks
- nil
- (idlwave-help-activate-see-also)
- (idlwave-help-activate-methods)
- (idlwave-help-activate-class)
- (if idlwave-help-activate-links-aggressively
- (idlwave-help-activate-aggressively)))
- (select-window cw)))
-
-
-(defun idlwave-help-select-help-frame ()
- "Select the help frame."
- (if (and (frame-live-p idlwave-help-frame)
- (not (eq (selected-frame) idlwave-help-frame)))
- (progn
- (setq idlwave-help-return-frame (selected-frame))
- (select-frame idlwave-help-frame))))
-(defun idlwave-help-return-to-calling-frame ()
- "Select the frame from which the help frame was selected."
- (interactive)
- (if (and (frame-live-p idlwave-help-return-frame)
- (not (eq (selected-frame) idlwave-help-return-frame)))
- (select-frame idlwave-help-return-frame)))
-
-(defvar idlwave-help-is-source)
-(defun idlwave-help-load-topic (topic)
- "Load topic TOPIC into the current buffer."
- (setq idlwave-help-is-source nil)
- (let* ((entry (assoc topic idlwave-help-topics))
- beg end)
- (if (equal topic "***")
- ;; Make it load the whole file
- (setq entry (cons t nil)))
- (if entry
- (progn
- (setq beg (cdr entry)
- end (cdr (car (cdr (memq entry idlwave-help-topics)))))
- (erase-buffer)
- (setq idlwave-help-current-topic topic)
- (setq idlwave-help-mode-line-indicator (upcase topic))
- (insert-file-contents idlwave-help-file nil beg end)
- (set-buffer-modified-p nil)
- t)
- nil)))
-
-(defvar idlwave-extra-help-function)
-(defun idlwave-online-help (topic &optional name type class keyword)
- "Display help on a certain topic.
-Note that the topics are the section headings in the IDL documentation.
-Thus the right topic may not always be easy to guess."
- (interactive (list (completing-read "Topic: " idlwave-help-topics)))
- (let ((last-topic idlwave-help-current-topic)
- (last-ws (window-start (get-buffer-window "*IDLWAVE Help*" t))))
- ;; Push the current topic on the history stack
- (if last-topic
- (progn
- (if (equal last-topic (car (car idlwave-help-stack-back)))
- (setcdr (car idlwave-help-stack-back) (or last-ws 1))
- (setq idlwave-help-stack-back
- (cons (cons last-topic (or last-ws 1))
- idlwave-help-stack-back)))))
- (if (> (length idlwave-help-stack-back) 20)
- (setcdr (nthcdr 17 idlwave-help-stack-back) nil))
- (setq idlwave-help-stack-forward nil)
- (if topic
- ;; A specific topic
- (progn
- (save-excursion
- (set-buffer (idlwave-help-get-help-buffer))
- (let ((buffer-read-only nil))
- (idlwave-help-load-topic (downcase topic))))
- (idlwave-help-display-help-window 0))
- ;; Find the right topic and place
- (if idlwave-extra-help-function
- (condition-case nil
- (idlwave-routine-info-help name type class keyword)
- (error
- (idlwave-help-get-special-help name type class keyword)))
- (idlwave-routine-info-help name type class keyword)))))
-
-(defun idlwave-routine-info-help (routine type class &optional keyword)
- "Show help about KEYWORD of ROUTINE in CLASS. TYPE is currently ignored.
-When CLASS is nil, look for a normal routine.
-When ROUTINE is nil, display the info about the entire class.
-When KEYWORD is non-nil, position window start at the description of that
-keyword, but still have the whole topic in the buffer."
- (let ((cw (selected-window))
- (help-pos (idlwave-find-help class routine keyword)))
- (if help-pos
- (idlwave-help-display-help-window help-pos)
- (idlwave-help-error routine type class keyword))
- (select-window cw)))
-
-(defun idlwave-help-get-special-help (name type class keyword)
- "Call the function given by `idlwave-extra-help-function'."
- (let* ((cw (selected-window))
- (idlwave-min-frame-width nil)
- (help-pos (save-excursion
- (set-buffer (idlwave-help-get-help-buffer))
- (let ((buffer-read-only nil))
- (funcall idlwave-extra-help-function
- name type class keyword)))))
- (if help-pos
- (progn
- (setq idlwave-help-current-topic (list name type class keyword))
- (idlwave-help-display-help-window help-pos 'no-links)
- ;; Check if we have to widen the frame
- (if (and (integerp idlwave-min-frame-width)
- (framep idlwave-help-frame)
- (< (frame-width idlwave-help-frame) idlwave-min-frame-width))
- (set-frame-width idlwave-help-frame idlwave-min-frame-width)))
- (setq idlwave-help-current-topic nil)
- (idlwave-help-error name type class keyword))
- (select-window cw)))
-
-(defvar idlwave-min-frame-width)
-(defvar idlwave-help-def-pos)
-(defvar idlwave-help-args)
-(defvar idlwave-help-in-header)
-(defvar idlwave-help-is-source)
-(defvar idlwave-help-fontify-source-code)
-(defvar idlwave-help-source-try-header)
-
-(defun idlwave-help-with-source (name type class keyword)
- "Provide help for routines not documented in the IDL manual.
-Works by loading the routine source file into the help buffer.
-Depending on the value of `idlwave-help-source-try-header', it shows
-the routine definition or the header description.
-
-This function can be used as `idlwave-extra-help-function'."
- (let* ((entry (idlwave-best-rinfo-assoc
- name (or type t) class (idlwave-routines)))
- (case-fold-search t)
- (file (cdr (nth 3 entry)))
- header-pos def-pos)
- (setq idlwave-help-def-pos nil)
- (setq idlwave-help-args (list name type class keyword))
- (setq idlwave-help-in-header nil)
- (setq idlwave-help-is-source t)
- (if (stringp file)
- (progn
- (setq file (idlwave-expand-lib-file-name file))
- (if (and (> (buffer-size) 3)
- (equal file (get-text-property 1 :idlwave-file))
- nil) ;; force reloading the file each time
- ;; FIXME: store and check the modification time?
- nil ; Do nothing: this is already the correct file
- ;; load the file
- (if (file-exists-p file)
- (progn
- (erase-buffer)
- (insert-file-contents file nil nil nil 'replace))
- (idlwave-help-error name type class keyword))
- (if idlwave-help-fontify-source-code
- (idlwave-help-fontify))))
- (idlwave-help-error name type class keyword))
- (setq idlwave-help-mode-line-indicator file)
- (put-text-property 1 2 :idlwave-file file)
-
- ;; Try to find a good place to display
- ;; First, find the definition
- (setq def-pos (idlwave-help-find-routine-definition
- name type class keyword))
- (setq idlwave-help-def-pos def-pos)
-
- (if idlwave-help-source-try-header
- ;; Check if we can find the header
- (save-excursion
- (goto-char (or def-pos (point-max)))
- (setq header-pos (idlwave-help-find-in-doc-header
- name type class keyword 'exact)
- idlwave-help-in-header header-pos)))
-
- (if (or header-pos def-pos)
- (progn
- (if (boundp 'idlwave-min-frame-width)
- (setq idlwave-min-frame-width 80))
- (goto-char (or header-pos def-pos)))
- (idlwave-help-error name type class keyword))
-
- (point)))
-
-
-;; FIXME: Should use type here.
-(defun idlwave-help-find-routine-definition (name type class keyword)
- "Find the definition of routine CLASS::NAME in current buffer.
-TYPE and KEYWORD are ignored.
-Returns hte point of match if successful, nil otherwise."
- (save-excursion
- (goto-char (point-max))
- (if (re-search-backward
- (concat "^[ \t]*\\(pro\\|function\\)[ \t]+"
- (regexp-quote (downcase (idlwave-make-full-name class name)))
- "[, \t\r\n]")
- nil t)
- (match-beginning 0)
- nil)))
-
-(defvar idlwave-doclib-start)
-(defvar idlwave-doclib-end)
-
-(defun idlwave-help-find-in-doc-header (name type class keyword
- &optional exact)
- "Find the requested help in the doc-header above point.
-First checks if there is a doc-lib header which describes the correct routine.
-Then tries to find the KEYWORDS section and the KEYWORD, if given.
-Returns the point which should be window start of the help window.
-If EXACT is non-nil, the full help position must be found - down to the
-keyword requested. This setting is for context help, if the exact
-spot is needed.
-If EXACT is nil, the position of the header is returned if it
-describes the correct routine - even if the keyword description cannot
-be found.
-TYPE is ignored.
-
-This function expects a more or less standard routine header. In
-particlar it looks for the `NAME:' tag, either with a colon, or alone
-on a line. Then `NAME:' must be followed by the routine name on the
-same or the next line.
-When KEYWORD is non-nil, looks first for a `KEYWORDS' section. It is
-amazing how inconsisten this is through some IDL libraries I have
-seen. We settle for a line containing an upper case \"KEYWORD\"
-string. If this line is not fould we search for the keyword anyway to
-increase the hit-rate
-
-When one of these sections exists we check for a line starting with any of
-
- /KEYWORD KEYWORD- KEYWORD= KEYWORD
-
-with spaces allowed between the keyword and the following dash or equal sign.
-If there is a match, we assume it is the keyword description."
- (let* ((case-fold-search t)
- ;; NAME tag plus the routine name. The new version is from JD.
- (name-re (concat
- "\\(^;+\\*?[ \t]*name\\([ \t]*:\\|[ \t]*$\\)[ \t]*\\(\n;+[
\t]*\\)*"
- (if (stringp class)
- (concat "\\(" (regexp-quote (downcase class))
- "::\\)?")
- "")
- (regexp-quote (downcase name))
- "\\>\\)"
- "\\|"
- "\\(^;+[ \t]*"
- (regexp-quote (downcase name))
- ":[ \t]*$\\)"))
-; (name-re (concat
-; "\\(^;+\\*?[ \t]*name\\([ \t]*:\\|[ \t]*$\\)[ \t]*\\(\n;+[
\t]*\\)?"
-; (if (stringp class)
-; (concat "\\(" (regexp-quote (downcase class))
-; "::\\)?")
-; "")
-; (regexp-quote (downcase name))
-; "\\>"))
- ;; Header start plus name
- (header-re (concat "\\(" idlwave-doclib-start "\\).*\n"
- "\\(^;+.*\n\\)*"
- "\\(" name-re "\\)"))
- ;; A keywords section
- (kwds-re "^;+[ \t]+KEYWORD PARAMETERS:[ \t]*$") ; hard
- (kwds-re2 (concat ; forgiving
- "^;+\\*?[ \t]*"
- "\\([-A-Z_ ]*KEYWORD[-A-Z_ ]*\\)"
- "\\(:\\|[ \t]*\n\\)"))
- ;; The keyword description line.
- (kwd-re (if keyword ; hard (well...)
- (concat
- "^;+[ \t]+"
- "\\(/" (regexp-quote (upcase keyword))
- "\\|" (regexp-quote (upcase keyword)) "[ \t]*[-=:\n]"
- "\\)")))
- (kwd-re2 (if keyword ; forgiving
- (concat
- "^;+[ \t]+"
- (regexp-quote (upcase keyword))
- "\\>")))
- dstart dend name-pos kwds-pos kwd-pos)
- (catch 'exit
- (save-excursion
- (goto-char (point-min))
- (while (and (setq dstart (re-search-forward idlwave-doclib-start nil t))
- (setq dend (re-search-forward idlwave-doclib-end nil t)))
- ;; found a routine header
- (goto-char dstart)
- (if (setq name-pos (re-search-forward name-re dend t))
- (progn
- (if keyword
- ;; We do need a keyword
- (progn
- ;; Try to find a keyword section, but don't force it.
- (goto-char name-pos)
- (if (let ((case-fold-search nil))
- (or (re-search-forward kwds-re dend t)
- (re-search-forward kwds-re2 dend t)))
- (setq kwds-pos (match-beginning 0)))
- ;; Find the keyword description
- (if (or (let ((case-fold-search nil))
- (re-search-forward kwd-re dend t))
- (re-search-forward kwd-re dend t)
- (let ((case-fold-search nil))
- (re-search-forward kwd-re2 dend t))
- (re-search-forward kwd-re2 dend t))
- (setq kwd-pos (match-beginning 0))
- (if exact
- (progn
- (idlwave-help-diagnostics
- (format "Could not find description of kwd %s"
- (upcase keyword)))
- (throw 'exit nil))))))
- ;; Return the best position we got
- (throw 'exit (or kwd-pos kwds-pos name-pos dstart)))
- (goto-char dend))))
- (idlwave-help-diagnostics "Could not find doclib header")
- (throw 'exit nil))))
-
-(defun idlwave-help-diagnostics (string &optional ding)
- "Add a diagnostics string to the list.
-When DING is non-nil, ring the bell as well."
- (if (boundp 'idlwave-help-diagnostics)
- (progn
- (setq idlwave-help-diagnostics
- (cons string idlwave-help-diagnostics))
- (if ding (ding)))))
-
-(defun idlwave-help-toggle-header-top-and-def (arg)
- (interactive "P")
- (if (not idlwave-help-is-source)
- (error "This is not a source file"))
- (let (pos)
- (if idlwave-help-in-header
- ;; Header was the last thing displayed
- (progn
- (setq idlwave-help-in-header nil)
- (setq pos idlwave-help-def-pos))
- ;; Try to display header
- (setq pos (idlwave-help-find-in-doc-header
- (nth 0 idlwave-help-args)
- (nth 1 idlwave-help-args)
- (nth 2 idlwave-help-args)
- nil))
- (if pos
- (setq idlwave-help-in-header t)
- (error "Cannot find doclib header for routine %s"
- (idlwave-make-full-name (nth 2 idlwave-help-args)
- (nth 0 idlwave-help-args)))))
- (if pos
- (progn
- (goto-char pos)
- (recenter 0)))))
-
-(defun idlwave-help-find-first-header (arg)
- (interactive "P")
- (let (pos)
- (save-excursion
- (goto-char (point-min))
- (if (re-search-forward idlwave-doclib-start nil t)
- (setq pos (match-beginning 0))))
- (if pos
- (progn
- (goto-char pos)
- (recenter 0))
- (error "No DocLib Header in current file"))))
-
-(defun idlwave-help-find-header (arg)
- "Jump to the DocLib Header."
- (interactive "P")
- (if arg
- (idlwave-help-find-first-header nil)
- (setq idlwave-help-in-header nil)
- (idlwave-help-toggle-header-match-and-def arg 'top)))
-
-(defun idlwave-help-toggle-header-match-and-def (arg &optional top)
- (interactive "P")
- (if (not idlwave-help-is-source)
- (error "This is not a source file"))
- (let ((args idlwave-help-args)
- pos)
- (if idlwave-help-in-header
- ;; Header was the last thing displayed
- (progn
- (setq idlwave-help-in-header nil)
- (setq pos idlwave-help-def-pos))
- ;; Try to display header
- (setq pos (apply 'idlwave-help-find-in-doc-header
- (if top
- (list (car args) (nth 1 args) (nth 2 args) nil)
- args)))
- (if pos
- (setq idlwave-help-in-header t)
- (error "Cannot find doclib header for routine %s"
- (idlwave-make-full-name (nth 2 idlwave-help-args)
- (nth 0 idlwave-help-args)))))
- (if pos
- (progn
- (goto-char pos)
- (recenter 0)))))
-
-(defvar font-lock-verbose)
-(defvar idlwave-mode-syntax-table)
-(defvar idlwave-font-lock-defaults)
-(defun idlwave-help-fontify ()
- "Fontify the Help buffer as source code.
-Useful when source code is displayed as help. See the option
-`idlwave-help-fontify-source-code'."
- (interactive)
- (if (not idlwave-help-is-source)
- (error "Fontification only for source files...")
- (if (and (featurep 'font-lock)
- idlwave-help-is-source)
- (let ((major-mode 'idlwave-mode)
- (font-lock-verbose
- (if (interactive-p) font-lock-verbose nil))
- (syntax-table (syntax-table)))
- (unwind-protect
- (progn
- (set-syntax-table idlwave-mode-syntax-table)
- (set (make-local-variable 'font-lock-defaults)
- idlwave-font-lock-defaults)
- (font-lock-fontify-buffer))
- (set-syntax-table syntax-table))))))
-
-(defun idlwave-help-error (name type class keyword)
- (error "Cannot find help on %s%s"
- (idlwave-make-full-name class name)
- (if keyword (format ", keyword %s" (upcase keyword)) "")))
-
-(defun idlwave-help-get-help-buffer ()
- "Return the IDLWAVE Help buffer. Make it first if necessary."
- (let ((buf (get-buffer "*IDLWAVE Help*")))
- (if buf
- nil
- (setq buf (get-buffer-create "*IDLWAVE Help*"))
- (save-excursion
- (set-buffer buf)
- (idlwave-help-mode)))
- buf))
-
-(defun idlwave-help-make-search-list (class routine keyword)
- "Return a list of all possible search compinations.
-For some routines, keywords are described under a different topic or routine.
-This function returns a list of entries (class routine keyword) to be
-searched. It also makes everything downcase, to make sure the regexp
-searches will work properly with `case-fold-search'"
- (let (routines list)
- (setq routine (idlwave-downcase-safe routine)
- class (idlwave-downcase-safe class)
- keyword (idlwave-downcase-safe keyword))
- (setq routine (or (cdr (assoc routine idlwave-help-name-translations))
- routine))
- (setq routines (append (cdr (assoc routine idlwave-help-alt-names))
- (list routine)))
- (if (equal routine "obj_new")
- (setq routines (cons (list (idlwave-downcase-safe
- idlwave-current-obj_new-class)
- "init" keyword)
- routines)))
- (while routines
- (if (consp (car routines))
- (setq list (cons (car routines) list))
- (setq list (cons (list class (car routines) keyword) list)))
- (setq routines (cdr routines)))
- list))
-
-(defvar idlwave-help-link-map (copy-keymap idlwave-help-mode-map)
- "The keymap for activated stuff in the Help application.")
-
-(define-key idlwave-help-link-map (if (featurep 'xemacs) [button1] [mouse-1])
- 'idlwave-help-follow-link)
-(define-key idlwave-help-link-map (if (featurep 'xemacs) [button2] [mouse-2])
- 'idlwave-help-follow-link)
-(define-key idlwave-help-link-map (if (featurep 'xemacs) [button3] [mouse-3])
- 'idlwave-help-follow-link)
-
-(defun idlwave-help-activate-see-also ()
- "Highlight the items under `See Also' in indicate they may be used as links."
- (save-excursion
- (if (re-search-forward "^ *See Also *$" nil t)
- (let ((lim (+ (point) 500))
- (case-fold-search nil)
- (props (list 'face 'idlwave-help-link-face
- 'idlwave-help-link t
- (if (featurep 'xemacs) 'keymap 'local-map)
- idlwave-help-link-map
- 'mouse-face 'highlight))
- (buffer-read-only nil))
- (while (re-search-forward "\\(\\.?[A-Z][A-Z0-9_]+\\)" lim t)
- (if (idlwave-is-help-topic (match-string 1))
- (add-text-properties (match-beginning 1) (match-end 1)
props)))))))
-
-(defun idlwave-help-activate-methods ()
- "Highlight the items under `See Also' in indicate they may be used as links."
- (save-excursion
- (if (re-search-forward "^ *Methods *$" nil t)
- (let ((lim (+ (point) 1000))
- (case-fold-search t)
- (props (list 'face 'idlwave-help-link-face
- 'idlwave-help-link t
- (if (featurep 'xemacs) 'keymap 'local-map)
- idlwave-help-link-map
- 'mouse-face 'highlight))
- (buffer-read-only nil))
- (while (re-search-forward
- "^ *\\* +\"?\\([A-Z][A-Z0-9_]+::[A-Z][A-Z0-9_]+\\)\"?\\( *on
+page +[0-9]*\\)? *" lim t)
- (add-text-properties (match-beginning 1) (match-end 1) props))))))
-
-(defun idlwave-help-activate-class ()
- "Highlight the items under `See Also' in indicate they may be used as links."
- (save-excursion
- (goto-char (point-min))
- (if (looking-at "\\([A-Z][A-Z0-9_]+\\)::[A-Z][A-Z0-9_]+ *$")
- (let ((props (list 'face 'idlwave-help-link-face
- 'idlwave-help-link t
- (if (featurep 'xemacs) 'keymap 'local-map)
- idlwave-help-link-map
- 'mouse-face 'highlight))
- (buffer-read-only nil))
- (add-text-properties (match-beginning 1) (match-end 1) props)))))
-
-(defun idlwave-help-activate-aggressively ()
- (interactive)
- (let ((props (list 'face 'idlwave-help-link-face
- 'idlwave-help-link t
- (if (featurep 'xemacs) 'keymap 'local-map)
- idlwave-help-link-map
- 'mouse-face 'highlight))
- (except
- '("For" "If" "Example" "Wait" "Do" "Events" "Fonts" "Device"
- "Reference" "Guide" "Routines" "Return" "Print" "Reverse"
- "Function" "Pro" "Where" "Plot"))
- (case-fold-search nil)
- (buffer-read-only nil)
- b e s bc ac)
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward "\\.?[A-Z][a-zA-Z0-9_:]+" nil t)
- (setq b (match-beginning 0) e (match-end 0) s (match-string 0)
- bc (char-before b) ac (char-after e))
- (if (and (idlwave-is-help-topic s)
- (not (member s except))
- (not (eq bc ?/)) (not (eq ac ?=))
- (string-match "[A-Z]" (substring s 1)) ; 2nd UPPER char
- (not (equal (downcase s) idlwave-help-current-topic)))
- (add-text-properties b e props)))
- (goto-char (point-min))
- (while (re-search-forward "\"" nil t)
- (when (looking-at "\\([^\"]+\\)\"")
- (setq b (match-beginning 1) e (match-end 1) s (match-string 1))
- (when (< (length s) 100)
- (while (string-match "\\s-\\s-+" s)
- (setq s (replace-match " " t t s)))
- (if (idlwave-is-help-topic s)
- (add-text-properties b e props))))))))
-
-(defun idlwave-grep (regexp list)
- (let (rtn)
- (while list
- (if (string-match regexp (car list))
- (setq rtn (cons (car list) rtn)))
- (setq list (cdr list)))
- (nreverse rtn)))
-
-(defun idlwave-is-help-topic (word)
- "Try if this could be a help topic.
-Also checks special translation lists."
- (setq word (downcase word))
- (car
- (or (assoc word idlwave-help-topics)
- (assoc word idlwave-help-name-translations)
- (assoc word idlwave-help-special-topic-words))))
-
-(defun idlwave-help-maybe-translate (word)
- "Return the real topic assiciated with WORD."
- (setq word (downcase word))
- (or (car (assoc word idlwave-help-topics))
- (cdr (assoc word idlwave-help-name-translations))
- (cdr (assoc word idlwave-help-special-topic-words))))
-
-(defun idlwave-grep-help-topics (list)
- "Return only the classis in LIST which are also help topics."
- (delq nil (mapcar 'idlwave-is-help-topic list)))
-
-(defun idlwave-any-help-topic (list)
- "Return the first member in LIST which is also a help topic."
- (catch 'exit
- (while list
- (if (idlwave-is-help-topic (car list))
- (throw 'exit (car list))
- (setq list (cdr list))))))
-
-;;;;;;00 helpcode ends here
\ No newline at end of file