12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576 |
- ;;;; 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)
- ;;; --- 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")))
- ;;; --- 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]
- ))
- ;;; --- 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)))
- ;;; --- 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)
- ;;; --- 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)
- ;;; --- 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)
- ;;; --- 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.")))
- ;;; --- 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.")))
- ;;; --- 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.")))
- ;;; --- 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)
- ))))
- ;;; --- 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! ----------------------------------------------------------------
- ;;; --- 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
|