Initial release of Maemo 5 port of gnuplot
[gnuplot] / lisp / gnuplot.el
diff --git a/lisp/gnuplot.el b/lisp/gnuplot.el
new file mode 100644 (file)
index 0000000..f1022cb
--- /dev/null
@@ -0,0 +1,2576 @@
+;;;; gnuplot.el -- drive gnuplot from within emacs
+
+;; Copyright (C) 1998 Phil Type and Bruce Ravel, 1999-2002 Bruce Ravel
+
+;; Author:     Bruce Ravel <ravel@phys.washington.edu> and Phil Type
+;; Maintainer: Bruce Ravel <ravel@phys.washington.edu>
+;; Created:    June 28 1998
+;; Updated:    December 13, 2002
+;; Version:    0.6.0
+;; Keywords:   gnuplot, plotting
+
+;; This file is not part of GNU Emacs.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; 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 2, or (at your option)
+;; any later version.
+;;
+;; This lisp script 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.
+;;
+;; Permission is granted to distribute copies of this lisp script
+;; provided the copyright notice and this permission are preserved in
+;; all copies.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program; if not, you can either send email to this
+;; program's maintainer or write to: The Free Software Foundation,
+;; Inc.; 675 Massachusetts Avenue; Cambridge, MA 02139, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; send bug reports to the author (ravel@phys.washington.edu)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Commentary:
+;;
+;; This is a major mode for composing gnuplot scripts and displaying
+;; their results using gnuplot.  It is optimized for use with gnuplot
+;; 3.7 or one of the later patchlevels of "version 3.6".  It should
+;; also work very handily with version 3.5.  This mode offers several
+;; tools to help you compose your scripts, including syntax
+;; colorization using either font-lock or hilit19, a syntax table
+;; appropriate to gnuplot, key bindings, pull-down menus, indentation,
+;; keyword completions and variable customization using the Custom
+;; package.  Once the script is composed, there are several function
+;; for sending some or all of the script to gnuplot.  The interaction
+;; with the gnuplot process is within a comint buffer.
+;;
+;;    C-c C-l       send current line to gnuplot
+;;    C-c C-v       send current line to gnuplot and move forward 1 line
+;;    C-c C-r       send current region to gnuplot
+;;    C-c C-b       send entire buffer to gnuplot
+;;    C-c C-f       send a file to gnuplot
+;;    C-c C-i       insert filename at point
+;;    C-c C-n       negate set option on current line
+;;    C-c C-c       comment region
+;;    C-c C-o       set arguments for command at point
+;;   S-mouse-2      set arguments for command under mouse cursor
+;;    C-c C-h       read the gnuplot info file
+;;    C-c C-e       show-gnuplot-buffer
+;;    C-c C-k       kill gnuplot process
+;;    C-c C-u       submit a bug report about gnuplot-mode
+;; M-tab or M-ret   complete keyword before point
+;;      ret         newline and indent
+;;      tab         indent current line
+;;
+;; Gnuplot-mode adds two key bindings to the comint buffer:
+;;     M-C-p        plot the current script buffer line-by-line
+;;     M-C-f        save the current script buffer and load that file
+;;
+;; These two functions are useful for starting up gnuplot-mode.
+;;
+;; M-x gnuplot-mode
+;;         start gnuplot-mode in the current buffer
+;;
+;; M-x gnuplot-make-buffer
+;;         open a new buffer (which is not visiting a file) and start
+;;         gnuplot-mode in that buffer
+;;
+;; ---------------------------------------------------------------------
+;;
+;; Other lisp files used by gnuplot.el
+;;
+;; info-look.el (comes with GNU Emacs 20):
+;;   This provides the interface to the gnuplot-info file and provides
+;;   on-line help and keyword completion functionality.  The version
+;;   of info-look.el that comes with version 20.2 of Emacs contains a
+;;   bug that will impede its interaction with the gnuplot info file.
+;;   You should use the version from the gnuplot-mode homepage
+;;   instead.  info-look is not distributed with XEmacs and so should
+;;   be installed along with gnuplot-mode when using XEmacs.
+;;
+;; gnuplot-gui.el (written by Bruce):
+;;   Defines the GUI interface for setting setting arguments to
+;;   gnuplot options.  This uses the widget package extensively.
+;;
+;; ---------------------------------------------------------------------
+;;
+;; This mode was inspired by the original gnu-plot-mode by Gershon
+;; Elber, which is distributed with gnuplot itself and which dates
+;; back to the early 90's.  Although this mode encompasses the
+;; functionality of the original, the two share no code and the
+;; current implementation takes advantage of many features of modern
+;; versions of emacs and adheres (or so I intend) to the major mode
+;; conventions described in the emacs-lisp reference for version 19
+;; and later.
+;;
+;; ---------------------------------------------------------------------
+;;
+;;                         Installation
+;;                         ============
+;;
+;; A recent version of this file can be found at
+;;   http://feff.phys.washington.edu/~ravel/software/gnuplot-mode/
+;;
+;; To autoload gnuplot-mode on any file with gp extension, put this in
+;; your .emacs file
+;;   (autoload 'gnuplot-mode "gnuplot" "gnuplot major mode" t)
+;;   (autoload 'gnuplot-make-buffer "gnuplot" "open a buffer in gnuplot-mode" t)
+;;
+;; Something like
+;;   (setq auto-mode-alist (append '(("\\.gp$" . gnuplot-mode))
+;;                                auto-mode-alist))
+;; is useful for having files ending in .gp start up in gnuplot-mode.
+;;
+;; Something like
+;;   (global-set-key [(f9)] 'gnuplot-make-buffer)
+;; may be useful.  This binds f9 to the function that opens a scratch
+;; buffer (i.e. one that is not visiting a file) in gnuplot-mode.
+;; This is handy for your quick 'n' dirty plotting chores.
+;;
+;; To use the `gnuplot-info-lookup-symbol' function, the file
+;; gnuplot.info MUST be installed somewhere that info can find it.
+;; This means you must either:
+;;   1.  Copy gnuplot.info to the normal info directory or
+;;   2.  Make sure info can find gnuplot.info by putting this in your
+;;       .emacs file:
+;;         (setenv "INFOPATH"
+;;           (concat (getenv "INFOPATH") ":"
+;;                    (expand-file-name "/path/to/file")))
+;;       where "/path/to/file" is the location of gnuplot.info
+;;
+;; This had been tested extensively with Emacs 19.34 and 20.2 and
+;; XEmacs 20.3 and in a limited manner with Emacs 19.30 and XEmacs
+;; 19.14.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; History:
+;;
+;;  0.1   Jun 25 1998 Finished with initial release.
+;;  0.2   Sep  4 1998 Added filename insertion, indentation, and
+;;        colorization/completion in comint buffer. <BR>
+;;  0.2a  Sep 11 1998 made `indent-line-function' buffer-local (whoops!)
+;;        and fixed some stuff in the installation script <BR>
+;;  0.3   Sep 12 1998 include insertions menu <BR>
+;;  0.3a  Sep 14 1998 fixed bug finding info file if missing, fixed bug
+;;        starting font-lock, fixed bug re overwriting files in
+;;        installation script <BR>
+;;  0.3b  Sep 15 1998 Added (require 'info) to `(eval-and-compile'
+;;        clause, Added (kill-all-local-variables) to `gnuplot-mode',
+;;        altered order of:-
+;;            (provide 'gnuplot)
+;;            (run-hooks 'gnuplot-load-hook)
+;;        at the end of the file in case something in the load hook
+;;        requires gnuplot (oh not that old one again...), added
+;;        `gnuplot-comint-setup-hook', corrected `gnuplot-mark-active'
+;;        which caused an error to be raised by (mark) when the mark
+;;        was inactive <DB>  Some changes to font-lock rules <LB>&<BR>
+;;  0.4   Nov 14 1998 <BR> Use info-look for info interface.  No
+;;        change to gnuplot-mode user interface, but cleaner code.
+;;        With info-look, the help funcion works regardless of the
+;;        version number of gnuplot.  Also, `gnuplot-keywords' (used
+;;        for help, keyword-completion, and hilit19 highlighting) is
+;;        now generated automatically.
+;;  0.4a  Nov 18 1998 <BR> info-look leaves a couple of really useless
+;;        buffers lying around so I cleaned them up.  Also fixed
+;;        font-lock rules so that things in quotes get highlighted
+;;        correctly and the surrounding text is unhighlighted.  Fixed
+;;        up font-lock rules for plot and splot.  Added
+;;        `gnuplot-send-line-and-forward' as suggested by <MD>.
+;;  0.4b  Nov 21 1998 <BR> added toolbar for xemacs -- see file
+;;        gnuplot-toolbar.el.  fixed error message in plot line
+;;        function when line is empty.  option added to display the
+;;        comint buffer showing the gnuplot process in a separate
+;;        frame
+;;  0.4c  Minor stuff: Nov 30 1998 <BR> fixed highlighting in comint
+;;        buffer.  fixed frame behavior.  added "[:]" to range
+;;        insertions.  added :link to defgroup.  Dec 1 1998 <BR> fixed
+;;        some mismatched defcustoms.  added a few lines to suppress
+;;        some compile-time warnings.  Dec 3 1998 <BR> Fixed behavior
+;;        of filename insertion function.  Added more :links to
+;;        defgroup.
+;;  0.4d  Dec 6 1998 <BR> Added function gnuplot-setup-info-look and
+;;        variable gnuplot-info-hook to handle various versions of the
+;;        gnuplot info file.
+;;  0.4e  Dec 12 1998 <BR> Split up gnuplot-insertions-menu for ease of
+;;        custimization, put menubar initialization in a function.
+;;  0.4f  Dec 14 1998 <BR> defcustom the insertions submenus, add
+;;        gnuplot-insertion-menu-flag, intelligent Makefile knows
+;;        which info-look to compile
+;;  0.5   Dec 27 1998 <BR> wrote initial draft of gnuplot-gui.el,
+;;        included it in insertions menu and in `gnuplot-insert'.
+;;        Negate option function, bound to C-c C-n. Dec 29 1998 <BR>
+;;        C-c C-h with no response goes to Commands menu.  Transparent
+;;        toolbar icons.  Replace kw-compl with a simple completion
+;;        function.  Put gnuplot-toolbar code in gnuplot.el.
+;;  0.5a  Jan 23 1999 <BR> send file uses the load command.  add
+;;        gnuplot-plot-from-comint and
+;;        gnuplot-save-and-plot-from-comint and keybindings in the
+;;        comint buffer.  do (process-kill-without-query
+;;        gnuplot-process nil).  `gnuplot-negate-option' checks if set
+;;        option has a negated form.
+;;  0.5b  `gnuplot-kill-gnuplot-buffer' made more robust.  fixed a bug
+;;        in `gnuplot-plot-from-comint'.  fixed description of
+;;        gnuplot-faces group.
+;;  0.5c  update copyright information, update gpelcard
+;;  0.5d  Mar 20 1999 <BR> adopt installation materials from <LH>.  Add
+;;        some support for hidden3d.  Use constants in types alists in
+;;        gui.  Various other minor improvements to the types alists.
+;;  0.5e  Apr 6 1999 <BR> at the suggestion of <SE> I did away with the
+;;        gnuplot-which-highlight variable and revamped how
+;;        colorization gets turned on.  This is a bit tricky since I
+;;        want it to work with font-lock under emacs and xemacs and
+;;        with hilit19.  Apr 11 1999 <BR> insert space at end of
+;;        unique completion.  add a few GUI types, rewrite some stuff
+;;        in the GUI interface.  primitive support for plot, splot,
+;;        and fit.  Fixed completion in file widget.
+;;  0.5f  May 15 1999 <BR> Add pgnuplot.c and Win9x install instructions
+;;        to the distribution.  Fixed a defface bug.  Added
+;;        `gnuplot-keywords-when' allowing deferral of parsing the
+;;        info file.
+;;  0.5g  May 27 1999 <BR> Fixed font-locking of strings and
+;;        comments.  Figure out gnuplot-version number from startup
+;;        message and set `gnuplot-echo-command-line-flag'
+;;        accordingly.  Added `gnuplot-program-version' variable.
+;;        Check that font-lock is actually a feature, as suggested by
+;;        <KL>
+;;  0.5h  Aug 15 1999 <BR> Added `gnuplot-determine-gnuplot-version' so
+;;        that the gnuplot version number and `comint-process-echos'
+;;        actually get set correctly.  Actually, the first time
+;;        something is plotted, the echoing might not work, but the
+;;        second time it will.
+;;  0.5i  Sep  2 1999 <BR> Once again changed how
+;;        `comint-process-echos' gets set.  Maybe I got it right this
+;;        time?  Also fixed certain situations where the info file
+;;        did notget properly loaded (insertion with info toggle on
+;;        and info button in GUI).
+;;  0.5j  Sep  9 1999 <BR> Do a more robust check for the gnuplot
+;;        process before killing the gnuplot buffer, as suggested by
+;;        <SE>.
+;;  0.5k  Sep 22 1999 <BR> make `gnuplot-send-line-and-forward' skip
+;;        over blank and comment lines as suggested by <SE>.  Jan 10
+;;        2000 Bound C-c C-j to `gnuplot-forward-script-line'.
+;;  0.5l  Nov 16 2000 <BR> support for pm3d in gnuplot-gui and in plot
+;;        options insertions menu.  mentioned pm3d in gpelcard. gui
+;;        support for x11 pm3d and vgagl terms.
+;;        `gnuplot-negate-option' works with new syntax.
+;;  0.5m  Nov 17 2000 <BR> add colorization and gui support for new
+;;        commands in 3.8.  gui support for emf term. gui support for
+;;        new "set style" syntax.  much better scheme for determining
+;;        gnuplot version number + make better use of it.
+;;  0.5n  Jan 4 2001 <BR> corrected a serious problem interacting with
+;;        speedbar
+;;  0.5o  skipped
+;;  0.5p  Mar 14 2001 <BR> fixed problem with toolbar creation and
+;;        speedbar clicking
+;;  0.5q  May 30 2001 <BR> added font-lock bindings for words associated
+;;        with plotting
+;;  0.5r  Oct 17 2001 <BR> Incorporate two suggestions by <RF>, bind
+;;        C-c C-c to comment-region and C-c C-o to the GUI, also make
+;;        C-c C-l respect continuation lines
+;;        April 12, 2002 <BR> added feature to trim length of gnuplot
+;;        process buffer
+;;  0.5s  Jun 7 2002 <BR> Yet again changed how `comint-process-echos'
+;;        gets set.  It really needs to be nil on NTEmacs 21.1 or
+;;        comint gets stuck in an infinate loop.
+;;  0.5t  Sep 16 2002 <BR> Fixed a problem with C-c C-v jumping
+;;        forward 2 lines at a time
+;;  0.6.0 Dec 13 2002 <BR> Changed numbering scheme to accommodate
+;;        gnuplot packaging requirements
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Acknowledgements:
+;;    David Batty       <DB> (numerous corrections)
+;;    Laurent Bonnaud   <LB> (suggestions regarding font-lock rules)
+;;    Markus Dickebohm  <MD> (suggested `gnuplot-send-line-and-forward')
+;;    Stephen Eglan     <SE> (suggested the use of info-look,
+;;                            contributed a bug fix regarding shutting
+;;                            down the gnuplot process, improvement to
+;;                            `gnuplot-send-line-and-forward')
+;;    Robert Fenk       <RF> (suggested respecting continuation lines)
+;;    Michael Karbach   <MK> (suggested trimming the gnuplot process buffer)
+;;    Alex Chan Libchen <AL> (suggested font-lock for plotting words)
+;;    Kuang-Yu Liu      <KL> (pointed out buggy dependence on font-lock)
+;;    Hrvoje Niksic     <HN> (help with defcustom arguments for insertions)
+;;    Andreas Rechtsteiner <AR> (pointed out problem with C-c C-v)
+;;    Michael Sanders   <MS> (help with the info-look interface)
+;;    Jinwei Shen       <JS> (suggested functionality in comint buffer)
+;;    Michael M. Tung   <MT> (prompted me to add pm3d support)
+;;    Holger Wenzel     <HW> (suggested using `gnuplot-keywords-when')
+;;    Wolfgang Zocher   <WZ> (pointed out problem with gnuplot-mode + speedbar)
+;;  and especially to Lars Hecking <LH> for including gnuplot-mode
+;;  with the gnuplot 3.7-beta distribution and for providing me with
+;;  installation materials
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; To Do:
+;;
+;; 1. Since `gnuplot-display-process' can be nil, it would be
+;;    handy to have a function to put on
+;;    `gnuplot-after-plot-buffer-hook' to check and see if the script
+;;    executed properly.  Alas I am not sure how gnuplot signals its
+;;    errors.
+;; 2. improve plot, splot, fit in GUI
+;; 3. interface to setting bind command using `read-key-sequence'.
+;;    this is a pain because the nomenclature is really different in
+;;    gnuplot than in `read-key-sequence'
+;;
+;;; Bugs:
+;;
+;; -- indentation is not quite right (but close)
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Code:
+
+(require 'comint)
+(require 'easymenu)
+
+\f
+;;; --- variable definitions + eval-and-compile clauses
+
+;; handle defcustom
+(eval-and-compile
+  (condition-case ()
+      (require 'custom)
+    (error nil))
+  (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
+      nil ;; We've got what we needed
+    ;; We have the old custom-library, hack around it!
+    (if (fboundp 'defgroup)
+        nil
+      (defmacro defgroup (&rest args)
+        nil))
+    (if (fboundp 'defface)
+        nil
+      (defmacro defface (var values doc &rest args)
+        (` (progn
+             (defvar (, var) (quote (, var)))
+             ;; To make colors for your faces you need to set your .Xdefaults
+             ;; or set them up ahead of time in your .emacs file.
+             (make-face (, var))
+             ))))
+    (if (fboundp 'defcustom)
+        nil
+      (defmacro defcustom (var value doc &rest args)
+        (` (defvar (, var) (, value) (, doc)))))))
+
+;; (eval-and-compile
+;;   (condition-case ()
+;;       (require 'kw-compl)
+;;     (error nil)))
+(eval-and-compile  ;; <DB>
+  (require 'info))
+(eval-and-compile
+  (condition-case ()
+      (require 'info-look)
+    (error nil)))
+;; this just gets rid of an annoying compile time error message
+;; (eval-when-compile
+;;   (defun gnuplot-dummy ())
+;;   (defalias 'hilit-set-mode-patterns 'gnuplot-dummy))
+
+
+(defconst gnuplot-xemacs-p (string-match "XEmacs" (emacs-version)))
+(defconst gnuplot-ntemacs-p (string-match "msvc" (emacs-version)))
+(defvar   gnuplot-three-eight-p "")
+
+(defconst gnuplot-maintainer "Bruce Ravel")
+(defconst gnuplot-maintainer-email "ravel@phys.washington.edu")
+(defconst gnuplot-maintainer-url
+  "http://feff.phys.washington.edu/~ravel/software/gnuplot-mode/")
+(defconst gnuplot-version "0.6.0")
+
+(defgroup gnuplot nil
+  "Gnuplot-mode for Emacs."
+  :prefix "gnuplot-"
+  :group 'processes
+  :group 'applications
+  :group 'local
+  :link '(emacs-library-link :tag "Lisp File" "gnuplot.el")
+  :link '(url-link :tag "Homepage"
+                  "http://feff.phys.washington.edu/~ravel/software/gnuplot-mode/")
+  :link '(custom-manual "(gnuplot)Top")
+  :link '(emacs-commentary-link :tag "Commentary" "gnuplot.el") )
+(defgroup gnuplot-insertions nil
+  "Insert commands into gnuplot-scripts from a pull-down menu."
+  :prefix "gnuplot-insertions-"
+  :group 'gnuplot)
+(defgroup gnuplot-hooks nil
+  "Hook variables used by `gnuplot-mode'."
+  :prefix "gnuplot-"
+  :group 'gnuplot)
+
+(defcustom gnuplot-mode-hook nil
+  "*Hook run when `gnuplot-mode' is entered."
+  :group 'gnuplot-hooks
+  :type 'hook)
+(defcustom gnuplot-load-hook nil
+  "*Hook run when gnuplot.el is first loaded."
+  :group 'gnuplot-hooks
+  :type 'hook)
+(defcustom gnuplot-after-plot-hook nil
+  "*Hook run after gnuplot plots something.
+This is the last thing done by the functions for plotting a line, a
+region, a buffer, or a file."
+  :group 'gnuplot-hooks
+  :type 'hook)
+(defcustom gnuplot-info-hook nil
+  "*Hook run before setting up the info-look interface.
+This hook is necessary to handle inconsistencies in versions of and
+sources of the gnuplot info file.  If Gnuplot-mode can find the info
+file generated from the 3.6beta patchlevel 347 (or later) release of
+Gnuplot, then this hook probably is not necessary.  Some versions of
+the info file may have a General Index session, which can be used by
+info-look.  In that case the following (or something similar with the
+value of `info-lookup-symbol-alist' altered appropriately) should be
+placed in the .emacs file.
+
+Emacs version 20.2 ships with a different version of info-look that
+does 20.3.  If you use any version of Emacs 19, you must use the
+version from 20.2.  Any version of XEmacs 20 or 21 should use the
+version from 20.3 but can use either.  XEmacs 19 should use the
+version 20.2.
+
+For the newer version of info-look, do this:
+
+  (add-hook \'gnuplot-info-hook
+           \'(lambda ()
+              (let ((elem (assoc \'gnuplot-mode info-lookup-alist)))
+                (delete elem info-lookup-alist)
+                (info-lookup-maybe-add-help
+                 :mode 'gnuplot-mode :topic 'symbol
+                 :regexp \"[a-zA-Z][_a-zA-Z0-9]*\"
+                 :doc-spec '((\"(gnuplot)General Index\" nil
+                              \"[_a-zA-Z0-9]+\"))))))
+
+For the older version of info-look, do this:
+
+  (add-hook \'gnuplot-info-hook
+           \'(lambda ()
+              (let ((elem (assoc \'gnuplot-mode info-lookup-alist)))
+                (delete elem info-lookup-alist)
+                (setq info-lookup-alist
+                      (append info-lookup-alist
+                              \'((gnuplot-mode
+                                 \"[a-zA-Z][_a-zA-Z0-9]*\" nil
+                                 ((\"(gnuplot)General Index\" nil
+                                   \"[_a-zA-Z0-9]+\" )))))))))"
+  :group 'gnuplot-hooks
+  :type 'hook)
+;; comint hook suggested by <DB>
+(defcustom gnuplot-comint-setup-hook nil
+  "*Hook run after setting up the gnuplot buffer in comint mode.
+So the configuration can be customised by the user."
+  :group 'gnuplot-hooks
+  :type 'hook)
+(defvar gnuplot-recently-sent nil
+  "This is a record of the most recent kind of text sent to gnuplot.
+It takes as its value nil, 'line, 'region, 'buffer, or 'file.  It is
+useful for functions included in `gnuplot-after-plot-hook'.")
+(make-variable-buffer-local 'gnuplot-recently-sent)
+
+(defcustom gnuplot-program "gnuplot"
+  "*The name of the gnuplot executable."
+  :group 'gnuplot
+  :type 'string)
+(defvar gnuplot-program-version nil
+  "Version number of gnuplot.
+This is found using `gnuplot-determine-gnuplot-version")
+(defcustom gnuplot-process-name "gnuplot"
+  "Name given to the gnuplot buffer and process."
+  :group 'gnuplot
+  :type 'string)
+(defvar gnuplot-buffer nil
+  "*The name of the buffer displaying the gnuplot process.")
+(defvar gnuplot-process nil
+  "Variable holding the process handle.")
+(defvar gnuplot-process-frame nil
+  "The frame for displaying the gnuplot process.
+This is used when `gnuplot-display-process' is equal to 'frame.")
+(defvar gnuplot-comint-recent-buffer nil
+  "The most recently plotted gnuplot script buffer.
+This is used by the function that plot from the comint buffer.  It is
+reset every time something is plotted from a script buffer.")
+
+(defcustom gnuplot-gnuplot-buffer "plot.gp"
+  "*The name of the gnuplot scratch buffer opened by 'gnuplot-make-buffer'."
+  :group 'gnuplot
+  :type 'string)
+
+(defcustom gnuplot-display-process 'window
+  "This controls how the gnuplot process buffer is displayed.
+The values are
+   'frame    display gnuplot process in a separate frame
+   'window   display gnuplot process in this frame but in another window
+   nil       `gnuplot-process' is in the current frame but not displayed"
+  :group 'gnuplot
+  :type '(radio (const :tag "Separate frame"  frame)
+               (const :tag "Separate window" window)
+               (const :tag "Not displayed"   nil)))
+(defcustom gnuplot-info-display 'window
+  "*Determines how `gnuplot-info-lookup-symbol' displays the info file.
+The values are
+   'frame    display info file in a separate frame
+   'window   display info file in another window
+   nil       display info file in the current window"
+  :group 'gnuplot
+  :type '(radio (const :tag "Separate frame"  frame)
+               (const :tag "Separate window" window)
+               (const :tag "This window"     nil)))
+
+(defcustom gnuplot-echo-command-line-flag (not gnuplot-ntemacs-p)
+  "*This sets the fall-back value of `comint-process-echos'.
+If `gnuplot-mode' cannot figure out what version number of gnuplot
+this is, then the value of this variable will be used for
+`comint-process-echos'.  It seems that gnuplot 3.5 wants this to be
+nil and 3.7 wants it to be t.  If lines that you send to gnuplot from
+the `gnuplot-mode' buffer are not appearing at the gnuplot prompt in
+the process buffer, try toggling it.  Also see the document string for
+`comint-process-echos'.  If you change this, kill the gnuplot process
+and start it again."
+  :group 'gnuplot
+  :type 'boolean)
+(defcustom gnuplot-insertions-show-help-flag nil
+  "*Non-nil means to display certain help messages automatically.
+These messages are shown after menu insertion of gnuplot commands."
+  :group 'gnuplot-insertions
+  :type 'boolean)
+
+(defcustom gnuplot-delay 0.01
+  "*Amount of time to delay before sending a new line to gnuplot.
+This is needed so that the the line is not written in the gnuplot
+buffer in advance of its prompt.  Increase this number if the
+prompts and lines are displayed out of order."
+  :group 'gnuplot
+  :type 'number)
+(defcustom gnuplot-buffer-max-size 1000
+  "*The maximum size in lines of the gnuplot process buffer.
+Each time text is written in the gnuplot process buffer, lines are
+trimmed from the beginning of the buffer so that the buffer is this
+many lines long.  The lines are deleted after the most recent lines
+were interpretted by gnuplot.  Setting to 0 turns off this feature
+(i.e. no lines get trimmed)."
+  :group 'gnuplot
+  :type 'integer)
+(defcustom gnuplot-quote-character "\'"
+  "*Quotation character used for inserting quoted strings.
+Gnuplot can use single or double quotes.  If you prefer to have the
+filename insertion function never insert quotes for you, set this
+to the empty string."
+  :group 'gnuplot
+  :type '(radio (const :tag "double quote"  "\"")
+               (const :tag "single quote"  "\'")
+               (const :tag "none"          ""  )))
+;; (defcustom gnuplot-gnuplot-version nil
+;;   "*Force gnuplot-mode to behave for this version of gnuplot."
+;;   :group 'gnuplot
+;;   :type '(radio (const :tag "unspecified"   nil)
+;;             (const :tag "3.8 or newer" "3.8")
+;;             (const :tag "3.7 or older" "3.7")))
+
+(defvar gnuplot-info-frame nil)
+(defvar gnuplot-info-nodes '())
+
+(defvar gnuplot-first-call t)
+
+;; with info-look, there is no need to carry this list around -- it
+;; can be generated on the fly appropriate to the currently installed
+;; version of gnuplot.info
+(defvar gnuplot-keywords nil
+  "A list of keywords used in GNUPLOT.
+These are set by `gnuplot-set-keywords-list' from the values in
+`info-lookup-cache'.")
+(defvar gnuplot-keywords-pending t     ;; <HW>
+  "A boolean which gets toggled when the info file is probed.")
+(defcustom gnuplot-keywords-when 'deferred ;; 'immediately
+  "This variable controls when the info file is parsed.
+The choices are immediately upon starting gnuplot-mode or the first
+time that data is needed.  If you use hilit19, then the info file is
+parsed immediately regardless of the value of this variable.  But
+you're not using that musty old thing, are you..."
+  :group 'gnuplot
+  :type
+  '(radio (const :tag "Parse info file when gnuplot-mode starts"    immediately)
+         (const :tag "Parse info file the first time it is needed" deferred)))
+
+(defgroup gnuplot-faces nil
+  "Text faces used by gnuplot-mode."
+  :prefix "gnuplot-"
+  :group 'gnuplot)
+
+(cond ((and (featurep 'custom) (fboundp 'custom-declare-variable))
+       (defface gnuplot-prompt-face '((((class color))
+                                      (:foreground "firebrick"))
+                                     (t
+                                      (:bold t :underline t)))
+        "Face used for the prompt in the gnuplot process buffer."
+        :group 'gnuplot-faces))
+      (t
+       (make-face 'gnuplot-prompt-face)
+       (set-face-foreground 'gnuplot-prompt-face "firebrick")))
+
+\f
+;;; --- key bindings and menus
+
+(defvar gnuplot-mode-map nil)
+(if gnuplot-mode-map
+    ()
+  (setq gnuplot-mode-map (make-sparse-keymap))
+  (define-key gnuplot-mode-map "\C-c\C-b" 'gnuplot-send-buffer-to-gnuplot)
+  (define-key gnuplot-mode-map "\C-c\C-c" 'comment-region) ; <RF>
+  (define-key gnuplot-mode-map "\C-c\C-o" 'gnuplot-gui-set-options-and-insert)
+  (define-key gnuplot-mode-map "\C-c\C-d" 'gnuplot-show-version)
+  (define-key gnuplot-mode-map "\C-c\C-e" 'gnuplot-show-gnuplot-buffer)
+  (define-key gnuplot-mode-map "\C-c\C-f" 'gnuplot-send-file-to-gnuplot)
+  (define-key gnuplot-mode-map "\C-c\C-h" 'gnuplot-info-lookup-symbol)
+  (define-key gnuplot-mode-map "\C-c\C-i" 'gnuplot-insert-filename)
+  (define-key gnuplot-mode-map "\C-c\C-j" 'gnuplot-forward-script-line)
+  (define-key gnuplot-mode-map "\C-c\C-k" 'gnuplot-kill-gnuplot-buffer)
+  (define-key gnuplot-mode-map "\C-c\C-l" 'gnuplot-send-line-to-gnuplot)
+  (define-key gnuplot-mode-map "\C-c\C-n" 'gnuplot-negate-option)
+  (define-key gnuplot-mode-map "\C-c\C-p" 'gnuplot-show-gnuplot-version)
+  (define-key gnuplot-mode-map "\C-c\C-r" 'gnuplot-send-region-to-gnuplot)
+  ;;(define-key gnuplot-mode-map "\C-c\C-t" 'gnuplot-gui-swap-simple-complete)
+  (define-key gnuplot-mode-map "\C-c\C-u" 'gnuplot-bug-report)
+  (define-key gnuplot-mode-map "\C-c\C-v" 'gnuplot-send-line-and-forward)
+  (define-key gnuplot-mode-map "\C-c\C-z" 'gnuplot-customize)
+  (define-key gnuplot-mode-map "\M-\r"    'gnuplot-complete-keyword)
+  (define-key gnuplot-mode-map "\M-\t"    'gnuplot-complete-keyword)
+  (define-key gnuplot-mode-map "\C-i"     'indent-for-tab-command)
+  (define-key gnuplot-mode-map "\C-m"     'newline-and-indent)
+  ;;(define-key gnuplot-mode-map "\C-m"     'reindent-then-newline-and-indent)
+  ;;(if (featurep 'kw-compl)
+  ;;    (define-key gnuplot-mode-map "\M-\r" 'kw-compl-abbrev)))
+  (cond (gnuplot-xemacs-p
+        (define-key gnuplot-mode-map '(shift button2)
+          'gnuplot-gui-mouse-set))
+       (t
+        (define-key gnuplot-mode-map [S-mouse-2]
+          'gnuplot-gui-mouse-set))) )
+
+(defvar gnuplot-mode-menu nil)
+(defvar gnuplot-menu nil
+  "Menu for `gnuplot-mode'.")
+(setq gnuplot-menu
+      '("Gnuplot"
+       ["Send line to gnuplot"             gnuplot-send-line-to-gnuplot   t]
+       ["Send line & move forward"         gnuplot-send-line-and-forward (not (eobp))]
+       ["Send region to gnuplot"           gnuplot-send-region-to-gnuplot
+        (gnuplot-mark-active)]
+       ["Send buffer to gnuplot"           gnuplot-send-buffer-to-gnuplot t]
+       ["Send file to gnuplot"             gnuplot-send-file-to-gnuplot t]
+       "---"
+       ["Insert filename at point"         gnuplot-insert-filename t]
+       ["Negate set option"                gnuplot-negate-option t]
+       ;;["Set key binding"             gnuplot-set-binding gnuplot-three-eight-p]
+       ["Keyword help"                     gnuplot-info-lookup-symbol
+        (or gnuplot-keywords gnuplot-keywords-pending)]
+       ["Show gnuplot process buffer"      gnuplot-show-gnuplot-buffer t]
+       ["Set arguments at point"           gnuplot-gui-set-options-and-insert
+        (fboundp 'gnuplot-gui-set-options-and-insert)]
+       ["Swap plot/splot/fit lists in GUI" gnuplot-gui-swap-simple-complete
+        (fboundp 'gnuplot-gui-swap-simple-complete)]
+       "---"
+       ["Customize gnuplot"                gnuplot-customize t]
+       ["Submit bug report"                gnuplot-bug-report t]
+       ["Show gnuplot-mode version"        gnuplot-show-version t]
+       ["Show gnuplot version"             gnuplot-show-gnuplot-version t]
+       "---"
+       ["Kill gnuplot"                     gnuplot-kill-gnuplot-buffer t]
+       ))
+
+\f
+;;; --- insertions variables and menus
+
+;;(load-library "gnuplot-insertions")
+(defvar gnuplot-mode-insertions-menu nil)
+(defvar gnuplot-insertions-menu nil
+  "Menu for insertions in `gnuplot-mode'.
+
+The insertions menu is composed of several sub-menus.  The variables
+describing the sub-menus are:
+  `gnuplot-insertions-adornments'
+  `gnuplot-insertions-plot-options'
+  `gnuplot-insertions-terminal'
+  `gnuplot-insertions-x-axis'
+  `gnuplot-insertions-y-axis'
+  `gnuplot-insertions-z-axis'
+  `gnuplot-insertions-x2-axis'
+  `gnuplot-insertions-y2-axis'
+  `gnuplot-insertions-parametric-plots'
+  `gnuplot-insertions-polar-plots'
+  `gnuplot-insertions-surface-plots'
+These variables can be customized by the user.  For example, there are
+many terminal types which are not in the terminal submenu but which
+may be compiled into a user's copy of gnuplot.
+
+Each of these variables is a list whose first element is a string and
+all the rest are vectors as described in the document string for
+`easy-menu-define'.  The callback used throughout these menus is
+`gnuplot-insert' which inserts the appropriate set expression and,
+optionally, looks up that item in the gnuplot info file.
+
+The easiest way to customize the submenus is to use the custom
+package.  Just type \\[gnuplot-customize] and follow your nose.
+
+You can also add new items to any of these sub-menus by adding to the
+`gnuplot-load-hook' in your .emacs file.  Here is an example of adding
+the \"regis\" terminal type to the terminal sub-menu:
+
+ (add-hook
+  'gnuplot-load-hook
+  '(lambda ()
+      (setq gnuplot-insertions-terminal
+           (append gnuplot-insertions-terminal
+                   (list
+                    [\"regis\"
+                      (gnuplot-insert \"set terminal regis\")
+                       t])))))")
+
+(defvar gnuplot-insertions-top ()
+  "Top part of insertions menu.
+See the document string for `gnuplot-insertions-menu'")
+
+(defcustom gnuplot-insertions-menu-flag t
+  "*Non-nil means to place the insertion menu in the menubar.
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+  :group 'gnuplot-insertions
+  :type 'boolean)
+
+(defcustom gnuplot-insertions-adornments ; this is icky...
+  (if gnuplot-three-eight-p
+      '("adornments"
+       ["arrow"       (gnuplot-insert "set arrow ")          t]
+       ["bar"         (gnuplot-insert "set bar")             t]
+       ["border"      (gnuplot-insert "set border")          t]
+       ["boxwidth"    (gnuplot-insert "set boxwidth ")       t]
+       ["format"      (gnuplot-insert "set format ")         t]
+       ["grid"        (gnuplot-insert "set grid")            t]
+       ["key"         (gnuplot-insert "set key ")            t]
+       ["label"       (gnuplot-insert "set label ")          t]
+       ["pointsize"   (gnuplot-insert "set pointsize ")      t]
+       ["samples"     (gnuplot-insert "set samples ")        t]
+       ["size"        (gnuplot-insert "set size ")           t]
+       ["style"       (gnuplot-insert "set style ")          t]
+       ["tics"        (gnuplot-insert "set tics ")           t]
+       ["timefmt"     (gnuplot-insert "set timefmt ")        t]
+       ["timestamp"   (gnuplot-insert "set timestamp ")      t]
+       ["title"       (gnuplot-insert "set title ")          t]
+       ["zeroaxis"    (gnuplot-insert "set zeroaxis")        t] )
+    '("adornments"
+      ["data style"     (gnuplot-insert "set data style ")     t]
+      ["function style" (gnuplot-insert "set function style ") t]
+      ["arrow"          (gnuplot-insert "set arrow ")         t]
+      ["bar"           (gnuplot-insert "set bar")             t]
+      ["border"         (gnuplot-insert "set border")         t]
+      ["boxwidth"       (gnuplot-insert "set boxwidth ")       t]
+      ["format"         (gnuplot-insert "set format ")        t]
+      ["grid"          (gnuplot-insert "set grid")            t]
+      ["key"           (gnuplot-insert "set key ")            t]
+      ["label"          (gnuplot-insert "set label ")         t]
+      ["pointsize"      (gnuplot-insert "set pointsize ")      t]
+      ["samples"        (gnuplot-insert "set samples ")               t]
+      ["size"           (gnuplot-insert "set size ")          t]
+      ["tics"           (gnuplot-insert "set tics ")          t]
+      ["timefmt"        (gnuplot-insert "set timefmt ")        t]
+      ["timestamp"      (gnuplot-insert "set timestamp ")      t]
+      ["title"          (gnuplot-insert "set title ")         t]
+      ["zeroaxis"       (gnuplot-insert "set zeroaxis")        t] ))
+  "Adornments submenu in the insertions menu.
+See the document string for `gnuplot-insertions-menu'
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+       :group 'gnuplot-insertions
+       :type '(list (string :tag "Title")
+                    (repeat :inline t
+                            (vector (string   :tag "Name")
+                                    (function :tag "Callback")
+                                    (boolean  :tag "Enabled" t)))))
+
+
+
+(defcustom gnuplot-insertions-plot-options
+  '("plot options"
+    ["autoscale"  (gnuplot-insert "set autoscale ")         t]
+    ["clip"      (gnuplot-insert "set clip ")               t]
+    ["encoding"   (gnuplot-insert "set encoding ")          t]
+    ["locale"     (gnuplot-insert "set locale ")            t]
+    ["logscale"          (gnuplot-insert "set logscale ")           t]
+    ["multiplot"  (gnuplot-insert "set multiplot")          t]
+    ["missing"   (gnuplot-insert "set missing \"\"")        t]
+    ["palette"    (gnuplot-insert "set palette ")            t]        ; <MT>
+    ["pm3d"       (gnuplot-insert "set pm3d ")               t]
+    ["offsets"   (gnuplot-insert "set offsets ")            t]
+    ["output"     (gnuplot-insert "set output ")            t]
+    ["zero"      (gnuplot-insert "set zero ")               t] )
+  "Plot options submenu in the insertions menu.
+See the document string for `gnuplot-insertions-menu'
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+  :group 'gnuplot-insertions
+  :type '(list (string :tag "Title")
+              (repeat :inline t
+                      (vector (string   :tag "Name")
+                              (function :tag "Callback")
+                              (boolean  :tag "Enabled" t)))))
+
+
+(defcustom gnuplot-insertions-terminal
+  '("terminal"
+    ["eepic"      (gnuplot-insert "set terminal eepic")      t]
+    ["fig"        (gnuplot-insert "set terminal fig")        t]
+    ["gpic"       (gnuplot-insert "set terminal gpic")       t]
+    ["latex"      (gnuplot-insert "set terminal latex")      t]
+    ["linux"      (gnuplot-insert "set terminal linux")      t]
+    ["pbm"        (gnuplot-insert "set terminal pbm")        t]
+    ["png"        (gnuplot-insert "set terminal png")        t]
+    ["postscript" (gnuplot-insert "set terminal postscript") t]
+    ["pslatex"    (gnuplot-insert "set terminal pslatex")    t]
+    ["table"      (gnuplot-insert "set terminal table")      t]
+    ["tek40xx"    (gnuplot-insert "set terminal tek40xx")    t]
+    ["tkcanvas"   (gnuplot-insert "set terminal tkcanvas")   t]
+    ["tpic"       (gnuplot-insert "set terminal tpic")       t]
+    ["vgagl"      (gnuplot-insert "set terminal vgagl")      t]        ; for pm3d patch
+    ["vttek"      (gnuplot-insert "set terminal vttek")      t]
+    ["x11"        (gnuplot-insert "set terminal x11")        t] )
+  "Terminal submenu in the insertions menu.
+See the document string for `gnuplot-insertions-menu'
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+  :group 'gnuplot-insertions
+  :type '(list (string :tag "Title")
+              (repeat :inline t
+                      (vector (string   :tag "Name")
+                              (function :tag "Callback")
+                              (boolean  :tag "Enabled" t)))))
+
+
+(defcustom gnuplot-insertions-x-axis
+  '("x-axis"
+    ["xdata"     (gnuplot-insert "set xdata ")              t]
+    ["xlabel"    (gnuplot-insert "set xlabel ")             t]
+    ["xrange"    (gnuplot-insert "set xrange [:]")          t]
+    ["xtics"     (gnuplot-insert "set xtics ")              t]
+    ["mxtics"    (gnuplot-insert "set mxtics ")             t]
+    ["xzeroaxis"  (gnuplot-insert "set xzeroaxis ")         t]
+    ["xdtics"    (gnuplot-insert "set xdtics ")             t]
+    ["xmtics"    (gnuplot-insert "set xmtics ")             t])
+  "X-axis submenu in the insertions menu.
+See the document string for `gnuplot-insertions-menu'
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+  :group 'gnuplot-insertions
+  :type '(list (string :tag "Title")
+              (repeat :inline t
+                      (vector (string   :tag "Name")
+                              (function :tag "Callback")
+                              (boolean  :tag "Enabled" t)))))
+
+
+(defcustom gnuplot-insertions-x2-axis
+  '("x2-axis"
+    ["x2data"    (gnuplot-insert "set xdata ")              t]
+    ["x2label"   (gnuplot-insert "set xlabel ")             t]
+    ["x2range"   (gnuplot-insert "set xrange [:]")          t]
+    ["x2tics"    (gnuplot-insert "set xtics ")              t]
+    ["mx2tics"   (gnuplot-insert "set mxtics ")             t]
+    ["x2zeroaxis" (gnuplot-insert "set xzeroaxis ")         t]
+    ["x2dtics"   (gnuplot-insert "set xdtics ")             t]
+    ["x2mtics"   (gnuplot-insert "set xmtics ")             t])
+  "X2-axis submenu in the insertions menu.
+See the document string for `gnuplot-insertions-menu'
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+  :group 'gnuplot-insertions
+  :type '(list (string :tag "Title")
+              (repeat :inline t
+                      (vector (string   :tag "Name")
+                              (function :tag "Callback")
+                              (boolean  :tag "Enabled" t)))))
+
+
+(defcustom gnuplot-insertions-y-axis
+  '("y-axis"
+    ["ydata"     (gnuplot-insert "set ydata ")              t]
+    ["ylabel"    (gnuplot-insert "set ylabel ")             t]
+    ["ymtics"    (gnuplot-insert "set ymtics ")             t]
+    ["yrange"    (gnuplot-insert "set yrange [:]")          t]
+    ["ytics"     (gnuplot-insert "set ytics ")              t]
+    ["yzeroaxis"  (gnuplot-insert "set yzeroaxis ")         t]
+    ["ydtics"    (gnuplot-insert "set ydtics ")             t]
+    ["mytics"    (gnuplot-insert "set mytics ")             t])
+  "Y-axis submenu in the insertions menu.
+See the document string for `gnuplot-insertions-menu'
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+  :group 'gnuplot-insertions
+  :type '(list (string :tag "Title")
+              (repeat :inline t
+                      (vector (string   :tag "Name")
+                              (function :tag "Callback")
+                              (boolean  :tag "Enabled" t)))))
+
+(defcustom gnuplot-insertions-y2-axis
+  '("y2-axis"
+    ["y2data"    (gnuplot-insert "set ydata ")              t]
+    ["y2label"   (gnuplot-insert "set ylabel ")             t]
+    ["y2range"   (gnuplot-insert "set yrange [:]")          t]
+    ["y2tics"    (gnuplot-insert "set ytics ")              t]
+    ["my2tics"   (gnuplot-insert "set mytics ")             t]
+    ["y2zeroaxis"  (gnuplot-insert "set yzeroaxis ")        t]
+    ["y2mtics"   (gnuplot-insert "set ymtics ")             t]
+    ["y2dtics"   (gnuplot-insert "set ydtics ")             t])
+  "Y2-axis submenu in the insertions menu.
+See the document string for `gnuplot-insertions-menu'
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+  :group 'gnuplot-insertions
+  :type '(list (string :tag "Title")
+              (repeat :inline t
+                      (vector (string   :tag "Name")
+                              (function :tag "Callback")
+                              (boolean  :tag "Enabled" t)))))
+
+
+
+(defcustom gnuplot-insertions-z-axis
+  '("z-axis"
+    ["zdata"     (gnuplot-insert "set zdata ")              t]
+    ["zlabel"    (gnuplot-insert "set zlabel ")             t]
+    ["zrange"    (gnuplot-insert "set zrange [:]")          t]
+    ["ztics"     (gnuplot-insert "set ztics ")              t]
+    ["mztics"    (gnuplot-insert "set mztics ")             t]
+    ["zdtics"    (gnuplot-insert "set zdtics ")             t]
+    ["zmtics"    (gnuplot-insert "set zmtics ")             t] )
+  "Z-axis submenu in the insertions menu.
+See the document string for `gnuplot-insertions-menu'
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+  :group 'gnuplot-insertions
+  :type '(list (string :tag "Title")
+              (repeat :inline t
+                      (vector (string   :tag "Name")
+                              (function :tag "Callback")
+                              (boolean  :tag "Enabled" t)))))
+
+
+(defcustom gnuplot-insertions-parametric-plots
+  '("parametric plots"
+    ["parametric" (gnuplot-insert "set parametric")         t]
+    ["isosamples" (gnuplot-insert "set isosamples ")        t]
+    ["dummy"     (gnuplot-insert "set dummy ")              t]
+    ["trange"    (gnuplot-insert "set trange [:]")          t]
+    ["urange"    (gnuplot-insert "set urange [:]")          t]
+    ["vrange"    (gnuplot-insert "set vrange [:]")          t] )
+  "Parametric plots submenu in the insertions menu.
+See the document string for `gnuplot-insertions-menu'
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+  :group 'gnuplot-insertions
+  :type '(list (string :tag "Title")
+              (repeat :inline t
+                      (vector (string   :tag "Name")
+                              (function :tag "Callback")
+                              (boolean  :tag "Enabled" t)))))
+
+
+(defcustom gnuplot-insertions-polar-plots
+  '("polar plots"
+    ["polar"     (gnuplot-insert "set polar")               t]
+    ["angles"    (gnuplot-insert "set angles ")             t]
+    ["rrange"    (gnuplot-insert "set rrange [:]")          t] )
+  "Polar plots submenu in the insertions menu.
+See the document string for `gnuplot-insertions-menu'
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+  :group 'gnuplot-insertions
+  :type '(list (string :tag "Title")
+              (repeat :inline t
+                      (vector (string   :tag "Name")
+                              (function :tag "Callback")
+                              (boolean  :tag "Enabled" t)))))
+
+
+(defcustom gnuplot-insertions-surface-plots
+  '("surface plots"
+    ["clabel"    (gnuplot-insert "set clabel ")             t]
+    ["cntrparam"  (gnuplot-insert "set cntrparam ")         t]
+    ["contour"   (gnuplot-insert "set contour")             t]
+    ["dgrid3d"   (gnuplot-insert "set dgrid3d ")            t]
+    ["hidden3d"          (gnuplot-insert "set hidden3d ")           t]
+    ["mapping"   (gnuplot-insert "set mapping ")            t]
+    ["surface"   (gnuplot-insert "set surface ")            t]
+    ["view"      (gnuplot-insert "set view ")               t] )
+  "Surface plots submenu in the insertions menu.
+See the document string for `gnuplot-insertions-menu'
+Changing this will not effect a change in any currently existing
+`gnuplot-mode' buffer.  You will see the change the next time you
+create a `gnuplot-mode' buffer."
+  :group 'gnuplot-insertions
+  :type '(list (string :tag "Title")
+              (repeat :inline t
+                      (vector (string   :tag "Name")
+                              (function :tag "Callback")
+                              (boolean  :tag "Enabled" t)))))
+
+
+
+(defvar gnuplot-insertions-bottom ()
+  "Bottom part of the insertions menu.
+This part contains the toggle buttons for displaying info or
+opening an argument-setting popup.")
+(setq gnuplot-insertions-bottom
+      '("---"
+       ["Display of info with insertion" gnuplot-toggle-info-display
+        :style toggle :selected gnuplot-insertions-show-help-flag]
+       ["Display GUI popup with insertion" gnuplot-gui-toggle-popup
+        :active (fboundp 'gnuplot-gui-toggle-popup)
+        :style toggle :selected (and (fboundp 'gnuplot-gui-toggle-popup)
+                                     gnuplot-gui-popup-flag)] ))
+
+
+;; Regarding a comment by <DB>:
+;;
+;; This is from the header in easymenu.el distributed with XEmacs:
+;;
+;; ;; - Function: easy-menu-add MENU [ MAP ]
+;; ;;     Add MENU to the current menubar in MAP.
+;; ;;
+;; ;; - Function: easy-menu-remove MENU
+;; ;;     Remove MENU from the current menubar.
+;; ;;
+;; ;; Emacs 19 never uses `easy-menu-add' or `easy-menu-remove', menus
+;; ;; automatically appear and disappear when the keymaps specified by
+;; ;; the MAPS argument to `easy-menu-define' are activated.
+;; ;;
+;; ;; XEmacs will bind the map to button3 in each MAPS, but you must
+;; ;; explicitly call `easy-menu-add' and `easy-menu-remove' to add and
+;; ;; remove menus from the menu bar.
+;;
+;; in Emacs, easy-menu-add is defined like this:
+;;      (defun easy-menu-add (menu &optional map))
+
+(defun gnuplot-setup-menubar ()
+  "Initial setup of gnuplot and insertions menus."
+  (if gnuplot-insertions-menu-flag     ; set up insertions menu
+      (progn
+       (if gnuplot-xemacs-p
+           (setq gnuplot-insertions-top
+                 '("insert set expression" "--:doubleLine"))
+         (setq gnuplot-insertions-top
+               '("insert set expression" "---")))
+       (setq gnuplot-insertions-menu
+             (append (list "Insertions")
+                     gnuplot-insertions-top
+                     (list gnuplot-insertions-adornments)
+                     (list gnuplot-insertions-plot-options)
+                     (list gnuplot-insertions-terminal)
+                     (list gnuplot-insertions-x-axis)
+                     (list gnuplot-insertions-y-axis)
+                     (list gnuplot-insertions-z-axis)
+                     (list gnuplot-insertions-x2-axis)
+                     (list gnuplot-insertions-y2-axis)
+                     (list gnuplot-insertions-parametric-plots)
+                     (list gnuplot-insertions-polar-plots)
+                     (list gnuplot-insertions-surface-plots)
+                     gnuplot-insertions-bottom))
+       (easy-menu-define gnuplot-mode-insertions-menu gnuplot-mode-map
+                         "Insertions menu used in Gnuplot-mode"
+                         gnuplot-insertions-menu)
+       (easy-menu-add gnuplot-mode-insertions-menu gnuplot-mode-map)))
+  (easy-menu-define                    ; set up gnuplot menu
+   gnuplot-mode-menu gnuplot-mode-map "Menu used in gnuplot-mode"
+   gnuplot-menu)
+  (easy-menu-add gnuplot-mode-menu gnuplot-mode-map) )
+
+;; There is no `mark-active' variable in XEmacs.  Hassle!  This is not
+;; only replicates mark-active, but it only returns true if the region
+;; is of non-zero width.
+;; Error checking suggested by <DB>
+(defun gnuplot-mark-active ()
+  "Return non-nil if the mark is active and it is not equal to point."
+  (condition-case nil
+      (and (mark) (/= (mark) (point)))
+    (error nil)))
+
+\f
+;;; --- XEmacs toolbar
+
+(defgroup gnuplot-toolbar nil
+  "Toolbar used by XEmacs."
+  :prefix "gnuplot-toolbar-"
+  :group 'gnuplot)
+
+(defcustom gnuplot-toolbar-display-flag gnuplot-xemacs-p
+  "*Non-nil means to display display a toolbar in XEmacs."
+  :group 'gnuplot-toolbar
+  :type 'boolean)
+
+(defcustom gnuplot-toolbar-use-toolbar (if (featurep 'toolbar) 'left-toolbar nil)
+  "*If nil, do not use a toolbar.
+If it is non-nil, it must be a toolbar.  The five legal values are
+`default-toolbar', `top-toolbar', `bottom-toolbar', `right-toolbar',
+and `left-toolbar', although choosing `default-toolbar' or
+`top-toolbar' may be a bad idea since either will make the GNUPLOT
+toolbar replace the standard toolbar.  Changing this will not change
+the toolbar in a currently existing buffer, but it will take effect
+the next time you use `gnuplot-mode' and emacs.
+
+This is only used if a toolbar can be displayed, thus this is used in
+XEmacs and ignored in FSF Emacs."
+  :type '(choice (const default-toolbar)
+                (const top-toolbar)
+                (const bottom-toolbar)
+                (const left-toolbar)
+                (const right-toolbar)
+                (const :tag "No toolbar" nil))
+  :group 'gnuplot-toolbar)
+
+(defvar gnuplot-toolbar-location "")
+
+(defun gnuplot-toolbar-setup-toolbar (toolbar)
+  "Setup function for the `gnuplot-mode' toolbar.
+TOOLBAR contains the toolbar specification.
+This is basically swiped from VM."
+  (let ((width 46) (height 46)
+       (buffer (current-buffer))
+       (frame (selected-frame))
+       (tag-set '(win)))
+    (cond
+     ((eq (symbol-value gnuplot-toolbar-use-toolbar) right-toolbar)
+      (setq gnuplot-toolbar-location       "right")
+      (set-specifier right-toolbar         toolbar buffer)
+      (set-specifier right-toolbar-width   width frame  tag-set))
+     ((eq (symbol-value gnuplot-toolbar-use-toolbar) left-toolbar)
+      (setq gnuplot-toolbar-location       "left")
+      (set-specifier left-toolbar          toolbar buffer)
+      (set-specifier left-toolbar-width    width frame  tag-set))
+     ((eq (symbol-value gnuplot-toolbar-use-toolbar) bottom-toolbar)
+      (setq gnuplot-toolbar-location       "bottom")
+      (set-specifier bottom-toolbar        toolbar buffer)
+      (set-specifier bottom-toolbar-height height frame tag-set))
+     ((eq (symbol-value gnuplot-toolbar-use-toolbar) top-toolbar)
+      (setq gnuplot-toolbar-location       "top")
+      (set-specifier top-toolbar           toolbar buffer)
+      (set-specifier top-toolbar-height    height frame tag-set))) ))
+
+(defvar gnuplot-line-xpm
+  (if (featurep 'xpm)
+      (toolbar-make-button-list
+       "/* XPM */
+static char *line[] = {
+/* width height num_colors chars_per_pixel */
+\"    40    40        5           1\",
+/* colors */
+\". c #000000\",
+\"a c #bebebe s backgroundToolBarColor\",
+\"b c #2f4f4f\",
+\"c c #ff6347\",
+\"d c #0000ff\",
+/* pixels */
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaa..a..aaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaa..a..a....aaa...aaaaaaaaaaaa\",
+\"aaaaaaaaaaaa..a..a..a..a..a..aaaaaaaaaaa\",
+\"aaaaaaaaaaaa..a..a.aa..a.....aaaaaaaaaaa\",
+\"aaaaaaaaaaa..a..a..a..a..aaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaa..a..a..a..a..a..aaaaaaaaaaaa\",
+\"aaaaaaaaaaa..a..a..a..aa...aaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaadaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaadaaaaaaaaa\",
+\"aaaaaaa..aaaaaaaaaaaaaaaaaaaadaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaadaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaacaaaadaadaaaaaaaaaaaa\",
+\"aaaaaaaa.caaadaaaccaccadaddaaaaaccaaaaaa\",
+\"aaaaaaa..accdaddcaaaaaccaaaaaaccaaaaaaaa\",
+\"aaaaaaaa.aadcaccdaaaadaaccaaccaaaaaaaaaa\",
+\"aaaaaaaa.adaacaaaddadaaaaaccaaaaaaaaaaaa\",
+\"aaaaaaaa.daaaaaaaaadaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaa............................aaaaaa\",
+\"aaaaaaaa.aaaa.aaaa.aaaa.aaaa.aaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};")
+  "XPM format image used for the \"plot line\" button"))
+
+(defvar gnuplot-region-xpm
+  (if (featurep 'xpm)
+      (toolbar-make-button-list
+       "/* XPM */
+static char *region[] = {
+/* width height num_colors chars_per_pixel */
+\"    40    40        5           1\",
+/* colors */
+\". c #000000\",
+\"a c #bebebe s backgroundToolBarColor\",
+\"b c #2f4f4f\",
+\"c c #ff6347\",
+\"d c #0000ff\",
+/* pixels */
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaa..aaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaa.a..a...aaa....a..aa...aa....aaaaa\",
+\"aaaaaa...a..a..a..a..a..a..a..a..a..aaaa\",
+\"aaaaaa..aa.....a.aa..a....aa..a.aa..aaaa\",
+\"aaaaa..a...aaaa..aa.a..a..aa....a..aaaaa\",
+\"aaaaa..a...a..a..a..a..a..a..a..a..aaaaa\",
+\"aaaa..aaaa...aaa....a..aa...aa..a..aaaaa\",
+\"aaaaaaaaaaaaaaaaa..aaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaadaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaadaaaaaaaaa\",
+\"aaaaaaa..aaaaaaaaaaaaaaaaaaaadaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaadaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaacaaaadaadaaaaaaaaaaaa\",
+\"aaaaaaaa.caaadaaaccaccadaddaaaaaccaaaaaa\",
+\"aaaaaaa..accdaddcaaaaaccaaaaaaccaaaaaaaa\",
+\"aaaaaaaa.aadcaccdaaaadaaccaaccaaaaaaaaaa\",
+\"aaaaaaaa.adaacaaaddadaaaaaccaaaaaaaaaaaa\",
+\"aaaaaaaa.daaaaaaaaadaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaa............................aaaaaa\",
+\"aaaaaaaa.aaaa.aaaa.aaaa.aaaa.aaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};")
+  "XPM format image used for the \"plot region\" button"))
+
+(defvar gnuplot-buffer-xpm
+  (if (featurep 'xpm)
+      (toolbar-make-button-list
+       "/* XPM */
+static char *buffer[] = {
+/* width height num_colors chars_per_pixel */
+\"    40    40        5           1\",
+/* colors */
+\". c #000000\",
+\"a c #bebebe s backgroundToolBarColor\",
+\"b c #2f4f4f\",
+\"c c #ff6347\",
+\"d c #0000ff\",
+/* pixels */
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa..aaaaaaaaaa......aaaaaaaaaaaaaa\",
+\"aaaaaaaa..aaaaaaaaa..a..aaaaaaaaaaaaaaaa\",
+\"aaaaaaa....aa..a.........a...aa.a.aaaaaa\",
+\"aaaaaaa..a..a..a..a..a..a..a..a...aaaaaa\",
+\"aaaaaaa.aa....aa..a..a..a.....a..aaaaaaa\",
+\"aaaaaa...a.a..a..a..a..a..aaaa..aaaaaaaa\",
+\"aaaaaa.....a..a..a..a..a..a..a..aaaaaaaa\",
+\"aaaaaa....aaa..a.a..a..aa...aa..aaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaadaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaadaaaaaaaaa\",
+\"aaaaaaa..aaaaaaaaaaaaaaaaaaaadaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaadaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaacaaaadaadaaaaaaaaaaaa\",
+\"aaaaaaaa.caaadaaaccaccadaddaaaaaccaaaaaa\",
+\"aaaaaaa..accdaddcaaaaaccaaaaaaccaaaaaaaa\",
+\"aaaaaaaa.aadcaccdaaaadaaccaaccaaaaaaaaaa\",
+\"aaaaaaaa.adaacaaaddadaaaaaccaaaaaaaaaaaa\",
+\"aaaaaaaa.daaaaaaaaadaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaa............................aaaaaa\",
+\"aaaaaaaa.aaaa.aaaa.aaaa.aaaa.aaaaaaaaaaa\",
+\"aaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};")
+  "XPM format image used for the \"plot buffer\" button"))
+
+(defvar gnuplot-doc-xpm
+  (if (featurep 'xpm)
+      (toolbar-make-button-list
+       "/* XPM */
+static char *book_index[] = {
+/* width height num_colors chars_per_pixel */
+\"    40    40        6            1\",
+/* colors */
+\". c #000000\",
+\"a c #bebebe s backgroundToolBarColor\",
+\"b c #2f4f4f\",
+\"c c #ff0000\",
+\"d c #ffffff\",
+\"e c #708090\",
+/* pixels */
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaa.........bbeaaaebb..........aaaaaa\",
+\"aaaaaa.ddddddddaaebebeaaddddddddd.aaaaaa\",
+\"aaaa...dab.bddeebadbdaeebedeeeeed...aaaa\",
+\"aaaa.c.dbaddddebeedbdeebeedebebed.c.aaaa\",
+\"aaaa.c.d.de.edeebeabdbbeeddebbbed.c.aaaa\",
+\"aaaa.c.dbad.ddebeadbdeeebeddeeeed.c.aaaa\",
+\"aaaa.c.dab..ddeeeedbdebeeedebebed.c.aaaa\",
+\"aaaa.c.dddddddeebeabdebebedeebedd.c.aaaa\",
+\"aaaa.c.debebedebeedbdbebeedbeeeeb.c.aaaa\",
+\"aaaa.c.debeeedeeeaabdaaddddebedbb.c.aaaa\",
+\"aaaa.c.deebeddbebedbdbaa.adeeedeb.c.aaaa\",
+\"aaaa.c.ddeebedeeebaba.dd.dddeeedd.c.aaaa\",
+\"aaaa.c.debeebdbeeedbd....ddeebeed.c.aaaa\",
+\"aaaa.c.deebeedeebadbd.dd.ddeeeedd.c.aaaa\",
+\"aaaa.c.dbbebddeeeeabd.aa.adebebbd.c.aaaa\",
+\"aaaa.c.deeeeedeebeabaedddddeeeedd.c.aaaa\",
+\"aaaa.c.dbebbbdebeadbdaeeeedebeeed.c.aaaa\",
+\"aaaa.c.deeebddeeebdbdeebeedeebeed.c.aaaa\",
+\"aaaa.c.debeeedebeeabdebebedebeebd.c.aaaa\",
+\"aaaa.c.deebbedeeeedbdeeeeddeeeeed.c.aaaa\",
+\"aaaa.c.dddddddddaadbdaddddddddddd.c.aaaa\",
+\"aaaa.c..........beabaeb...........c.aaaa\",
+\"aaaa.c.bbbbbbbbbb.bbbbbbbbbbbbbbb.c.aaaa\",
+\"aaaa.c.bbbbbbbbbb..e.bbbbbbbbbbbb.c.aaaa\",
+\"aaaa.c.bbbbbbbbbb.b.bbbbbbbbbbbbb.c.aaaa\",
+\"aaaa.c............e.e.............c.aaaa\",
+\"aaaa.cccccccccccc.a.a.ccccccccccccc.aaaa\",
+\"aaaa................................aaaa\",
+\"aaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};")
+  "XPM format image used for the \"document\" button"))
+
+(defvar gnuplot-help-xpm
+  (if (featurep 'xpm)
+      (toolbar-make-button-list
+       "/* XPM */
+static char *help_btn[] = {
+/* width height num_colors chars_per_pixel */
+\"    40    40        3            1\",
+/* colors */
+\"a c #bebebe s backgroundToolBarColor\",
+\"b c #000000\",
+\"c c #ff0000\",
+/* pixels */
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabbbbbbbbaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaabbbccccccccbbbaaaaaaaaaaaaa\",
+\"aaaaaaaaaaabbccccccccccccccbbaaaaaaaaaaa\",
+\"aaaaaaaaaabccccccccccccccccccbaaaaaaaaaa\",
+\"aaaaaaaaabccccccccccccccccccccbaaaaaaaaa\",
+\"aaaaaaaabcccccccbbbbbbbbcccccccbaaaaaaaa\",
+\"aaaaaaaabccccbbbaaaaaaaabbbccccbaaaaaaaa\",
+\"aaaaaaabccccbaaaaaaaaaaaaaabccccbaaaaaaa\",
+\"aaaaaaabcccbaaaaaaaaaaaaaaaabcccbaaaaaaa\",
+\"aaaaaaabcccbaaaaaaaaaaaaaaaabcccbaaaaaaa\",
+\"aaaaaaabcccbaaaaaaaaaaaaaaaabcccbaaaaaaa\",
+\"aaaaaaabbbbbaaaaaaaaaaaaaaabccccbaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaabbbccccbaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabbbbbbbbcccccccbaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabcccccccccccccbaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabccccccccccccbaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabccccccccccbbaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabccccbbbbbbaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabccccbaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabccccbaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabbbbbbaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabbbbbbaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabccccbaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabccccbaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabccccbaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaabbbbbbaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",
+\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};")
+  "XPM format image used for the \"help\" button"))
+
+(defvar gnuplot-toolbar
+  '([gnuplot-line-xpm
+     gnuplot-line-fn     t     "Plot the line under point"]
+    [gnuplot-region-xpm
+     gnuplot-region-fn   t     "Plot the selected region"]
+    [gnuplot-buffer-xpm
+     gnuplot-buffer-fn   t     "Plot the entire buffer"]
+    [:style 3d :size 8]
+    [gnuplot-help-xpm
+     gnuplot-help-fn     t     "Look at the gnuplot process buffer"]
+    [gnuplot-doc-xpm
+     gnuplot-doc-fn      t     "Look at the gnuplot document"])
+  "The gnuplot toolbar.")
+
+(fset 'gnuplot-line-fn   'gnuplot-send-line-and-forward)
+(fset 'gnuplot-region-fn 'gnuplot-send-region-to-gnuplot)
+(fset 'gnuplot-buffer-fn 'gnuplot-send-buffer-to-gnuplot)
+(fset 'gnuplot-help-fn   'gnuplot-show-gnuplot-buffer)
+(fset 'gnuplot-doc-fn    'gnuplot-info-lookup-symbol)
+
+(defvar gnuplot-all-buttons-defined
+  (and (listp gnuplot-line-xpm)   (listp gnuplot-region-xpm)
+       (listp gnuplot-buffer-xpm) (listp gnuplot-doc-xpm)
+       (listp gnuplot-help-xpm)))
+
+
+(defun gnuplot-make-toolbar-function ()
+  (if (and gnuplot-xemacs-p gnuplot-all-buttons-defined)
+      (progn
+       ;;(remove-specifier gnuplot-toolbar-use-toolbar (current-buffer))
+       (gnuplot-toolbar-setup-toolbar gnuplot-toolbar)
+       (add-spec-to-specifier (symbol-value gnuplot-toolbar-use-toolbar)
+                              gnuplot-toolbar
+                              (current-buffer) ))))
+
+;;(defalias 'gnuplot-make-toolbar 'gnuplot-make-toolbar-function)
+
+
+\f
+;;; --- syntax colorization, syntax table
+
+(defvar gnuplot-mode-syntax-table nil
+  "Syntax table in use in `gnuplot-mode' buffers.
+This is the same as the standard syntax table except that ' is a
+string quote character, ` and _ are word characters, and math
+operators are punctuation characters.")
+(if gnuplot-mode-syntax-table
+    ()
+  (setq gnuplot-mode-syntax-table (make-syntax-table))
+  (modify-syntax-entry ?* "."  gnuplot-mode-syntax-table)
+  (modify-syntax-entry ?+ "."  gnuplot-mode-syntax-table)
+  (modify-syntax-entry ?- "."  gnuplot-mode-syntax-table)
+  (modify-syntax-entry ?/ "."  gnuplot-mode-syntax-table)
+  (modify-syntax-entry ?% "."  gnuplot-mode-syntax-table)
+  ;;(modify-syntax-entry ?& "."  gnuplot-mode-syntax-table) ; rarely used
+  ;;(modify-syntax-entry ?^ "."  gnuplot-mode-syntax-table) ; operators
+  ;;(modify-syntax-entry ?| "."  gnuplot-mode-syntax-table) ; in gnuplot,
+  ;;(modify-syntax-entry ?& "."  gnuplot-mode-syntax-table) ; (by me,
+  ;;(modify-syntax-entry ?? "."  gnuplot-mode-syntax-table) ;  anyway...)
+  ;;(modify-syntax-entry ?~ "."  gnuplot-mode-syntax-table) ;
+  (modify-syntax-entry ?' "\"" gnuplot-mode-syntax-table)
+  (modify-syntax-entry ?` "w"  gnuplot-mode-syntax-table)
+  (modify-syntax-entry ?_ "w"  gnuplot-mode-syntax-table))
+
+
+(defvar gnuplot-font-lock-keywords nil)
+(defvar gnuplot-font-lock-keywords-1 nil)
+(defvar gnuplot-font-lock-keywords-2 nil)
+
+;; used make-regexp to generate the regular expression strings
+;; this is all pattern based
+;; (insert (format "%s"
+;;             (regexp-quote
+;;              (make-regexp
+;;               '("abs" "acos" "acosh" "arg" "asin" "asinh" "atan"
+;;                 "atan2" "atanh" "besj0" "besj1" "besy0" "besy1"
+;;                 "ceil" "cos" "cosh" "erf" "erfc" "exp" "floor"
+;;                 "gamma" "ibeta" "inverf" "igamma" "imag" "invnorm"
+;;                 "int" "lgamma" "log" "log10" "norm" "rand" "real"
+;;                 "sgn" "sin" "sinh" "sqrt" "tan" "tanh" "column"
+;;                 "tm_hour" "tm_mday" "tm_min" "tm_mon" "tm_sec"
+;;                 "tm_wday" "tm_yday" "tm_year" "valid")))))
+
+;; Set up colorization for gnuplot.
+;; This handles font-lock for emacs and xemacs.
+;; hilit19 is handled in `gnuplot-mode'.
+;; These regular expressions treat the gnuplot vocabulary as complete
+;; words.  Although gnuplot will recognise unique abbreviations, these
+;; regular expressions will not."
+(if (featurep 'font-lock)              ; <KL>
+    (setq gnuplot-font-lock-keywords
+         (list
+                                       ; comments
+          '("#.*$" . font-lock-comment-face)
+                                       ; quoted things
+          ;'("['\"]\\([^'\"\n]*\\)['\"]"
+          ;  1 font-lock-string-face)
+          '("'[^'\n]*'?" . font-lock-string-face)
+                                       ; stuff in brackets, sugg. by <LB>
+          '("\\[\\([^]]+\\)\\]"
+            1 font-lock-reference-face)
+                                       ; variable/function definitions
+          '("\\(\\<[a-z]+[a-z_0-9()]*\\)[ \t]*="
+            1 font-lock-variable-name-face)
+                                       ; built-in function names
+          (cons (concat
+                 "\\<\\("
+                 "a\\(bs\\|cosh\?\\|rg\\|sinh\?\\|"
+                 "tan\\(\\|\[2h\]\\)\\)\\|"
+                 "bes\\(j\[01\]\\|y\[01\]\\)\\|"
+                 "c\\(eil\\|o\\(lumn\\|sh\?\\)\\)\\|"
+                 "e\\(rfc\?\\|xp\\)\\|floor\\|gamma\\|"
+                 "i\\(beta\\|gamma\\|mag\\|"
+                 "n\\(t\\|v\\(erf\\|norm\\)\\)\\)\\|"
+                 "l\\(gamma\\|og\\(\\|10\\)\\)\\|"
+                 "norm\\|r\\(and\\|eal\\)\\|"
+                 "s\\(gn\\|inh\?\\|qrt\\)\\|"
+                 "t\\(anh\?\\|m_\\(hour\\|m\\(day\\|in\\|on\\)\\|"
+                 "sec\\|wday\\|y\\(day\\|ear\\)\\)\\)\\|"
+                 "valid"
+                 "\\)\\>")
+                font-lock-function-name-face)
+                                       ; reserved words associated with
+                                       ; plotting <AL>
+          '("\\<\\(axes\\|every\\|index\\|l\\(\[stw\]\\|ine\\(style\\|type\\|width\\)\\)\\|notitle\\|p\\(\[st\]\\|oint\\(size\\|type\\)\\)\\|smooth\\|t\\(hru\\|itle\\)\\|using\\|with\\)\\>" . font-lock-type-face)
+          '("\\<\\(box\\(e\\(rrorbars\\|s\\)\\|xyerrorbars\\)\\|candlesticks\\|dots\\|errorbars\\|f\\(inancebars\\|steps\\)\\|histeps\\|impulses\\|lines\\(\\|points\\)\\|points\\|steps\\|vector\\|x\\(errorbars\\|yerrorbars\\)\\|yerrorbars\\)\\>" . font-lock-function-name-face)
+                                       ; (s)plot -- also thing (s)plotted
+          '("\\<s?plot\\>" . font-lock-keyword-face)
+          '("\\<s?plot\\s-+\\([^'\" ]+\\)[) \n,\\\\]"
+            1 font-lock-variable-name-face)
+                                       ; other common commands
+                                       ; miscellaneous commands
+          (cons (concat "\\<\\("
+                        "bind\\|"
+                        "c\\(d\\|lear\\)\\|exit\\|fit\\|h\\(elp\\|istory\\)\\|load\\|"
+                        "p\\(ause\\|rint\\|wd\\)\\|quit\\|replot\\|"
+                        "s\\(ave\\|et\\|how\\)\\|unset"
+                        "\\)\\>\\|!.*$")
+                font-lock-reference-face))
+         gnuplot-font-lock-keywords-1 gnuplot-font-lock-keywords
+         gnuplot-font-lock-keywords-2 gnuplot-font-lock-keywords) )
+
+(if (and gnuplot-xemacs-p (featurep 'font-lock))
+    (put 'gnuplot-mode 'font-lock-defaults
+        '((gnuplot-font-lock-keywords
+           gnuplot-font-lock-keywords-1
+           gnuplot-font-lock-keywords-2)
+          t t ((?_ . "w")) )))
+
+;; these two lines get rid of an annoying compile time error
+;; message.  that function gets non-trivially defalias-ed in
+;; gnuplot-toolbar.el
+;; (defun gnuplot-make-toolbar-dummy ())
+;; (defalias 'gnuplot-make-toolbar 'gnuplot-make-toolbar-dummy)
+
+\f
+;;; --- functions for sending commands to gnuplot
+
+(defun gnuplot-split-string (string)
+  "Break STRING at each carriage return, returning a list of lines."
+  (let ((list ()) (line "") (index 0))
+    (while (< index (length string))
+      (if (char-equal (elt string index) ?\n)
+         (setq list (append list (list line))
+               line "")
+       (setq line (concat line (char-to-string (elt string index)))))
+      (setq index (1+ index)) )
+    list))
+
+;; -- the calls to `sleep-for' are to allow enough time for gnuplot
+;;    to write to the buffer before the next line is inserted
+;; -- note that the input string is split into lines and each line is
+;;    sent to gnuplot individually.  this is a bit slow, but it puts
+;;    each line on the comint history.
+(defun gnuplot-send-string-to-gnuplot (string text)
+  "Sends STRING to the gnuplot program.
+If no gnuplot process exists, a new one is created.  TEXT indicates
+the type of text being sent to gnuplot and is typically one of
+nil, 'line, 'region, 'buffer, or 'file.  TEXT may be useful for
+functions in `gnuplot-after-plot-hook'.  `gnuplot-after-plot-hook' is
+called by this function after all of STRING is sent to gnuplot."
+  (gnuplot-make-gnuplot-buffer)        ; make sure a gnuplot buffer exists
+  (or gnuplot-program-version
+      (progn
+       (message "Determining gnuplot version number (sitting for 2 seconds)")
+       (gnuplot-fetch-version-number)
+       (sit-for 2)))
+  (setq gnuplot-comint-recent-buffer (current-buffer))
+  (if (equal gnuplot-display-process 'frame)
+      (or (and gnuplot-process-frame
+              (frame-live-p gnuplot-process-frame))
+         (let ((frame (selected-frame)))
+           (setq gnuplot-process-frame (make-frame))
+           (select-frame gnuplot-process-frame)
+           (switch-to-buffer gnuplot-buffer)
+           (delete-other-windows)
+           (select-frame frame))) )
+  (let ((buffer  (current-buffer))
+       (gbuffer (get-buffer gnuplot-buffer))
+       (list    (gnuplot-split-string string)))
+    (set-buffer gbuffer)
+    (goto-char (point-max))
+    ;; bruce asks: what is this next line for?
+    (set-marker (process-mark gnuplot-process) (point-marker))
+    (sleep-for (* 20 gnuplot-delay))
+    (while list
+      (insert (car list))
+      (comint-send-input)
+      (sleep-for gnuplot-delay)
+      (setq list (cdr list))
+      (goto-char (point-max)))
+    (set-buffer buffer)
+    (cond ((equal gnuplot-display-process 'window)
+          (select-window (display-buffer gbuffer))
+          (goto-char (point-max))
+          (or (pos-visible-in-window-p (point) (selected-window))
+              (recenter 5))
+          (other-window 1))
+         ((equal gnuplot-display-process 'frame)
+          ;;(raise-frame gnuplot-process-frame)
+          (select-frame gnuplot-process-frame)
+          (display-buffer gbuffer)
+          (goto-char (point-max))
+          (or (pos-visible-in-window-p (point) (selected-window))
+              (recenter 5))))
+    ;;(process-send-string gnuplot-program string)
+    (setq gnuplot-recently-sent text)
+    (run-hooks 'gnuplot-after-plot-hook)))
+
+(defun gnuplot-send-region-to-gnuplot (&optional begin end text)
+  "Sends a selected region to the gnuplot program.
+If BEGIN and END are not specified, point and mark are used.  TEXT
+indicates the type of text being sent to gnuplot.  This will be
+'region unless explicitly set by a function calling this one.  Other
+typical values are of nil, 'line, 'buffer, or 'file.  TEXT may be
+useful for function in `gnuplot-after-plot-hook'."
+  (interactive "r")
+  (let (string (txt (or text 'region)))
+    (cond ((equal major-mode 'gnuplot-mode)
+          (setq string (buffer-substring-no-properties begin end))
+          (if (string= (substring string -1) "\n") ()
+            (setq string (concat string "\n")))
+          (gnuplot-send-string-to-gnuplot string txt))
+         (t
+          (message (concat "You can only send regions from "
+                           "gnuplot-mode buffers to gnuplot."))))))
+
+(defun gnuplot-send-line-to-gnuplot ()
+  "Sends the current line to the gnuplot program.
+Respects continuation lines.
+This sets `gnuplot-recently-sent' to 'line."
+  (interactive)
+  (cond ((equal major-mode 'gnuplot-mode)
+        (let ((start (save-excursion (beginning-of-line)   (point-marker)))
+              end
+              ;(end   (save-excursion (beginning-of-line 2) (point-marker)))
+              )
+           (save-excursion
+            (goto-char start)
+            (end-of-line)
+            (backward-char 1)
+            (while (looking-at "\\\\") ; go to end of last continuation line
+              (end-of-line 2)
+              (backward-char 1))
+            (beginning-of-line 2)
+            (setq end (point-marker)))
+          (if (not (string-match "\\`\\s-*\\'"
+                                 (buffer-substring-no-properties start end)))
+              (gnuplot-send-region-to-gnuplot start end 'line))
+          end))
+       (t
+        (message "You can only send lines in gnuplot-mode buffers to gnuplot.")
+        nil)))
+
+;; I chose a very easy to type but slightly non-mnemonic key-binding
+;; for this (C-c C-v).  It seems like the kind of thing one would want
+;; to do repeatedly without incurring RSI. 8^)
+(defun gnuplot-send-line-and-forward (&optional num)
+  "Call `gnuplot-send-line-to-gnuplot' and move forward 1 line.
+You can use a numeric prefix to send more than one line.  Blank lines and
+lines with only comments are skipped when moving forward."
+  (interactive "p")
+  (let (end)
+    (while (> num 0)
+      (setq end (gnuplot-send-line-to-gnuplot))
+      (goto-char end)
+      (backward-char 1)                        ; <AR>
+      (gnuplot-forward-script-line 1)
+      (setq num (1- num)))))
+
+
+(defun gnuplot-forward-script-line (&optional num) ; <SE>
+  "Move forward my NUM script lines.
+Blank lines and commented lines are not included in the NUM count."
+  (interactive "p")
+  (while (> num 0)
+    (and (not (eobp)) (forward-line 1))
+    (while (and (not (eobp))
+               (or (looking-at "^\\s-*$")
+                   (looking-at "^\\s-*#")))
+      (forward-line 1))
+    (setq num (1- num))) )
+
+(defun gnuplot-send-buffer-to-gnuplot ()
+  "Sends the entire buffer to the gnuplot program.
+This sets `gnuplot-recently-sent' to 'buffer."
+  (interactive)
+  (if (equal major-mode 'gnuplot-mode)
+      (gnuplot-send-region-to-gnuplot (point-min) (point-max) 'buffer)
+    (message "You can only send gnuplot-mode buffers to gnuplot.")))
+
+(defun gnuplot-send-file-to-gnuplot ()
+  "Sends a selected file to the gnuplot program using the \"load\" command.
+This sets `gnuplot-recently-sent' to 'file."
+  (interactive)
+  (let ((string (read-file-name "Name of file to send to gnuplot > " nil nil t)))
+    (setq string (concat "load '" (expand-file-name string) "'\n"))
+    (message "%S" string)
+    (gnuplot-make-gnuplot-buffer)      ; make sure a gnuplot buffer exists
+    (gnuplot-send-string-to-gnuplot string 'file)))
+
+;; suggested by <JS>
+(defun gnuplot-plot-from-comint ()
+  "Send the contents of a script to gnuplot from the process buffer.
+This inserts the contents of the most recently used gnuplot script
+into the process buffer and sends those lines to gnuplot.  It does
+this by copying the script line by line."
+  (interactive)
+  (if (equal major-mode 'comint-mode)
+      (let (string list (buffer (current-buffer)))
+       (set-buffer gnuplot-comint-recent-buffer)
+       (setq string (buffer-substring-no-properties (point-min) (point-max))
+             string (concat string "\n")
+             list   (gnuplot-split-string string))
+       (set-buffer buffer)
+       (while list
+         (insert (car list))
+         (comint-send-input)
+         (sleep-for gnuplot-delay)
+         (setq list (cdr list)))
+       (comint-send-input))
+    (message
+     "`gnuplot-plot-from-comint' only works in the gnuplot process buffer")))
+
+(defun gnuplot-save-and-plot-from-comint ()
+  "Send a current script to gnuplot from the process buffer.
+This sends the most recently used gnuplot script to gnuplot using the
+\"load\" command.  This function first saves the script buffer to a
+file, prompting for a filename if one is not associated with the script
+buffer.  Then it sends a load command to gnuplot using the name of the
+file visited by the script buffer."
+  (interactive)
+  (if (equal major-mode 'comint-mode)
+      (let (fname (buffer (current-buffer)))
+       (set-buffer gnuplot-comint-recent-buffer)
+       (save-buffer)
+       (setq fname (buffer-file-name))
+       (set-buffer buffer)
+       (goto-char (point-max))
+       (insert (format "load '%s'" fname))
+       (comint-send-input))
+    (message (concat "`gnuplot-save-and-plot-from-comint' only works "
+                    "in the gnuplot process buffer"))))
+
+
+(defun gnuplot-trim-gnuplot-buffer ()
+  "Trim lines form the beginning of the *gnuplot* buffer.
+This keeps that buffer from growing excessively in size.  Normally,
+this function is attached to `gnuplot-after-plot-hook'"
+  (if (> gnuplot-buffer-max-size 0)
+      (save-excursion
+       (set-buffer gnuplot-buffer)
+       (let ((nlines (count-lines (point-min) (point-max)))
+             (kill-whole-line t))
+         (while (> nlines gnuplot-buffer-max-size)
+           (goto-char (point-min))
+           (kill-line)
+           (setq nlines (1- nlines)))
+         (goto-char (point-max)) ))))
+(add-hook 'gnuplot-after-plot-hook 'gnuplot-trim-gnuplot-buffer nil nil)
+
+\f
+;;; --- functions controlling the gnuplot process
+
+;; use of comint-setup-hook suggested by <DB>
+(defun gnuplot-comint-start-function ()
+  "Function run when comint/gnuplot started.
+This sets font-lock and keyword completion in the comint/gnuplot
+buffer.  Further customization is possible via
+`gnuplot-comint-setup-hook'."
+  ;;(if (not (fboundp 'hilit-set-mode-patterns))
+  (if (featurep 'font-lock)
+      (progn
+       (make-variable-buffer-local 'font-lock-defaults)
+       (setq font-lock-defaults '(gnuplot-font-lock-keywords t t))
+       (if gnuplot-xemacs-p (turn-on-font-lock))))
+  ;;(if (featurep 'kw-compl)
+  ;;    (progn
+  ;;   (setq kw-compl-list gnuplot-keywords
+  ;;         kw-compl-upper-case nil)
+  ;;   (define-key comint-mode-map "\M-\r" 'kw-compl-abbrev)))
+  (define-key comint-mode-map "\M-\C-p" 'gnuplot-plot-from-comint)
+  (define-key comint-mode-map "\M-\C-f" 'gnuplot-save-and-plot-from-comint)
+  (define-key comint-mode-map "\C-d"    'gnuplot-delchar-or-maybe-eof)
+  (define-key comint-mode-map "\M-\r"   'gnuplot-complete-keyword)
+  (define-key comint-mode-map "\M-\t"   'gnuplot-complete-keyword)
+  (run-hooks 'gnuplot-comint-setup-hook))
+
+(defun gnuplot-make-gnuplot-buffer ()
+  "Switch to the gnuplot program buffer or create one if none exists."
+  (or (and gnuplot-process (get-process gnuplot-process)
+          gnuplot-buffer (get-buffer gnuplot-buffer))
+      (progn
+       (message "Starting gnuplot plotting program...")
+       (setq gnuplot-buffer (make-comint gnuplot-process-name gnuplot-program)
+             gnuplot-process (get-process gnuplot-process-name))
+       (process-kill-without-query gnuplot-process nil)
+       (save-excursion
+         (set-buffer gnuplot-buffer)
+         (make-local-hook 'kill-buffer-hook)
+         (add-hook 'kill-buffer-hook 'gnuplot-close-down nil t)
+         (gnuplot-comint-start-function)
+          (make-local-variable 'comint-output-filter-functions)
+          (setq comint-output-filter-functions
+                (append comint-output-filter-functions
+                        '(comint-postoutput-scroll-to-bottom
+                          gnuplot-protect-prompt-fn)))
+         (message "Starting gnuplot plotting program...Done")))))
+
+
+(defun gnuplot-fetch-version-number ()
+  ;;(interactive)
+  (message "gnuplot-mode %s -- determining gnuplot version ......"
+          gnuplot-version)
+  (let* ((command (concat "echo \"show version\" | " gnuplot-program))
+        (process (start-process-shell-command "gnuplot-version"
+                                              "*gnuplot-version*"
+                                              command)))
+    (set-process-sentinel process 'gnuplot-determine-version-number)))
+
+(defun gnuplot-determine-version-number (process event)
+  (save-excursion
+    (let (version)
+      (if (string-match "SPEEDBAR" (format "%S" (current-buffer))) ;; <WZ>
+         (if (fboundp 'speedbar-switch-buffer-attached-frame)
+             (speedbar-switch-buffer-attached-frame "*gnuplot-version*")
+           (progn
+             (speedbar-select-attached-frame)
+             (switch-to-buffer "*gnuplot-version*")))
+       (switch-to-buffer "*gnuplot-version*"))
+      (goto-char (point-min))
+      (re-search-forward "[Vv]ersion\\s-+" (point-max) t)
+      (if (looking-at "[0-9]\\.[0-9]+")
+         (setq version (match-string 0))
+       (setq version "3.7"))
+      (kill-buffer (get-buffer "*gnuplot-version*"))
+      ;;(and (interactive-p) (message "You are using gnuplot version %s" version))
+      (setq gnuplot-program-version version
+           gnuplot-three-eight-p (>= (string-to-number gnuplot-program-version) 3.8))
+      (gnuplot-setup-menu-and-toolbar)
+      )))
+
+(defun gnuplot-setup-menu-and-toolbar ()
+  ;; set up the menubar (possibly dependent on version number)
+  (gnuplot-setup-menubar)
+  ;; set up the toolbar (possibly dependent on version number)
+  (if (and gnuplot-xemacs-p gnuplot-toolbar-display-flag)
+      (condition-case ()               ; deal with the toolbar
+         (and (require 'toolbar)
+              (require 'xpm)
+              (gnuplot-make-toolbar-function))
+       (error nil)))
+  (message "gnuplot-mode %s (gnuplot %s) -- report bugs with %S"
+          gnuplot-version gnuplot-program-version
+          (substitute-command-keys "\\[gnuplot-bug-report]"))
+  )
+
+
+
+;; (defun gnuplot-determine-gnuplot-version ()
+;;   "Figure out which version of gnuplot we are running."
+;;   (interactive)
+;;   (cond (gnuplot-gnuplot-version
+;;      (setq comint-process-echoes nil          ;; t
+;;            gnuplot-program-version gnuplot-gnuplot-version))
+;;     (t
+;;      (let ((counter 0))
+;;        (save-excursion
+;;          (set-buffer gnuplot-buffer)
+;;          (goto-char (point-min))
+;;          ;; it may take a while for emacs to display the gnuplot start-up
+;;          ;; message.  since we need this to determine the version number
+;;          ;; and hence the value of `comint-process-echoes', we must wait
+;;          ;; for this to happen.
+;;          (while (and (equal (point-max) (point-min)) (< 10 counter))
+;;            (1+ counter)
+;;            (sleep-for 0.1))
+;;          (if (re-search-forward "[Vv]ersion" (point-max) t)
+;;              (progn
+;;                (cond ((or (looking-at "\\s-*3.8") (looking-at "\\s-*4"))
+;;                       (setq comint-process-echoes nil          ;; t
+;;                             gnuplot-program-version "3.8"))
+;;                      ((looking-at "\\s-*3.7")
+;;                       (setq comint-process-echoes nil          ;; t
+;;                             gnuplot-program-version "3.7"))
+;;                      (t
+;;                       (setq comint-process-echoes nil
+;;                             gnuplot-program-version "3.5") )))
+;;            (setq comint-process-echoes gnuplot-echo-command-line-flag)))))))
+
+(defun gnuplot-protect-prompt-fn (string)
+  "Prevent the Gnuplot prompt from being deleted or overwritten.
+STRING is the text as originally inserted in the comint buffer."
+  (save-excursion
+    (let ((b (progn
+               (goto-char (point-max))
+               (beginning-of-line)
+               (point)))
+          e)
+      (if (re-search-forward "^gnuplot> " (point-max) t)
+          (progn
+            (setq e (point))
+            (put-text-property b e 'rear-nonsticky '(read-only intangible face))
+            (put-text-property b e 'intangible t)
+            (put-text-property b e 'face 'gnuplot-prompt-face)
+            ;;(put-text-property b e 'read-only t)
+           )) )))
+
+(defun gnuplot-close-down ()
+  "Tidy up when deleting the gnuplot buffer."
+  (if (eq (process-status gnuplot-process) 'run);; <SE>
+      (kill-process gnuplot-process))
+  (setq gnuplot-process nil
+        gnuplot-buffer nil))
+
+(defun gnuplot-delchar-or-maybe-eof (arg)
+  "Delete ARG characters forward, or (if at eob) send an EOF to subprocess.
+This is very similar to `comint-delchar-or-maybe-eof'."
+  (interactive "p")
+  (if (eobp)
+      (gnuplot-kill-gnuplot-buffer)
+    (delete-char arg)))
+
+(defun gnuplot-kill-gnuplot-buffer ()
+  "Kill the gnuplot process and its display buffers."
+  (interactive)
+  (if (and gnuplot-process
+          (eq (process-status gnuplot-process) 'run))  ;; <SE>
+      (kill-process gnuplot-process))
+  (if (and gnuplot-buffer (get-buffer gnuplot-buffer))
+      (progn
+       (if (one-window-p) ()
+         (delete-window (get-buffer-window gnuplot-buffer)))
+       (kill-buffer gnuplot-buffer)))
+  (setq gnuplot-process nil
+        gnuplot-buffer nil))
+
+
+(defun gnuplot-show-gnuplot-buffer ()
+  "Switch to the buffer containing the gnuplot process.
+When `gnuplot-display-process' is nil this will switch to
+the gnuplot process buffer.  When that variable is non-nil, the
+gnuplot process buffer will be displayed in a window."
+  (interactive)
+  (if (and gnuplot-buffer (get-buffer gnuplot-buffer))
+      (cond ((equal gnuplot-display-process 'window)
+            (switch-to-buffer-other-window gnuplot-buffer))
+           ((equal gnuplot-display-process 'frame)
+            (or (and gnuplot-process-frame
+                     (frame-live-p gnuplot-process-frame))
+                (setq gnuplot-process-frame (make-frame)))
+            (raise-frame gnuplot-process-frame)
+            (select-frame gnuplot-process-frame)
+            (switch-to-buffer gnuplot-buffer))
+           (t
+            (switch-to-buffer gnuplot-buffer)))
+    (message "There is not an active Gnuplot process.")))
+
+\f
+;;; --- miscellaneous functions: insert file name, indentation, negation
+
+(defun gnuplot-insert-filename ()
+  "Insert a filename at point, prompting for name in the minibuffer.
+This inserts a filename relative to the buffer's default directory.
+Uses completion and the value of `gnuplot-quote-character'.
+Bound to \\[gnuplot-insert-filename]"
+  (interactive)
+  (insert gnuplot-quote-character
+         (file-relative-name (read-file-name "Filename > " "")
+                             default-directory)
+         gnuplot-quote-character) )
+
+;; is this more complicated than it need be ...?
+;; this doesn't quite do plot lists correctly:
+;;   plot sin(x),\
+;;        cos(x)         # ok
+;;        set auto       # not ok, should be under "p" (but does it matter?)
+
+(defun gnuplot-indent-line ()
+  "Set indentation in gnuplot buffer.
+For most lines, set indentation to previous level of indentation.
+Attempt to add additional indentation for continued plot and splot
+lines."
+  (interactive)
+  (let ((indent 0))
+    (save-excursion
+      (save-excursion
+       (end-of-line 0)
+       (if (bobp) ()
+         (re-search-backward "^[ \t]*." (point-min) "to_limit")
+         (back-to-indentation)
+         (setq indent (current-column))
+         (if (looking-at "s?pl\\(o?\\|\\(ot\\)?\\)[ \t]+.?")
+             (let ((plus (1- (length (match-string 0)))))
+               (end-of-line)
+               (backward-char 1)
+               (if (looking-at (regexp-quote "\\"))
+                   (setq indent  (+ plus indent)))))))
+      (if (= (current-indentation) indent)
+         ()
+       (beginning-of-line)
+       (delete-horizontal-space)
+       (insert (make-string indent ? ))))
+    (if (looking-at "[ \t]+$")
+       (end-of-line))))
+
+;; FWIW, here are all the options which can be negated:
+;; (insert (format "%s"
+;;             (regexp-quote
+;;              (make-regexp
+;;               '("arrow" "autoscale" "border" "clabel" "clip"
+;;                 "contour" "dgrid3d" "grid" "hidden3d" "key" "label"
+;;                 "linestyle" "logscale" "multiplot" "mxtics"
+;;                 "mytics" "mztics" "mx2tics" "my2tics"
+;;                 "offsets" "polar" "surface" "timestamp" "title"
+;;                 "xdtics" "ydtics" "zdtics" "x2dtics" "y2dtics"
+;;                 "xmtics" "ymtics" "zmtics" "x2mtics" "y2mtics"
+;;                 "xtics" "ytics" "ztics" "x2tics" "y2tics"
+;;                 "xzeroaxis" "yzeroaxis" "zzeroaxis" "x2zeroaxis"
+;;                 "y2zeroaxis")))))
+
+(defun gnuplot-negate-option ()
+  "Append \"no\" to or remove \"no\" from the set option on the current line.
+This checks if the set option is one which has a negated form."
+  (interactive)
+  (let ((begin (save-excursion (beginning-of-line) (point-marker)))
+       (end   (save-excursion (end-of-line)       (point-marker)))
+       (regex "a\\(rrow\\|utoscale\\)\\|border\\|c\\(l\\(abel\\|ip\\)\\|ontour\\)\\|dgrid3d\\|grid\\|hi\\(dden3d\\|storysize\\)\\|key\\|l\\(abel\\|inestyle\\|ogscale\\)\\|m\\(ouse\\|ultiplot\\|x\\(2tics\\|tics\\)\\|y\\(2tics\\|tics\\)\\|ztics\\)\\|offsets\\|polar\\|surface\\|ti\\(mestamp\\|tle\\)\\|x\\(2\\(dtics\\|mtics\\|tics\\|zeroaxis\\)\\|dtics\\|mtics\\|tics\\|zeroaxis\\)\\|y\\(2\\(dtics\\|mtics\\|tics\\|zeroaxis\\)\\|dtics\\|mtics\\|tics\\|zeroaxis\\)\\|z\\(dtics\\|mtics\\|tics\\|zeroaxis\\)"))
+    (save-excursion
+      (if (search-backward ";" begin t)
+         (progn (forward-char  1) (setq begin (point-marker))))
+      (if (search-forward  ";" end   t)
+         (progn (forward-char -1) (setq end   (point-marker))))
+      (goto-char begin)
+      (skip-syntax-forward "-" end)
+      (if (looking-at "\\(un\\)?set\\s-+")
+         (cond ((and gnuplot-program-version
+                     (> (string-to-number gnuplot-program-version) 3.7))
+                (cond ((looking-at "unset")
+                       (delete-char 2))
+                      ((looking-at (concat "set\\s-+\\(" regex "\\)"))
+                       (insert "un"))
+                      (t
+                       (message "There is not a negatable set option on this line"))))
+               (t
+                (goto-char (match-end 0))
+                (if (> (point) end) (goto-char end))
+                (cond ((looking-at "no")
+                       (delete-char 2))
+                      ((looking-at regex)
+                       (insert "no"))
+                      (t
+                       (message "There is not a negatable set option on this line")))))
+       (message "There is not a set option on this line")) )))
+
+;; (defun gnuplot-set-binding ()
+;;   "Interactively select a key sequence for binding to a plot function.
+;; This is only useful in gnuplot 3.8 and for plot terminals which support
+;; key bindings (i.e. those covered by pm3d)."
+;;   (interactive)
+;;   (let ((keyseq (read-key-sequence "Choose a key sequence now"))
+;;     (command (read-string "Bind to this command > ")))
+;;     (setq keyseq (format "%S" keyseq))
+;;     (string-match "keypress-event\\s-+" keyseq)
+;;     (setq keyseq (substring keyseq (match-end 0) -2))
+;;     ;; need to convert from emacs nomenclature to gnuplot.  what a pain.
+;;     (let* ((alist '(("backspace" . "Backspace") ("tab" . "Tab") ("linefeed" . "Linefeed")
+;;                 ("clear" . "Clear") ("return" . "Return") ("pause" . "Pause")
+;;                 ("scroll-lock" . "Scroll_Lock") ("SysReq" . "sys-req")
+;;                 ("escape" . "Escape") ("delete" . "Delete") ("home" . "Home")
+;;                 ("left" . "Left") ("right" . "Right") ("up" . "Up") ("down" . "Down")
+;;                 ("prior" . "PageUp") ("next" . "PageDown") ("end" . "End")
+;;                 ("begin". "Begin")))
+;;        (match (assoc keyseq alist)))
+;;       (if match (setq keyseq (cdr match)))
+;;
+;;     (insert (format "bind \"%s\" \"%s\"" keyseq command)))))
+
+
+(defun gnuplot-customize ()
+  "Customize `gnuplot-mode'."
+  (interactive)
+  (if (fboundp 'customize-group)
+      (customize-group "gnuplot")
+    (message "The Custom library is not installed.")))
+
+
+\f
+;;; --- help from the info file, keyword list + completion, insert function
+
+
+;; set up stuff for info-look (as suggested by <SE>)
+;; modified with suggestion from <MS>
+(defun gnuplot-setup-info-look ()
+  "Setup info-look in the gnuplot buffer.
+Also set the variable `gnuplot-keywords' and do something sensible if
+info-look was not available.
+See the comments in `gnuplot-info-hook'."
+  (interactive)
+  (setq gnuplot-keywords-pending nil)
+  (if (featurep 'info-look)
+      (progn
+       (cond ((boundp 'info-lookup-symbol-alist) ; older version
+              (setq info-lookup-symbol-alist
+                    (append
+                     info-lookup-symbol-alist
+                     '((gnuplot-mode
+                        "[a-zA-Z][_a-zA-Z0-9]*" nil
+                        (("(gnuplot)Top"           nil "[_a-zA-Z0-9]+")
+                         ("(gnuplot)Commands"      nil "[_a-zA-Z0-9]+")
+                         ("(gnuplot)Functions"     nil "[_a-zA-Z0-9]+")
+                         ("(gnuplot)plot"          nil "[_a-zA-Z0-9]+")
+                         ("(gnuplot)set-show"      nil "[_a-zA-Z0-9]+")
+                         ("(gnuplot)data-file"     nil "[_a-zA-Z0-9]+")
+                         ("(gnuplot)smooth"        nil "[_a-zA-Z0-9]+")
+                         ("(gnuplot)style"         nil "[_a-zA-Z0-9]+")
+                         ("(gnuplot)terminal"      nil "[_a-zA-Z0-9]+")
+                         ;;("(gnuplot)General Index" nil "[_a-zA-Z0-9]+")
+                         ) "[_a-zA-Z0-9]+" ))) ))
+             (t                        ; newer version
+              (info-lookup-maybe-add-help
+               :mode 'gnuplot-mode :topic 'symbol
+               :regexp "[a-zA-Z][_a-zA-Z0-9]*"
+               :doc-spec '(("(gnuplot)Top"           nil "[_a-zA-Z0-9]+")
+                           ("(gnuplot)Commands"      nil "[_a-zA-Z0-9]+")
+                           ("(gnuplot)Functions"     nil "[_a-zA-Z0-9]+")
+                           ("(gnuplot)plot"          nil "[_a-zA-Z0-9]+")
+                           ("(gnuplot)set-show"      nil "[_a-zA-Z0-9]+")
+                           ("(gnuplot)data-file"     nil "[_a-zA-Z0-9]+")
+                           ("(gnuplot)smooth"        nil "[_a-zA-Z0-9]+")
+                           ("(gnuplot)style"         nil "[_a-zA-Z0-9]+")
+                           ("(gnuplot)terminal"      nil "[_a-zA-Z0-9]+")
+                           ) )))
+       ;; this hook is my best way of working with info-look and
+       ;; allowing multiple versions of the gnuplot-info file.
+       ;; yes, this is a hassle.
+       (run-hooks 'gnuplot-info-hook)
+       (let ((there (bufferp (get-buffer "*info*"))))
+         (info-lookup-setup-mode 'symbol 'gnuplot-mode)
+         (or there (and (get-buffer "*info*") (kill-buffer "*info*")))
+         ;; why are these buffers here?  I think that the general
+         ;; user will not want them lying around
+         (and (get-buffer "info dir")    (kill-buffer "info dir"))
+         (and (get-buffer "info dir<2>") (kill-buffer "info dir<2>")))
+       (setq gnuplot-keywords (gnuplot-set-keywords-list))
+       )
+
+    ;; or do something sensible if info-look is not installed
+    (defun info-lookup-interactive-arguments (symbol)
+      (message
+       "Help is not available.  The gnuplot info file could not be found.")
+      (list nil nil))) )
+
+
+(defun gnuplot-set-keywords-list ()
+  "Set `gnuplot-keywords' from `info-lookup-cache'.
+Return a list of keywords."
+  (let* ((list (cdr (assoc 'symbol info-lookup-cache)))
+        (list (cdr (cdr (assoc 'gnuplot-mode list))))
+        (list (car list))
+        (store ()) item)
+    (while list
+      (setq item (car (car list))
+           item (format "%s" item) ; keep this line for the sake of
+           store (append (list item) store) ; info-look.el w/o my patch
+           list  (cdr list)))
+    (delete "nil" store)
+    store ))
+
+
+(defun gnuplot-complete-keyword ()
+  "Perform completion on keyword preceding point.
+This is a pretty simple minded completion function.  It is loosely
+adapted from `lisp-complete-symbol'."
+  (interactive)
+  (if gnuplot-keywords-pending         ; <HW>
+      (gnuplot-setup-info-look))
+  (let* ((end (point))
+        (beg (unwind-protect (save-excursion (backward-sexp 1) (point))))
+        (patt (buffer-substring beg end))
+        (pattern (if (string-match "\\([^ \t]*\\)\\s-+$" patt)
+                     (match-string 1 patt) patt))
+        (alist (mapcar 'list gnuplot-keywords))
+        (completion (try-completion pattern alist)))
+    (cond ((eq completion t))
+         ((null completion)
+          (message "No gnuplot keywords complete \"%s\"" pattern))
+         (t
+          (when (not (string= pattern completion))
+            (delete-region beg end)
+            (insert completion))
+          (let* ((list (all-completions pattern alist))
+                 (mess (format "%S could be one of %S" pattern list))
+                 (orig (current-buffer))
+                 (buff (get-buffer-create " *gnuplot-completions*")))
+            (if (= (length list) 1) (insert " "))
+            (if (< (length mess) (frame-width))
+                (if (> (length list) 1) (message mess))
+              (switch-to-buffer-other-window buff)
+              (insert mess)
+              (fill-region (point-min) (point-max))
+              (goto-char (point-min))
+              (enlarge-window
+               (+ 2 (- (count-lines (point-min) (point-max))
+                       (window-height))))
+              (sit-for (max (length list) 15))
+              (switch-to-buffer orig)
+              (kill-buffer buff)
+              (delete-other-windows) ))) )))
+
+(defun gnuplot-info-lookup-symbol (symbol &optional mode)
+  "Wrapper for `info-lookup-symbol'.
+Takes SYMBOL and MODE as arguments exactly as `info-lookup-symbol'.
+After doing the info lookup, this displays the info file in a window
+frame as specified by the value of `gnuplot-info-display'.  If
+`gnuplot-info-display' is 'window, then the window will be shrunk to
+the size of the info entry if it is smaller than half the height of
+the frame."
+  (interactive
+   (cond (gnuplot-keywords
+         (info-lookup-interactive-arguments 'symbol))
+        (gnuplot-keywords-pending      ; <HW>
+         (gnuplot-setup-info-look)
+         (info-lookup-interactive-arguments 'symbol))
+        (t
+         (list nil (message
+       "Help is not available.  The gnuplot info file could not be found.")))))
+  (if (and (featurep 'info-look) gnuplot-keywords)
+      (let ((buff (current-buffer))
+           (info-lookup-other-window-flag
+            (if gnuplot-info-display t nil)))
+       (if symbol () (setq symbol "Commands"))
+       (info-lookup-symbol symbol mode)
+       (cond ((equal gnuplot-info-display 'window)
+              (let ((sw (selected-window))
+                    (window-min-height 2))
+                (other-window 1)
+                (enlarge-window
+                 (min (- (count-lines (point-min) (point-max)) (window-height))
+                      (- (/ (frame-height) 2) (window-height))))
+                (select-window sw)))
+             ((equal gnuplot-info-display 'frame)
+              (switch-to-buffer buff)
+              (delete-other-windows)
+              (or (and gnuplot-info-frame
+                       (frame-live-p gnuplot-info-frame))
+                  (setq gnuplot-info-frame (make-frame)))
+              (select-frame gnuplot-info-frame)
+              (raise-frame gnuplot-info-frame)
+              (if gnuplot-xemacs-p (setq toolbar-info-frame gnuplot-info-frame))
+              (switch-to-buffer "*info*") )) )))
+
+
+(defun gnuplot-insert (string)
+  "Insert STRING at point and display help for for STRING.
+Help is not shown if `gnuplot-insertions-show-help-flag' is nil.  The
+help shown is for STRING unless STRING begins with the word \"set\" or
+\"show\", in which case help is shown for the thing being set or
+shown."
+  (interactive)
+  (cond ((and (not gnuplot-three-eight-p)
+             (string-match "\\(emf\\|p\\(alette\\|m3d\\)\\|vgagl\\)" string))
+        (message "%S is an option introduced in gnuplot 3.8 (You are using %s)"
+                 string gnuplot-program-version) )
+       (t
+        (insert string)
+        (let ((topic string) term)
+          (if (string-match
+               "\\(set\\|show\\)[ \t]+\\([^ \t]+\\)\\(\\s-+\\([^ \t]+\\)\\)?"
+               string)
+              (progn
+                (setq topic (downcase (match-string 2 string))
+                      term            (match-string 4 string))
+                (if (string= topic "terminal") (setq topic (downcase term)))))
+          (cond ((and (fboundp 'gnuplot-gui-set-options-and-insert)
+                      gnuplot-gui-popup-flag)
+                 (gnuplot-gui-set-options-and-insert))
+                (gnuplot-insertions-show-help-flag
+                 (if gnuplot-keywords-pending          ; <HW>
+                     (gnuplot-setup-info-look))
+                 (gnuplot-info-lookup-symbol topic)) ) )) ) )
+
+(defun gnuplot-toggle-info-display ()
+  (interactive)
+  (setq gnuplot-insertions-show-help-flag (not gnuplot-insertions-show-help-flag))
+  (message (if gnuplot-insertions-show-help-flag
+              "Help will be displayed after insertions."
+            "Help no longer displayed after insertions.")))
+
+\f
+;;; --- bug reports
+;; grep '(defcustom' gnuplot.el gnuplot-gui.el | awk '{print $2}'
+(defun gnuplot-bug-report ()
+  "Submit a bug report about `gnuplot-mode' by email.
+Please do not send any bug reports about gnuplot itself to the
+maintainer of `gnuplot-mode'."
+  (interactive)
+  (let ((line (make-string 62 ?-)))
+    (require 'reporter)
+    (and (y-or-n-p
+         "Do you really want to submit an email report about gnuplot? ")
+        (y-or-n-p
+         (concat "Variable values will be written to the message.  "
+                 "Don't erase them.  OK? "))
+        (reporter-submit-bug-report
+         (format "%s <%s>" gnuplot-maintainer gnuplot-maintainer-email)
+         (format "gnuplot-mode (version %s)" gnuplot-version)
+         (append      ; variables to display values of in mail
+          '(gnuplot-mode-hook
+            gnuplot-load-hook
+            gnuplot-after-plot-hook
+            gnuplot-info-hook
+            gnuplot-comint-setup-hook
+            gnuplot-program
+            gnuplot-program-version
+            gnuplot-process-name
+            gnuplot-gnuplot-buffer
+            gnuplot-display-process
+            gnuplot-info-display
+            gnuplot-echo-command-line-flag
+            gnuplot-insertions-show-help-flag
+            gnuplot-delay
+            gnuplot-quote-character
+            gnuplot-keywords-when
+            ;;gnuplot-insertions-menu-flag
+            ;;gnuplot-insertions-adornments
+            ;;gnuplot-insertions-plot-options
+            ;;gnuplot-insertions-terminal
+            ;;gnuplot-insertions-x-axis
+            ;;gnuplot-insertions-x2-axis
+            ;;gnuplot-insertions-y-axis
+            ;;gnuplot-insertions-y2-axis
+            ;;gnuplot-insertions-z-axis
+            ;;gnuplot-insertions-parametric-plots
+            ;;gnuplot-insertions-polar-plots
+            ;;gnuplot-insertions-surface-plots
+            gnuplot-toolbar-display-flag
+            gnuplot-toolbar-use-toolbar
+            gnuplot-gui-popup-flag
+            gnuplot-gui-frame-plist
+            gnuplot-gui-frame-parameters
+            gnuplot-gui-fontname-list
+            gnuplot-gui-plot-splot-fit-style
+            ;; plus a few more...
+            gnuplot-comint-recent-buffer
+            gnuplot-version
+            Info-directory-list
+            exec-path
+            features ))
+         nil                           ; pre-hooks
+         nil                           ; post-hooks
+         (concat line                  ; salutation
+          "\nInsert your description of the gnuplot-mode bug here.\n"
+          "Please be as specific as possible.\n\n"
+          "There are several known shortcomings of gnuplot-mode.\n"
+          "Many of these have to do with the complicated and inconsistent\n"
+          "syntax of gnuplot itself.  See the document string for the\n"
+          "function `gnuplot-mode' (use `"
+          (substitute-command-keys "\\[describe-function]")
+          "') for details.\n\n"
+          "Note that this bug report form should be used for problems\n"
+          "with gnuplot-mode only.  Problems with gnuplot itself should\n"
+          "be addressed directly to the developers of gnuplot.\n"
+          "The maintainer of gnuplot-mode will not field questions about\n"
+          "gnuplot itself.  Thank you.\n"
+          line)
+         ))))
+
+
+\f
+;;; --- autoloaded functions: gnuplot-mode and gnuplot-make-buffer
+
+;;;###autoload
+(defun gnuplot-mode ()
+  "Major mode for editing and executing GNUPLOT scripts.
+This was written with version 3.7 of gnuplot in mind but it should
+work fine with version 3.5 and the various 3.6 beta versions.
+
+Report bugs in `gnuplot-mode' using \\[gnuplot-bug-report].
+
+                           ------O------
+
+The help functions, keyword completion, and several other features
+depend upon having the info file properly installed.  The info file
+can be made in the document directory of the gnuplot distribution or
+is available at the `gnuplot-mode' web page:
+    http://feff.phys.washington.edu/~ravel/software/gnuplot-mode/
+
+If the help function does not work properly, you may have an older
+version of the gnuplot info file.  Try the suggestion in the document
+string for the variable `gnuplot-info-hook'.  See the `gnuplot-mode'
+web page for more details.
+
+                           ------O------
+
+There are several known shortcomings of `gnuplot-mode', version 0.5g
+and up.  Many of the shortcomings involve the graphical interface
+(refered to as the GUI) to setting arguments to plot options.  Here is
+a list:
+
+ 1.  Currently there is no way for `gnuplot-mode' to know if information
+     sent to gnuplot was correctly plotted.
+ 2.  Indentation is sometimes a bit flaky.
+ 3.  \"plot\", \"splot\", and \"fit\" are handled in the GUI, but are
+     a bit flaky.  Their arguments may not be read correctly from
+     existing text, and continuation lines (common for plot and splot)
+     are not supported.
+ 4.  The GUI does not know how to read from continuation lines.
+ 5.  Comma separated position arguments to plot options are
+     unsupported in the GUI.  Colon separated datafile modifiers (used
+     for plot, splot, and fit) are not supported either.  Arguments
+     not yet supported by the GUI generate messages printed in grey
+     text.
+ 6.  The GUI handling of \"hidden3d\" is flaky and \"cntrparam\" is
+     unsupported.
+
+                           ------O------
+
+ Key bindings:
+ \\{gnuplot-mode-map}"
+  (interactive)
+  (kill-all-local-variables)
+  (use-local-map gnuplot-mode-map)
+  (setq major-mode 'gnuplot-mode
+       mode-name "Gnuplot")
+  (set (make-local-variable 'comment-start) "# ")
+  (set (make-local-variable 'comment-end) "")
+  (set (make-local-variable 'comment-column) 32)
+  (set (make-local-variable 'comment-start-skip) "#[ \t]*")
+  (set (make-local-variable 'indent-line-function) 'gnuplot-indent-line)
+  (set-syntax-table gnuplot-mode-syntax-table)
+  (if (or (fboundp 'hilit-set-mode-patterns)
+         (equal gnuplot-keywords-when 'immediately)) ; <HW>
+      (gnuplot-setup-info-look)) ;; <SE>
+  (if (fboundp 'hilit-set-mode-patterns) ; deal with hilit19 (ho hum!)
+      (let ((keywords (concat "\\b\\(" (mapconcat 'identity
+                                                 gnuplot-keywords "\\|")
+                             "\\)\\b")))
+       (hilit-set-mode-patterns
+        'gnuplot-mode
+        `(("#.*$" nil comment)
+          ("\\([a-zA-Z0-9_-]+\\)\\(([^)]*)\\)?\\s *=" nil define)
+          ,(list keywords 'nil 'keyword)
+          (hilit-string-find ?\\ string)
+          ))) )
+  ;;(if (featurep 'kw-compl)           ; old-style keyword completion
+  ;;    (setq kw-compl-list gnuplot-keywords
+  ;;       kw-compl-upper-case nil)) ; gnuplot keywords must be lower case
+  (if gnuplot-xemacs-p                 ; deal with font-lock
+      (if (fboundp 'turn-on-font-lock) (turn-on-font-lock))
+    (progn
+      (make-variable-buffer-local 'font-lock-defaults)
+      (setq font-lock-defaults '(gnuplot-font-lock-keywords t t))))
+;;   (if (and gnuplot-xemacs-p gnuplot-toolbar-display-flag)
+;;       (condition-case ()            ; deal with the toolbar
+;;       (and (require 'toolbar)
+;;            (require 'xpm)
+;;            (gnuplot-make-toolbar-function))
+;;     (error nil)))
+  (if (fboundp 'widget-create)         ; gunplot-gui
+      (condition-case ()
+         (require 'gnuplot-gui)
+       (error nil)))
+  (setq gnuplot-first-call nil         ; a few more details ...
+       gnuplot-comint-recent-buffer (current-buffer)
+        comint-process-echoes        gnuplot-echo-command-line-flag)
+  (run-hooks 'gnuplot-mode-hook)
+  ;; the first time we need to figure out which gnuplot we are running
+  (if gnuplot-program-version
+      (gnuplot-setup-menu-and-toolbar)
+    (gnuplot-fetch-version-number)))
+
+;;;###autoload
+(defun gnuplot-make-buffer ()
+  "Open a new buffer in `gnuplot-mode'.
+When invoked, it switches to a new, empty buffer visiting no file
+and then starts `gnuplot-mode'.
+
+It is convenient to bind this function to a global key sequence.  For
+example, to make the F10 key open a gnuplot script buffer, put the
+following in your .emacs file:
+     (autoload 'gnuplot-make-buffer \"gnuplot\"
+               \"open a buffer in gnuplot mode\" t)
+     (global-set-key [(f10)] 'gnuplot-make-buffer)"
+  (interactive)
+  (switch-to-buffer gnuplot-gnuplot-buffer)
+  (gnuplot-mode))
+
+(defun gnuplot-show-version ()
+  "Show version number in echo area"
+  (interactive)
+  (message "gnuplot-mode %s -- URL: %s" gnuplot-version gnuplot-maintainer-url))
+
+(defun gnuplot-show-gnuplot-version ()
+  "Show gnuplot program and version number in echo area"
+  (interactive)
+  (message "You are calling gnuplot %s as %s" gnuplot-program-version gnuplot-program))
+
+
+;;; That's it! ----------------------------------------------------------------
+
+\f
+;;; --- final chores: provide 'gnuplot and run load-hook
+;; provide before run-hooks suggested by <DB>
+(provide 'gnuplot)
+(run-hooks 'gnuplot-load-hook)
+
+;;;============================================================================
+;;;
+;;; gnuplot.el ends here