Mercurial > emacs
changeset 26960:733eba22afe2
TeXInfo documentation of the IDLWAVE mode and shell
author | Carsten Dominik <dominik@science.uva.nl> |
---|---|
date | Mon, 20 Dec 1999 11:18:31 +0000 |
parents | 40d1a10917b8 |
children | d0ae74166ab0 |
files | man/idlwave.texi |
diffstat | 1 files changed, 1784 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/idlwave.texi Mon Dec 20 11:18:31 1999 +0000 @@ -0,0 +1,1784 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename ../info/idlwave +@settitle IDLWAVE User Manual +@dircategory Editors +@direntry +* IDLWAVE: (idlwave). Major mode and shell for IDL and WAVE/CL files. +@end direntry +@synindex ky cp +@syncodeindex vr cp +@syncodeindex fn cp +@set VERSION 3.11 +@set EDITION 1.7 +@set IDLVERSION 5.3 +@set NSYSROUTINES 1226 +@set NSYSKEYWORDS 5230 +@set DATE December 1999 +@set AUTHOR Carsten Dominik +@set AUTHOR-EMAIL dominik@@astro.uva.nl +@set MAINTAINER Carsten Dominik +@set MAINTAINER-EMAIL dominik@@astro.uva.nl +@c %**end of header +@finalout + +@ifinfo +This file documents IDLWAVE, a major mode for editing IDL and +WAVE/CL files with Emacs. It also implements a shell for running IDL as +a subprocess.@refill + +This is edition @value{EDITION} of the IDLWAVE User Manual for +IDLWAVE @value{VERSION}@refill + +Copyright (c) 1999 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim +copies of this manual provided the copyright notice and +this permission notice are preserved on all copies. + +@ignore +Permission is granted to process this file through TeX +and print the results, provided the printed document +carries a copying permission notice identical to this +one except for the removal of this paragraph (this +paragraph not being relevant to the printed manual). + +@end ignore +Permission is granted to copy and distribute modified +versions of this manual under the conditions for +verbatim copying, provided that the entire resulting +derived work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute +translations of this manual into another language, +under the above conditions for modified versions, +except that this permission notice may be stated in a +translation approved by the Free Software Foundation. +@end ifinfo + +@titlepage +@title IDLWAVE User Manual +@subtitle Major Emacs mode and shell for IDL and WAVE/CL files +@subtitle Edition @value{EDITION}, @value{DATE} + +@author by Carsten Dominik +@page +Copyright @copyright{} 1999 Free Software Foundation, Inc. + +@sp 2 +This is edition @value{EDITION} of the @cite{IDLWAVE User Manual} for +IDLWAVE version @value{VERSION}, @value{DATE}.@refill + +@sp 2 + +Permission is granted to make and distribute verbatim +copies of this manual provided the copyright notice and +this permission notice are preserved on all copies. + +Permission is granted to copy and distribute modified +versions of this manual under the conditions for +verbatim copying, provided that the entire resulting +derive work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute +translations of this manual into another language, +under the above conditions for modified versions, +except that this permission notice may be stated in a +translation approved by the Free Software Foundation. + +@end titlepage +@page + +@ifinfo +@node Top, Introduction, (dir), (dir) + +IDLWAVE is a package to support editing command files for the +Interactive Data Language (IDL), and for running IDL as an inferior +shell. @refill + +@end ifinfo + +@menu +* Introduction:: What IDLWAVE is and what not +* IDLWAVE in a Nutshell:: One page quick-start guide +* The IDLWAVE Major Mode:: The mode to edit IDL programs +* The IDLWAVE Shell:: The mode to run IDL as inferior program +* Installation:: How to Install or Upgrade +* Acknowledgement:: Who helped +* Sources of Routine Info:: How does IDLWAVE know about routine XYZ +* Configuration Examples:: The user is king... +* Index:: Fast access + +@detailmenu + + --- The Detailed Node Listing --- + +The IDLWAVE Major Mode + +* Code Formatting:: Making code look nice +* Routine Info:: Calling Sequences and Keywords +* Completion:: Completing routine names and Keywords +* Code Templates:: Abbreviations for frequent constructs +* Actions:: Changing case, Padding, End checking +* Doc Header:: Inserting a standard header +* Motion Commands:: Moving through the structure of a program +* Misc Options:: Things that fit nowhere else + +Code Formatting + +* Code Indentation:: Reflecting the logical structure +* Comment Indentation:: Special indentation for comment lines +* Continuation Lines:: Splitting statements over lines +* Syntax Highlighting:: Font-lock support + +Actions + +* Block Boundary Check:: Is the END correct +* Padding Operators:: Enforcing space around `=' etc +* Case Changes:: Enforcing upper case keywords + +The IDLWAVE Shell + +* Starting the Shell:: How to launch IDL as a subprocess +* Using the Shell:: Interactively working with the Shell +* Debugging IDL Programs:: Compilation/Debugging + +Debugging IDL Programs + +* Compiling Programs:: Compiling buffers under the shell +* Breakpoints and Stepping:: Deciding where to stop and look +* Examining Variables:: What is the value now? + +Installation + +* Installing IDLWAVE:: How to install the distribution +* Upgrading from idl.el:: Necessary configuration changes + +Sources of Routine Info + +* Routine Definitions:: Where IDL Routines are defined. +* Routine Information Sources:: So how does IDLWAVE know about... +* Library Scan:: Scanning the Libraries for Routine Info +* Updating idlwave-rinfo.el:: Scanning the Reference Manual +@end detailmenu +@end menu + +@node Introduction, IDLWAVE in a Nutshell, Top, Top +@chapter Introduction +@cindex Introduction +@cindex CORBA (Common Object Request Broker Architecture) +@cindex cc-mode.el +@cindex Feature overview + +IDLWAVE is a package to support editing command files for the +Interactive Data Language (IDL), and for running IDL as an inferior +shell. It also can be used for WAVE/CL command files, but the support +for these is limited. Note that this package has nothing to do with the +Interface Definition Language as part of the Common Object Request +Broker Architecture (CORBA). + +IDLWAVE is the successor to the @file{idl.el} and @file{idl-shell.el} +files written by Chris Chase. The modes and files had to be renamed +because of a name space conflict with CORBAs @code{idl-mode}, defined in +Emacs in the file @file{cc-mode.el}. If you have been using the old +files, check @ref{Upgrading from idl.el} for information on how to +switch. + +IDLWAVE consists of two parts: A major mode for editing command files +(@code{idlwave-mode}) and a mode to allow running the IDL program as an +inferior shell (@code{idlwave-shell-mode}). Both modes work closely +together and form a complete development environment.@refill + +Here is a brief summary of what IDLWAVE does. + +@itemize @bullet +@item +Code indentation and formatting. +@item +Font-lock support on three levels. +@item +Display of calling sequence and keywords of more than 1000 IDL +routines. +@item +Context sensitive completion of routine names and keywords. +@item +Insertion of code templates. +@item +Actions to enforce coding standards during typing. +@item +Block structure check. +@item +Documentation support. +@item +Running IDL as inferior process. +@item +Shell with history search, command line editing and completion. +@item +Compilation, execution and debugging of programs directly from the source +buffer. +@item +Examining expressions with a mouse click. +@end itemize + +@ifnottex +@cindex Screenshots +Here are a number of screenshots showing IDLWAVE in action. +@itemize @bullet +@item +@uref{http://www.strw.leidenuniv.nl/~dominik/Tools/idlwave/font-lock.gif, +XEmacs 21.1 with formatted and fontified code} +@item +@uref{http://www.strw.leidenuniv.nl/~dominik/Tools/idlwave/rinfo.gif, +XEmacs 21.1 displaying routine info} +@item +@uref{http://www.strw.leidenuniv.nl/~dominik/Tools/idlwave/complete.gif, +XEmacs 21.1 completing a keyword} +@item +@uref{http://www.strw.leidenuniv.nl/~dominik/Tools/idlwave/shell.gif, +XEmacs 21.1 with debugging toolbar; execution stopped at a breakpoint} +@end itemize +@end ifnottex + +In this manual, each section contains a list of user options related to +the subject. Don't be confused by the shear number of options available +-- in most cases the default settings are just fine. The variables are +listed here to make sure you know where to look if you want to change +things. For a full description of what a particular variable does and +how to configure it, see the documentation string of that variable. +Some configuration examples are also given in the appendix. + +@node IDLWAVE in a Nutshell, The IDLWAVE Major Mode, Introduction, Top +@chapter IDLWAVE in a Nutshell +@cindex Quick-Start +@cindex Getting Started +@cindex IDLWAVE in a Nutshell +@cindex Nutshell, IDLWAVE in a + +If you are in a hurry, here is some quick-start information. + +@subheading Editing IDL Programs + +@multitable @columnfractions .15 .85 +@item @key{TAB} +@tab Indent the current line relative to context. +@item @kbd{M-C-\} +@tab Re-indent all lines in the current region. +@item @kbd{M-@key{RET}} +@tab Start a continuation line. Or split the current line at point. +@item @kbd{M-q} +@tab Fill the current comment paragraph. +@item @kbd{C-c ?} +@tab Display calling sequence, keywords of the procedure/function call +at point. +@item @kbd{M-@key{TAB}} +@tab Complete a procedure name, function name or keyword in the buffer. +@item @kbd{C-c C-i} +@tab Update IDLWAVE's knowledge about functions and procedures. +@item @kbd{C-c C-v} +@tab Find the source code of a procedure/function. +@item @kbd{C-c C-h} +@tab Insert a standard documentation header. +@item @kbd{C-c C-m} +@tab Insert a new timestamp and history item in the documentation header. +@end multitable + +@subheading Running the IDLWAVE Shell, Debugging Programs + +@multitable @columnfractions .15 .85 +@item @kbd{C-c C-s} +@tab Start IDL as a subprocess and/or switch to the interaction buffer. +@item @kbd{C-u C-c C-s} +@tab Start the shell in a separate frame. +@item @kbd{M-p} +@tab Cycle back through IDL command history matching command line input. +@item @kbd{M-n} +@tab Cycle forward. +@item @kbd{M-@key{TAB}} +@tab Complete a procedure name, function name or keyword in the shell buffer. +@item @kbd{C-c C-d C-c} +@tab Save and compile the source file in the current buffer. +@item @kbd{C-c C-d C-x} +@tab Goto next syntax error. +@item @kbd{C-c C-d C-b} +@tab Set a breakpoint at the current source line. +@item @kbd{C-c C-d C-d} +@tab Clear the current breakpoint. +@item @kbd{C-c C-d C-p} +@tab Ask IDL to print the value of the expression near point. +@end multitable + +@subheading Commonly used Settings in @file{.emacs} +@lisp +;; Change the indentation preferences +(setq idlwave-main-block-indent 2 ; default 0 + idlwave-block-indent 2 ; default 4 + idlwave-end-offset -2) ; default -4 + +;; Syntax Highlighting +(add-hook 'idlwave-mode-hook 'turn-on-font-lock) +;; Automatically expand END to ENDIF, ENDELSE, ... +(setq idlwave-expand-generic-end t) + +;; Automatically start the shell when needed +(setq idlwave-shell-automatic-start t) +;; Always use a separate frame for the shell buffer +(setq idlwave-shell-use-dedicated-frame t) + +;; Specify a file where library info can be stored. +(setq idlwave-libinfo-file "~/idlinfo.el") +@end lisp + +@node The IDLWAVE Major Mode, The IDLWAVE Shell, IDLWAVE in a Nutshell, Top +@chapter The IDLWAVE Major Mode +@cindex IDLWAVE major mode +@cindex Major mode, @code{idlwave-mode} + +The IDLWAVE major mode supports editing IDL and WAVE/CL command files. +In this chapter we describe the main features of the mode and how to +customize them. + +@menu +* Code Formatting:: Making code look nice +* Routine Info:: Calling Sequences and Keywords +* Completion:: Completing routine names and Keywords +* Code Templates:: Abbreviations for frequent constructs +* Actions:: Changing case, Padding, End checking +* Doc Header:: Inserting a standard header +* Motion Commands:: Moving through the structure of a program +* Misc Options:: Things that fit nowhere else +@end menu + +@node Code Formatting, Routine Info, The IDLWAVE Major Mode, The IDLWAVE Major Mode +@section Code Formatting +@cindex Code formatting +@cindex Formatting, of code + +@menu +* Code Indentation:: Reflecting the logical structure +* Comment Indentation:: Special indentation for comment lines +* Continuation Lines:: Splitting statements over lines +* Syntax Highlighting:: Font-lock support +@end menu + +@node Code Indentation, Comment Indentation, Code Formatting, Code Formatting +@subsection Code Indentation +@cindex Code indentation +@cindex Indentation + +Like all Emacs programming modes, IDLWAVE performs code indentation. +The @key{TAB} key indents the current line relative to context. +@key{LFD} insert a newline and indents the new line. The indentation is +governed by a number of variables. + +@cindex Foreign code, adapting +@cindex Indentation, of foreign code +To re-indent a larger portion of code (e.g. when working with foreign code +written with different conventions), use @kbd{M-C-\} +(@code{indent-region}) after marking the relevant code. Useful marking +commands are @kbd{C-x h} (the entire file) or @kbd{M-C-h} (the +current subprogram). @xref{Actions}, for information how to impose +additional formatting conventions on foreign code. + +@defopt idlwave-main-block-indent (@code{0}) +Extra indentation for the main block of code. That is the block between +the FUNCTION/PRO statement and the END statement for that program +unit.@refill +@end defopt + +@defopt idlwave-block-indent (@code{4}) +Extra indentation applied to block lines. If you change this, you +probably also want to change @code{idlwave-end-offset}.@refill +@end defopt + +@defopt idlwave-end-offset (@code{-4}) +Extra indentation applied to block END lines. A value equal to negative +@code{idlwave-block-indent} will make END lines line up with the block +BEGIN lines.@refill +@end defopt + +@defopt idlwave-continuation-indent (@code{2}) +Extra indentation applied to continuation lines and insided unbalanced +parenthesis.@refill +@end defopt + +@node Comment Indentation, Continuation Lines, Code Indentation, Code Formatting +@subsection Comment Indentation +@cindex Comment indentation +@cindex Hanging paragraphs +@cindex Paragraphs, filling +@cindex Paragraphs, hanging + +In IDL, lines starting with a @samp{;} are called @emph{comment lines}. +Comment lines are indented as follows: + +@multitable @columnfractions .1 .90 +@item @code{;;;} +@tab The indentation of lines starting with three semicolons remains +unchanged. +@item @code{;;} +@tab Lines starting with two semicolons are indented like the surrounding code. +@item @code{;} +@tab Lines starting with a single semicolon are indent to a minimum column. +@end multitable + +The indentation of comments starting in column 0 is never changed. + +@defopt idlwave-no-change-comment +The indentation of a comment that starts with this regular +expression will not be changed. +@end defopt + +@defopt idlwave-begin-line-comment +A comment anchored at the beginning of line. A comment matched by this +regular expression will not have its indentation changed.@refill +@end defopt + +@defopt idlwave-code-comment +A comment that starts with this regular expression on a line by itself +is indented as if it is a part of IDL code.@refill +@end defopt + +@node Continuation Lines, Syntax Highlighting, Comment Indentation, Code Formatting +@subsection Continuation Lines and Filling +@cindex Continuation lines +@cindex Line splitting +@cindex Splitting, of lines +@cindex Filling +@cindex @code{auto-fill-mode} +@cindex Hanging paragraphs + +In IDL, a newline character terminates a statement unless preceded by a +@samp{$}. If you would like to start a continuation line, use +@kbd{M-@key{RET}} which calls the command @code{idlwave-split-line}. It +inserts a @samp{$} to indicate that the following line is a continuation +of the current line, terminates the line with a newline and indents the +new line. The command @kbd{M-@key{RET}} can also be used in the middle +of a line to split the line at that point. When used inside a long +string constant, the string is split with the @samp{+} concatenation +operator. You could even use @code{auto-fill-mode} to automatically +break code lines into several lines while you type. For this, set the +variable @code{idlwave-fill-comment-line-only} to @code{nil} and turn on +@code{auto-fill-mode}. @code{auto-fill-mode} can be toggled with +@kbd{C-c C-a}. + +When filling comment paragraphs, IDLWAVE overloads the normal filling +functions and uses a function which creates hanging paragraphs as they +are customary in the IDL routine headers. When @code{auto-fill-mode} is +turned on, comments will be auto-filled. If the first line of a +paragraph is matched by @code{idlwave-hang-indent-regexp}, subsequent +lines are indented to after the position of this match, as in the +following example. + +@example +; INPUTS +; x - an array containing +; lots of interesting numbers. +; +; y - another variable where +; a hanging paragraph is used +; to describe it. +@end example + +You also refill a comment paragraph with @kbd{M-q}. + +@defopt idlwave-fill-comment-line-only (@code{t}) +Non-@code{nil} means auto fill will only operate on comment lines. +@end defopt + +@defopt idlwave-auto-fill-split-string (@code{t}) +Non-@code{nil} means auto fill will split strings with the IDL @samp{+} +operator. +@end defopt + +@defopt idlwave-split-line-string (@code{t}) +Non-@code{nil} means @code{idlwave-split-line} will split strings with +@samp{+}. +@end defopt + +@defopt idlwave-hanging-indent +Non-@code{nil} means comment paragraphs are indented under the hanging +indent given by @code{idlwave-hang-indent-regexp} match in the first +line of the paragraph.@refill +@end defopt + +@defopt idlwave-hang-indent-regexp +Regular expression matching the position of the hanging indent +in the first line of a comment paragraph.@refill +@end defopt + +@defopt idlwave-use-last-hang-indent (@code{nil}) +Non-@code{nil} means use last match on line for +@code{idlwave-indent-regexp}.@refill +@end defopt + +@node Syntax Highlighting, , Continuation Lines, Code Formatting +@subsection Syntax Highlighting +@cindex Syntax highlighting +@cindex Font lock + +Highlighting of keywords, comments, strings etc. can be accomplished +with @code{font-lock}. To enable @code{font-lock} for IDL files, place +the following line into your @file{.emacs} (see +@ref{Configuration Examples})@refill + +@lisp +(add-hook 'idlwave-mode-hook 'turn-on-font-lock) +@end lisp + +IDLWAVE supports 3 levels of syntax highlighting. The variable +@code{font-lock-maximum-decoration} determines which level is selected. + +@defopt idlwave-default-font-lock-items +Items which should be fontified on the default fontification level +2.@refill +@end defopt + +@node Routine Info, Completion, Code Formatting, The IDLWAVE Major Mode +@section Routine Info +@cindex Routine info + +IDL defines more than one thousand procedures, functions and object +methods. This large command set makes it difficult to remember the +calling sequence and keywords of a command. IDLWAVE contains a list of +all builtin routines with calling sequences and keywords@footnote{This +list was created by scanning the IDL manual and might contain (very few) +errors. Please report any detected errors to the maintainer, so that +they can be fixed.}. It also scans Emacs buffers and library files for +routine definitions and queries the IDLWAVE-Shell for the properties of +modules currently compiled under the shell. When you have edited a +buffer or compiled additional routines under the shell, use @kbd{C-c +C-i} (@code{idlwave-update-routine-info}) to update IDLWAVE's idea about +these routines.@refill + +To display the information about a routine, press @kbd{C-c ?} which +calls the command @code{idlwave-routine-info}. When the current cursor +position is on the name or in the argument list of a procedure or +function, information will be displayed about the routine. For example, +consider the cursor positions in the following line + +@example +plot,x,alog(x+5*sin(x) + 2), + 1 2 3 4 5 6 7 8 +@end example + +@cindex Object methods +On positions 1,2 and 8, information about the @samp{plot} procedure will +be shown. On positions 3,4, and 7, the @samp{alog} function will be +described, while positions 5 and 6 will select the @samp{sin} function. +When you ask for routine information about an object method, and the +method exists in several classes, IDLWAVE queries for the class of the +object. + +@cindex Calling sequences +@cindex Keywords of a routine +The description displayed contains the calling sequence, the list of +keywords and the origin of this information (@emph{system routine}, +@emph{library routine}, @emph{Emacs buffer}, or @emph{compiled +module}). It looks like this: + +@example +Usage: MAP_PROJ_INFO, iproj +Keywords: CIRCLE CURRENT CYLINDRICAL NAME UV_LIMITS WIDTH +Origin: buffer visiting /soft1/idl/lib/map_set.pro +@end example + +Some of the text in the @file{*Help*} buffer will be active (it +highlights when you move the mouse over it). Clicking with the middle +mouse button on any of the active fields will try to find the source file of +the routine and display it in another window. Another click on the same +line will switch back to the buffer from which @kbd{C-c ?} was +called. Clicking with the right mouse button on an active field will +search the IDL online help for this item.@refill + +@cindex Routine source file +@cindex Module source file +Another way to find the source file of a routine is the command @kbd{C-c +C-v} (@code{idlwave-find-module}). It asks for a module name, offering +the same default as @code{idlwave-routine-info} would have used. In the +minibuffer, specify a complete routine name (including the class part). +IDLWAVE will display the source file in another window.@refill + +@cindex @code{RESOLVE_ROUTINE} +@cindex Compiling library modules +@cindex Routines, resolving +@cindex Online help, for IDL routines +The two other commands that work with the routine at point need a +running IDLWAVE shell. The key sequence @kbd{M-?} calls the command +@code{idlwave-routine-info-from-idlhelp}. This sends the command line +@samp{ONLINE_HELP, '@var{routine_name}'} to IDL in order to display the +documentation of the routine in the IDL online documentation. The key +sequence @kbd{C-c =} calls the command @code{idlwave-resolve} and sends +the line @samp{RESOLVE_ROUTINE, '@var{routine_name}'} to IDL in order to +resolve (compile) it. + +@code{idlwave-resolve} is one way to get a library module within reach +of IDLWAVE's routine info collecting functions. A better way is to +prescan (parts of) the library (@pxref{Library Scan}). Routine info on +library modules will then be available without the need to compile the +modules first, and even without a running shell. + +@xref{Sources of Routine Info}, for in-depth information where IDLWAVE +collects data about routines, and how to update this information. + +@defopt idlwave-scan-all-buffers-for-routine-info (@code{t}) +Non-@code{nil} means, scan all buffers for IDL programs when updating +info. When this variable is @code{nil}, it only parses the current +buffer.@refill +@end defopt + +@defopt idlwave-query-shell-for-routine-info (@code{t}) +Non-@code{nil} means query the shell for info about compiled routines. +@end defopt + +@defopt idlwave-resize-routine-help-window (@code{t}) +Non-@code{nil} means, resize the Routine-info @file{*Help*} window to +fit the content.@refill +@end defopt + + +@node Completion, Code Templates, Routine Info, The IDLWAVE Major Mode +@section Completion +@cindex Completion + +IDLWAVE offers completion for routine names and keywords. As in many +programming modes, completion is bound to @kbd{M-@key{TAB}}. +Completion uses the same internal information as routine info, +so in order to update IDLWAVE's idea about your own routines after you +have edited or compiled them, press @kbd{C-c C-i} +(@code{idlwave-update-routine-info}).@refill + +The completion function is context sensitive and figures out what to +complete at point. Here are example lines and what @kbd{M-@key{TAB}} +would try to complete when the cursor is on the position marked with a +@samp{*}. + +@example +plo* @r{Procedure} +x = a* @r{Function} +plot,xra* @r{Keyword of @code{plot} procedure} +plot,x,y,/x* @r{Keyword of @code{plot} procedure} +plot,min(* @r{Keyword of @code{min} function} +obj -> a* @r{Object method (procedure)} +a(2,3) = obj -> a* @r{Object method (function)} +x = obj_new('IDL* @r{Class name} +x = obj_new('MyCl',a* @r{Keyword to @code{Init} method in class @code{MyCl}} +@end example + +@cindex Scrolling the @file{*Completions*} window +@cindex Completion, scrolling +If the list of completions is too long to fit in the +@file{*Completions*} window, the window can be scrolled by pressing +@kbd{M-@key{TAB}} repeatedly.@refill + +@cindex Case of completed words +The case of the completed words is determined by what is already in the +buffer. When the partial word being completed is all lower case, the +completion will be lower case as well. If at least one character is +upper case, the string will be completed in upper case or mixed case. +The default is to use upper case for procedures, functions and keywords, +and mixed case for object class names and methods, similar to the +conventions in the IDL manuals. These defaults can be changed with the +variable @code{idlwave-completion-case}.@refill + +@defopt idlwave-completion-case +Association list setting the case (UPPER/lower/Capitalized/...) of completed +words.@refill +@end defopt + +@defopt idlwave-completion-force-default-case (@code{nil}) +Non-@code{nil} means, completion will always honor the settings in +@code{idlwave-completion-case}. When nil (the default), lower case +strings will be completed to lower case. +@end defopt + +@defopt idlwave-complete-empty-string-as-lower-case (@code{nil}) +Non-@code{nil} means, the empty string is considered lower case for +completion.@refill +@end defopt + +@defopt idlwave-keyword-completion-adds-equal (@code{t}) +Non-@code{nil} means, completion automatically adds @samp{=} after +completed keywords.@refill +@end defopt + +@defopt idlwave-function-completion-adds-paren (@code{t}) +Non-@code{nil} means, completion automatically adds @samp{(} after +completed function. A value of `2' means, also add the closing +parenthesis and position cursor between the two.@refill +@end defopt + +@defopt idlwave-completion-restore-window-configuration (@code{t}) +Non-@code{nil} means, restore window configuration after successful +completion.@refill +@end defopt + +@subsubheading Object Method Completion and Class Ambiguity +@cindex Object methods +@cindex Class ambiguity +An object method is not uniquely determined without the object's class. +Since the class part is usually omitted in the source code, IDLWAVE +considers all available methods in all classes as possible completions +of an object method name. For keywords, the combined keywords of the +current method in all available classes will be considered. In the +@file{*Completions*} buffer, the classes allowed for each completion +will be shown next to the item (see option +@code{idlwave-completion-show-classes}).@refill + +You can also call @code{idlwave-complete} with a prefix arg: @kbd{C-u +M-@key{TAB}}. IDLWAVE will then prompt you for the class in order to +narrow down the number of possible completions. The variable +@code{idlwave-query-class} can be configured to make this behavior the +default (not really recommended). After you have specified the class +for a particular statement (e.g. when completing the method), IDLWAVE +can remember it for the rest of the editing session. Subsequent +completions in the same statement (e.g. keywords) can then reuse this +class information. Remembering the class works by placing a text +property in the object operator @samp{->}. This is not enabled by +default - the variable @code{idlwave-store-inquired-class} can be used +to turn it on.@refill + +@defopt idlwave-completion-show-classes (@code{t}) +Non-@code{nil} means, show classes in @file{*Completions*} buffer when +completing object methods and keywords.@refill +@end defopt + +@defopt idlwave-completion-fontify-classes (@code{t}) +Non-@code{nil} means, fontify the classes in completions buffer. +@end defopt + +@defopt idlwave-query-class (@code{nil}) +Association list governing query for object classes during completion.@refill +@end defopt + +@defopt idlwave-store-inquired-class (@code{nil}) +Non-@code{nil} means, store class of a method call as text property on +@samp{->}.@refill +@end defopt + +@defopt idlwave-class-arrow-face +Face to highlight object operator arrows @samp{->} which carry a class +property.@refill +@end defopt + +@node Code Templates, Actions, Completion, The IDLWAVE Major Mode +@section Code Templates +@cindex Code templates +@cindex Abbreviations +@cindex Templates + +IDLWAVE can insert IDL code templates into the buffer. For a few +templates, this is done with direct keybindings: + +@multitable @columnfractions .15 .85 +@item @kbd{C-c C-c} +@tab @code{CASE} statement template +@item @kbd{C-c C-f} +@tab @code{FOR} loop template +@item @kbd{C-c C-r} +@tab @code{REPEAT} loop template +@item @kbd{C-c C-w} +@tab @code{WHILE} loop template +@end multitable + +Otherwise, special abbreviations are used. Emacs abbreviations are +expanded by typing text into the buffer and pressing @key{SPC} or +@key{RET}. The special abbreviations used to insert code templates all +start with a @samp{\} (the backslash). Here are a few examples of +predefined abbreviations. For a full list, use @kbd{M-x +idlwave-list-abbrevs}. + +@multitable @columnfractions .15 .85 +@item @code{\pr} +@tab @code{PROCEDURE} template +@item @code{\fu} +@tab @code{FUNCTION} template +@item @code{\c} +@tab @code{CASE} statement template +@item @code{\f} +@tab @code{FOR} loop template +@item @code{\r} +@tab @code{REPEAT} loop template +@item @code{\w} +@tab @code{WHILE} loop template +@item @code{\i} +@tab @code{IF} statement template +@item @code{\elif} +@tab @code{IF-ELSE} statement template +@item @code{\b} +@tab @code{BEGIN} +@end multitable + +@defopt idlwave-abbrev-start-char +A single character string used to start abbreviations in abbrev +mode.@refill +@end defopt + +@defopt idlwave-abbrev-move (@code{t}) +Non-@code{nil} means the abbrev hook can move point, e.g. to end up +between the parenthesis of a function call. +@end defopt + +@node Actions, Doc Header, Code Templates, The IDLWAVE Major Mode +@section Actions +@cindex Actions +@cindex Coding standards, enforcing + +@emph{Actions} are special commands which are executed automatically +while you write code in order to check the structure of the program or +to enforce coding standards. Most actions which have been implemented +in IDLWAVE are turned off by default, assuming that the average user +wants her code the way she writes it. But if you are a lazy typist and +want your code to adhere to certain standards, they can be +helpful.@refill + +Action can be applied in three ways: +@itemize @bullet +@item +Some actions are applied directly while typing. For example, pressing +@samp{=} can run a check to make sure that this operator is surrounded +by spaces and insert these spaces if necessary. Pressing @key{SPC} +after a reserved word can call a command to change the word to upper +case.@refill +@item +When a line is re-indented with @key{TAB}, actions can be applied to the +entire line. To enable this, the variable @code{idlwave-do-actions} +must be non-@code{nil}.@refill +@item +@cindex Foreign code, adapting +@cindex Actions, applied to foreign code +Action can also be applied to a larger piece of code, e.g. in order to +convert foreign code to your own style. To do this, mark the relevant +part of the code and execute @kbd{M-x expand-region-abbrevs}. Useful +marking commands are @kbd{C-x h} (the entire file) or @kbd{M-C-h} (the +current subprogram). @xref{Code Indentation}, for information how to +ajust the indentation of the code.@refill +@end itemize + +@defopt idlwave-do-actions (@code{nil}) +Non-@code{nil} means performs actions when indenting. +@end defopt + +@menu +* Block Boundary Check:: Is the END correct +* Padding Operators:: Enforcing space around `=' etc +* Case Changes:: Enforcing upper case keywords +@end menu + +@node Block Boundary Check, Padding Operators, Actions, Actions +@subsection Block Boundary Check +@cindex Block boundary check +@cindex @code{END} type checking +@cindex @code{END}, automatic insertion +@cindex Block, closing +@cindex Closing a block + +Whenever you type an @code{END} statement, IDLWAVE finds the +corresponding start of the block and the cursor blinks back to that +location for a second. If you have typed a specific @code{END}, like +@code{ENDIF} or @code{ENDCASE}, you get a warning if that kind of END +does not match the type of block it terminates.@refill + +Set the variable @code{idlwave-expand-generic-end} in order to have all +generic @code{END} statements automatically expanded to a specific type. +You can also type @kbd{C-c ]} to close the current block by inserting +the appropriate @code{END} statement.@refill + +@defopt idlwave-show-block (@code{t}) +Non-@code{nil} means point blinks to block beginning for +@code{idlwave-show-begin}.@refill +@end defopt + +@defopt idlwave-expand-generic-end (@code{nil}) +Non-@code{nil} means expand generic END to ENDIF/ENDELSE/ENDWHILE etc. +@end defopt + +@node Padding Operators, Case Changes, Block Boundary Check, Actions +@subsection Padding Operators +@cindex Padding operators with spaces +@cindex Operators, padding with spaces + +Some operators can be automatically surrounded by spaces. This can +happen when the operator is typed, or also later when the line is +indented. IDLWAVE contains this setting for the operators @samp{&}, +@samp{<}, @samp{>}, @samp{,}, @samp{=}, but the feature is turned off by +default. If you want to turn it on, customize the variable +@code{idlwave-surround-by-blank}. You can also define similar actions +for other operators by using the function +@code{idlwave-action-and-binding} in the mode hook. For example, to +enforce space padding of the @samp{+} and @samp{*} operators, try this +in @file{.emacs} + +@lisp +(add-hook 'idlwave-mode-hook + (lambda () + (setq idlwave-surround-by-blank t) ; Turn this type of actions on + (idlwave-action-and-binding "*" '(idlwave-surround 1 1)) + (idlwave-action-and-binding "+" '(idlwave-surround 1 1)))) +@end lisp + +@defopt idlwave-surround-by-blank (@code{nil}) +Non-@code{nil} means, enable @code{idlwave-surround}. If non-nil, +@samp{=}, @samp{<}, @samp{>}, @samp{&}, @samp{,} are surrounded with +spaces by @code{idlwave-surround}. +@end defopt + +@defopt idlwave-pad-keyword (@code{t}) +Non-@code{nil} means pad @samp{=} for keywords like assignments.@refill +@end defopt + +@node Case Changes, , Padding Operators, Actions +@subsection Case Changes +@cindex Case changes + +Actions can be used to change the case of reserved words or expanded +abbreviations by customizing the variables +@code{idlwave-abbrev-change-case} and +@code{idlwave-reserved-word-upcase}. If you want to change the case of +additional words automatically, put something like the following into +your @file{.emacs} file:@refill + +@lisp +(add-hook 'idlwave-mode-hook + (lambda () + ;; Capitalize system vars + (idlwave-action-and-binding idlwave-sysvar '(capitalize-word 1) t) + ;; Capitalize procedure name + (idlwave-action-and-binding "\\<\\(pro\\|function\\)\\>[ \t]*\\<" + '(capitalize-word 1) t) + ;; Capitalize common block name + (idlwave-action-and-binding "\\<common\\>[ \t]+\\<" + '(capitalize-word 1) t))) +@end lisp + +For more information, see the documentation string for the function +@code{idlwave-action-and-binding}. + +@defopt idlwave-abbrev-change-case (@code{nil}) +Non-@code{nil} means all abbrevs will be forced to either upper or lower +case. Legal values are @code{nil}, @code{t}, and @code{down}. +@end defopt + +@defopt idlwave-reserved-word-upcase (@code{nil}) +Non-@code{nil} means, reserved words will be made upper case via abbrev +expansion. +@end defopt + + +@node Doc Header, Motion Commands, Actions, The IDLWAVE Major Mode +@section Documentation Header +@cindex Documentation header +@cindex Modification timestamp +@cindex Header, for file documentation +@cindex Timestamp, in doc header. +@cindex Changelog, in doc header. + +The command @kbd{C-c C-h} inserts a standard routine header into the +buffer, with the usual fields for documentation. One of the keywords is +@samp{MODIFICATION HISTORY} under which the changes to a routine can be +recorded. The command @kbd{C-c C-m} jumps to the @samp{MODIFICATION +HISTORY} of the current routine or file and inserts the user +name with a timestamp. + +@defopt idlwave-file-header +The doc-header template or a path to a file containing it. +@end defopt + +@defopt idlwave-timestamp-hook +The hook function used to update the timestamp of a function. +@end defopt + +@defopt idlwave-doc-modifications-keyword +The modifications keyword to use with the log documentation commands. +@end defopt + +@defopt idlwave-doclib-start +Regexp matching the start of a document library header. +@end defopt + +@defopt idlwave-doclib-end +Regexp matching the start of a document library header. +@end defopt + +@node Motion Commands, Misc Options, Doc Header, The IDLWAVE Major Mode +@section Motion Commands +@cindex Motion commands +@cindex Program structure, moving through +@cindex Code structure, moving through + +Several commands allow to move quickly through the structure of an IDL +program. These are + +@multitable @columnfractions .15 .85 +@item @kbd{C-M-a} +@tab Beginning of subprogram +@item @kbd{C-M-e} +@tab End of subprogram +@item @kbd{C-c @{} +@tab Beginning of block (stay inside the block) +@item @kbd{C-c @}} +@tab End of block (stay inside the block) +@item @kbd{M-C-n} +@tab Forward block (on same level) +@item @kbd{M-C-p} +@tab Backward block (on same level) +@item @kbd{M-C-d} +@tab Down block (enters a block) +@item @kbd{M-C-u} +@tab Backward up block (leaves a block) +@item @kbd{C-c C-n} +@tab Next Statement +@end multitable + + +@node Misc Options, , Motion Commands, The IDLWAVE Major Mode +@section Miscellaneous Options + +@defopt idlwave-help-application +The external application providing reference help for programming. +@end defopt + +@defopt idlwave-startup-message (@code{t}) +Non-@code{nil} means display a startup message when @code{idlwave-mode}' +is first called. +@end defopt + +@defopt idlwave-mode-hook +Normal hook. Executed when a buffer is put into @code{idlwave-mode}. +@end defopt + +@defopt idlwave-load-hook +Normal hook. Executed when @file{idlwave.el} is loaded. +@end defopt + + + + + + + + + + + + + + + + +@node The IDLWAVE Shell, Installation, The IDLWAVE Major Mode, Top +@chapter The IDLWAVE Shell +@cindex IDLWAVE shell +@cindex Major mode, @code{idlwave-shell-mode} + +The IDLWAVE shell is an Emacs major mode which allows to run the IDL +program as an inferior process of Emacs. It can be used to work with +IDL interactively, to compile and run IDL programs in Emacs buffers and +to debug these programs. The IDLWAVE shell uses @file{comint}, an Emacs +packages which handles the communication with the IDL program. +Unfortunately IDL for Windows and MacOS does not allow the interaction +with Emacs@footnote{Please inform the maintainer if you come up with a way +to make the IDLWAVE shell work on these systems.} - so the IDLWAVE shell +only works under Unix.@refill + +@menu +* Starting the Shell:: How to launch IDL as a subprocess +* Using the Shell:: Interactively working with the Shell +* Debugging IDL Programs:: Compilation/Debugging +@end menu + +@node Starting the Shell, Using the Shell, The IDLWAVE Shell, The IDLWAVE Shell +@section Starting the Shell +@cindex Starting the shell +@cindex Shell, starting +@cindex Dedicated frame, for shell buffer +@cindex Frame, for shell buffer + +The IDLWAVE shell can be started with the command @kbd{M-x +idlwave-shell}. In @code{idlwave-mode} the function is bound to +@kbd{C-c C-s}. It creates a buffer @file{*idl*} which is used to +interact with the shell. If the shell is already running, @kbd{C-c C-s} +will simple switch to the shell buffer. The command @kbd{C-c C-l} +(@code{idlwave-shell-recenter-shell-window}) displays the +shell window without selecting it.@refill + +In order to create a separate frame for the IDLWAVE shell buffer, call +@code{idlwave-shell} with a prefix argument: @kbd{C-u C-c C-s} or +@kbd{C-u C-c C-l}. If you always want a dedicated frame for the shell +window, configure the variable +@code{idlwave-shell-use-dedicated-frame}.@refill + +The shell can also be started automatically when another command tries +to send a command to it. To enable auto start, set the variable +@code{idlwave-shell-automatic-start} to @code{t}.@refill + +@defopt idlwave-shell-explicit-file-name +This is the command to run IDL. +@end defopt + +@defopt idlwave-shell-command-line-options +A list of command line options for calling the IDL program. +@end defopt + +@defopt idlwave-shell-prompt-pattern +Regexp to match IDL prompt at beginning of a line. +@end defopt + +@defopt idlwave-shell-process-name +Name to be associated with the IDL process. +@end defopt + +@defopt idlwave-shell-automatic-start +Non-@code{nil} means attempt to invoke idlwave-shell if not already +running. +@end defopt + +@defopt idlwave-shell-initial-commands +Initial commands, separated by newlines, to send to IDL. +@end defopt + +@defopt idlwave-shell-use-dedicated-frame (@code{nil}) +Non-@code{nil} means, IDLWAVE should use a special frame to display +shell buffer. +@end defopt + +@defopt idlwave-shell-frame-parameters +The frame parameters for a dedicated idlwave-shell frame. +@end defopt + +@defopt idlwave-shell-temp-pro-prefix +The prefix for temporary IDL files used when compiling regions.@refill +@end defopt + +@defopt idlwave-shell-mode-hook +Hook for customizing @code{idlwave-shell-mode}. +@end defopt + +@node Using the Shell, Debugging IDL Programs, Starting the Shell, The IDLWAVE Shell +@section Using the Shell +@cindex comint +@cindex Shell, basic commands + +The IDLWAVE shell works in the same fashion as other shell modes in +Emacs. It provides command history, command line editing and job +control. Here is a list of commonly used commands, see the Emacs +documentation on @file{comint} for additional information.@refill + +@multitable @columnfractions .12 .88 +@item @kbd{M-p} +@tab Cycle backwards in input history matching input +@item @kbd{M-n} +@tab Cycle forwards +@item @kbd{M-r} +@tab Previous input matching a regexp +@item @kbd{M-s} +@tab Next input that matches a regexp +@item @kbd{return} +@tab Send input or copy line to current prompt +@item @kbd{C-c C-a} +@tab Beginning of line; skip prompt +@item @kbd{C-c C-u} +@tab Kill input to beginning of line +@item @kbd{C-c C-w} +@tab Kill word before cursor +@item @kbd{C-c C-c} +@tab Send ^C +@item @kbd{C-c C-z} +@tab Send ^Z +@item @kbd{C-c C-\} +@tab Send ^\ +@item @kbd{C-c C-o} +@tab Delete last batch of process output +@item @kbd{C-c C-r} +@tab Show last batch of process output +@item @kbd{C-c C-l} +@tab List input history +@end multitable + +In addition to these standard @file{comint} commands, +@code{idlwave-shell-mode} has some bindings which correspond to similar +commands in @code{idlwave-mode}. See @ref{Routine Info} and +@ref{Completion} for more information on these commands.@refill + +@cindex Completion in the shell +@cindex Routine info in the shell +@multitable @columnfractions .12 .88 +@item @kbd{@key{TAB}} +@tab Completion of file names, routine names and keywords +(@code{idlwave-shell-complete})@refill +@item @kbd{M-@key{TAB}} +@tab Same as @key{TAB} +@item @kbd{C-c ?} +@tab Routine Info display (@code{idlwave-routine-info}) +@item @kbd{M-?} +@tab IDL online help on routine (@code{idlwave-routine-info-from-idlhelp}) +@item @kbd{C-c C-i} +@tab Update routine info from buffers and shell +(@code{idlwave-update-routine-info}) +@item @kbd{C-c C-v} +@tab Find the source file of a routine (@code{idlwave-find-module}) +@item @kbd{C-c =} +@tab Compile a library routine (@code{idlwave-resolve}) +@end multitable + +@defopt idlwave-shell-file-name-chars +The characters allowed in file names, as a string. Used for file name +completion.@refill +@end defopt + +@node Debugging IDL Programs, , Using the Shell, The IDLWAVE Shell +@section Debugging IDL Programs +@cindex Debugging +@cindex Keybindings for debugging +@cindex Toolbar + +Programs can be compiled, run, and debugged directly from the source +buffer in Emacs. The IDLWAVE shell installs keybindings both in the +shell buffer and in all IDL code buffers of the current Emacs session. +On Emacs versions which support this, it also installs a debugging +toolbar. The display of the toolbar can be toggled with @kbd{C-c C-d +C-t} (@code{idlwave-shell-toggle-toolbar}).@refill + +The debugging keybindings are by default on the prefix key @kbd{C-c +C-d}, so for example setting a breakpoint is done with @kbd{C-c C-d +C-b}. If you find this too much work and your ALT key is still +available, turn on the variable +@code{idlwave-shell-activate-alt-keybindings} in order to get breakpoint +setting on @kbd{A-b}. In the remainder of this chapter we will assume +that the @kbd{C-c C-d} bindings are active. + +@defopt idlwave-shell-prefix-key +The prefix key for the debugging map +@code{idlwave-shell-mode-prefix-map}.@refill +@end defopt + +@defopt idlwave-shell-activate-prefix-keybindings (@code{t}) +Non-@code{nil} means, debug commands will be bound to the prefix +key, like @kbd{C-c C-d C-b}. +@end defopt + +@defopt idlwave-shell-activate-alt-keybindings (@code{nil}) +Non-@code{nil} means, debug commands will be bound to alternate +keys, like @kbd{A-b}. +@end defopt + +@defopt idlwave-shell-use-toolbar (@code{t}) +Non-@code{nil} means, use the debugging toolbar in all IDL related +buffers.@refill +@end defopt + + +@menu +* Compiling Programs:: Compiling buffers under the shell +* Breakpoints and Stepping:: Deciding where to stop and look +* Examining Variables:: What is the value now? +@end menu + +@node Compiling Programs, Breakpoints and Stepping, Debugging IDL Programs, Debugging IDL Programs +@subsection Compiling Programs +@cindex Compiling programs +@cindex Programs, compiling +@cindex Default command line, executing +@cindex Executing a default command line + +In order to compile the current buffer under the IDLWAVE shell, press +@kbd{C-c C-d C-c} (@code{idlwave-save-and-run}). This first saves the +current buffer and then send the command @samp{.run path/to/file} to the +shell. You can laso execute @kbd{C-c C-d C-c} from the shell buffer, in +which case the most recently compiled buffer will be saved and +re-compiled. + +When developing or debugging a program, it is often necessary to execute +the same command line many times. A convenient way to do this is +@kbd{C-c C-d C-y} (@code{idlwave-shell-execute-default-command-line}). +This command first resets IDL from a state of interrupted execution by +closing all files and returning to the main interpreter level. Then a +default command line is send to the shell. To edit the default command +line, call @code{idlwave-shell-execute-default-command-line} with a +prefix argument: @kbd{C-u C-c C-d C-y}.@refill + +@defopt idlwave-shell-mark-stop-line (@code{t}) +Non-@code{nil} means, mark the source code line where IDL is currently +stopped. The value decides about the preferred method. Legal values +are @code{nil}, @code{t}, @code{arrow}, and @code{face}.@refill +@end defopt + +@defopt idlwave-shell-overlay-arrow +The overlay arrow to display at source lines where execution +halts.@refill +@end defopt + +@defopt idlwave-shell-stop-line-face +The face which highlights the source line where IDL is +stopped.@refill +@end defopt + +@node Breakpoints and Stepping, Examining Variables, Compiling Programs, Debugging IDL Programs +@subsection Breakpoints and Stepping +@cindex Breakpoints +@cindex Stepping + +You can set breakpoints and step through a program with IDLWAVE. +Setting a breakpoint in the current line of the source buffer is done +with @kbd{C-c C-d C-b} (@code{idlwave-shell-break-here}). With a prefix +arg of 1, the breakpoint gets a @code{/ONCE} keyword, meaning that it +will be deleted after first use. With a numeric prefix greater than +one, the breakpoint will only be active the @code{nth} time it is hit. +To clear the breakpoint in the current line, use @kbd{C-c C-d C-d} +(@code{idlwave-clear-current-bp}). To clear all breakpoints, use +@kbd{C-c C-d C-a} (@code{idlwave-clear-all-bp}). Breakpoint lines are +highlighted in the source code.@refill + +Once the program has stopped somewhere, you can step through it. Here +is a summary of the breakpoint and stepping commands: + +@multitable @columnfractions .2 .8 +@item @kbd{C-c C-d C-b} +@tab Set breakpoint (@code{idlwave-shell-break-here}) +@item @kbd{C-c C-d C-i} +@tab Set breakpoint in function named here (@code{idlwave-shell-break-in}) +@item @kbd{C-c C-d C-d} +@tab Clear current breakpoint (@code{idlwave-shell-clear-current-bp}) +@item @kbd{C-c C-d C-a} +@tab Clear all breakpoints (@code{idlwave-shell-clear-all-bp}) +@item @kbd{C-c C-d C-s} +@tab Step, into function calls (@code{idlwave-shell-step}) +@item @kbd{C-c C-d C-n} +@tab Step, over function calls (@code{idlwave-shell-stepover}) +@item @kbd{C-c C-d C-k} +@tab Skip one statement (@code{idlwave-shell-skip}) +@item @kbd{C-c C-d C-u} +@tab Continue to end of block (@code{idlwave-shell-up}) +@item @kbd{C-c C-d C-m} +@tab Continue to end of function (@code{idlwave-shell-return}) +@item @kbd{C-c C-d C-o} +@tab Continue past end of function (@code{idlwave-shell-out}) +@item @kbd{C-c C-d C-h} +@tab Continue to line at cursor position (@code{idlwave-shell-to-here}) +@item @kbd{C-c C-d C-r} +@tab Continue execution to next breakpoint (@code{idlwave-shell-cont}) +@item @kbd{C-c C-d C-up} +@tab Show higher level in calling stack (@code{idlwave-shell-stack-up}) +@item @kbd{C-c C-d C-down} +@tab Show lower level in calling stack (@code{idlwave-shell-stack-down}) +@end multitable + +@defopt idlwave-shell-mark-breakpoints (@code{t}) +Non-@code{nil} means, mark breakpoints in the source file buffers. The +value indicates the preferred method. Legal values are @code{nil}, +@code{t}, @code{face}, and @code{glyph}. +@end defopt + +@defopt idlwave-shell-breakpoint-face +The face for breakpoint lines in the source code if +@code{idlwave-shell-mark-breakpoints} has the value @code{face}.@refill +@end defopt + +@node Examining Variables, , Breakpoints and Stepping, Debugging IDL Programs +@subsection Examining Variables +@cindex @code{PRINT} expressions +@cindex @code{HELP}, on expressions +@cindex Expressions, printing +@cindex Expressions, help +@cindex Mouse binding to print expressions + +When execution is stopped you can examine the values of variables. The +command @kbd{C-c C-d C-p} prints the expression at point in the shell +buffer, while @kbd{C-c C-d ?} shows help on this expression. The +expression at point is an array expression or a function call, or the +contents of a pair of parenthesis. The selected expression becomes +highlighted in the source code for a short time. + +I find it very convenient to bind these functions to a mouse event, so +that simply clicking on an expression prints its value. Here is a way +to do this with XEmacs: + +@lisp +(add-hook 'idlwave-shell-mode-hook + (lambda() + (define-key idlwave-mode-map [(shift button1)] + 'idlwave-shell-mouse-print) + (define-key idlwave-mode-map [(shift button2)] + 'idlwave-shell-mouse-help))) +@end lisp + +@defopt idlwave-shell-expression-face +The face for @code{idlwave-shell-expression-overlay}. +Allows you to choose the font, color and other properties for +the expression printed by IDL. +@end defopt + + +@node Installation, Acknowledgement, The IDLWAVE Shell, Top +@chapter Installation +@cindex Installation +@cindex FTP site +@cindex URL, homepage for IDLWAVE +@cindex Homepage for IDLWAVE + +@menu +* Installing IDLWAVE:: How to install the distribution +* Upgrading from idl.el:: Necessary configuration changes +@end menu + +@node Installing IDLWAVE, Upgrading from idl.el, Installation, Installation +@section Installing IDLWAVE + +IDLWAVE is part of Emacs 21.1 and later. It is also@footnote{or will be +soon} an XEmacs packages and can be installed from +@uref{ftp://ftp.xemacs.org/pub/xemacs/packages/,the XEmacs ftp site} +with the normal package management system on XEmacs 21.@refill + +You can also download IDLWAVE and install it yourself from +@uref{http://www.strw.leidenuniv.nl/~dominik/Tools/idlwave, the maintainers +webpage}. Follow the instructions in the INSTALL file.@refill + +@node Upgrading from idl.el, , Installing IDLWAVE, Installation +@section Upgrading from the old @b{@file{idl.el}} file +@cindex Upgrading from old @b{@file{idl.el}} +@cindex Renaming old variables +@cindex Old variables, renaming + +If you have been using the old @file{idl.el} and @file{idl-shell.el} +files and would like to use IDLWAVE, you need to update your +customization in @file{.emacs}. + +@enumerate +@item +Change all variable and function prefixes from @samp{idl-} to @samp{idlwave-}. +@item +Remove the now invalid @code{autoload} and @code{auto-mode-alist} forms +pointing to the @file{idl.el} and @file{idl-shell.el} files. +@item +If you have been using the hook function recommended in earlier versions +to get a separate frame for the IDL shell, remove that command from your +@code{idlwave-shell-mode-hook}. Instead, set the variable +@code{idlwave-shell-use-dedicated-frame} with +@lisp +(setq idlwave-shell-use-dedicated-frame t) +@end lisp +@end enumerate + +@node Acknowledgement, Sources of Routine Info, Installation, Top +@chapter Acknowledgement +@cindex Acknowledgement +@cindex Thanks + +@file{idl.el} and @file{idl-shell.el} were written by +@uref{mailto:chase@@att.com, Chris Chase}. The package +was extended and renamed to IDLWAVE by the current maintainer +@uref{mailto:dominik@@strw.leidenuniv.nl, Carsten Dominik}. + +Thanks to the following people who have contributed to the development +of IDLWAVE with patches, ideas, bug reports and suggestions. + +@itemize @minus +@item +Ulrik Dickow <dickow@@nbi.dk> +@item +Eric E. Dors <edors@@lanl.gov> +@item +Stein Vidar H. Haugan <s.v.h.haugan@@astro.uio.no> +@item +David Huenemoerder <dph@@space.mit.edu> +@item +Kevin Ivory <Kevin.Ivory@@linmpi.mpg.de> +@item +Xuyong Liu <liu@@stsci.edu> +@item +Simon Marshall <Simon.Marshall@@esrin.esa.it> +@item +Laurent Mugnier <mugnier@@onera.fr> +@item +Lubos Pochman <lubos@@rsinc.com> +@item +Patrick M. Ryan <pat@@jaameri.gsfc.nasa.gov> +@item +Marty Ryba <ryba@@ll.mit.edu> +@item +Phil Williams <williams@@irc.chmcc.org> +@item +J.D. Smith <jdsmith@@astrosun.tn.cornell.edu> +@item +Phil Sterne <sterne@@dublin.llnl.gov> +@end itemize + +@node Sources of Routine Info, Configuration Examples, Acknowledgement, Top +@appendix Sources of Routine Info + +In @ref{Routine Info} and @ref{Completion} it was shown how IDLWAVE +displays the calling sequence and keywords of routines, and how it +completes routine names and keywords. For these features to work, +IDLWAVE must know about the accessible routines. + +@menu +* Routine Definitions:: Where IDL Routines are defined. +* Routine Information Sources:: So how does IDLWAVE know about... +* Library Scan:: Scanning the Libraries for Routine Info +* Updating idlwave-rinfo.el:: Scanning the IDL Manuals +@end menu + +@node Routine Definitions, Routine Information Sources, Sources of Routine Info, Sources of Routine Info +@section Routine Definitions +@cindex Routine definitions + +Routines which can be used in an IDL program can be defined in several +places: + +@enumerate +@item +@emph{System routines} are defined inside IDL itself. The source +code of such routines is not accessible to the user.@refill +@item +Routines @emph{part of the current program} are defined in a file which +is explicitly compiled by the user. This file may be located on the IDL +search path, but this is not certain.@refill +@item +@emph{Library routines} are defined in special files which are located +somewhere on IDL's search path. When a library routine is called for +the first time, IDL will find the source file and compile it +dynamically.@refill +@item +External routines written in other languages (like Fortran or C) can be +called with @code{CALL_EXTERNAL}, linked into IDL via @code{LINKIMAGE}, +or included as dynamically loaded modules (DLMs). Currently IDLWAVE +cannot provide routine info and completion for external +routines.@refill +@end enumerate + +@node Routine Information Sources, Library Scan, Routine Definitions, Sources of Routine Info +@section Routine Information Sources +@cindex Routine info sources + +In oder to know about as many routines as possible, IDLWAVE will do the +following to collect information:@refill + +@enumerate + +@item +It has a @emph{builtin list} with the properties of the builtin IDL +routines. IDLWAVE @value{VERSION} is distributed with a list of +@value{NSYSROUTINES} routines and @value{NSYSKEYWORDS} keywords, +reflecting IDL version @value{IDLVERSION}. This list has been created +by scanning the IDL manuals and is stored in the file +@file{idlwave-rinfo.el}. @xref{Updating idlwave-rinfo.el}, for +information how to regenerate this file for new versions of IDL.@refill + +@item +It @emph{scans} all @emph{buffers} of the current Emacs session for +routine definitions. This is done automatically when routine +information or completion is first requested by the user. The command +@kbd{C-c C-i} (@code{idlwave-update-routine-info}) can be used at any +time to rescan all buffers.@refill + +@item +If you have an IDLWAVE-Shell running as inferior process of the current +Emacs session, IDLWAVE will @emph{query the shell} for compiled routines +and their arguments. This happens automatically when routine +information or completion is first requested by the user. The command +@kbd{C-c C-i} (@code{idlwave-update-routine-info}) can be used to ask +the shell again at any time.@refill + +@item +IDLWAVE can scan all or selected library files and store the result in a +file which will be automatically loaded just like +@file{idlwave-rinfo.el}. @xref{Library Scan}, for information how to +scan library files.@refill +@end enumerate + +@defopt idlwave-scan-all-buffers-for-routine-info (@code{t}) +Non-@code{nil} means, scan all buffers for IDL programs when updating +info. When this variable is @code{nil}, it only parses the current +buffer.@refill +@end defopt + +@defopt idlwave-query-shell-for-routine-info (@code{t}) +Non-@code{nil} means query the shell for info about compiled routines. +@end defopt + + +@node Library Scan, Updating idlwave-rinfo.el, Routine Information Sources, Sources of Routine Info +@section Library Scan +@cindex Library scan +@cindex IDL library routine info + +IDLWAVE can extract routine information from library modules and store +that information in a file. To do this, the variable +@code{idlwave-libinfo-file} needs to contain the path to a file in an +existing directory (e.g. @code{"~/idlwave_libinfo.el"}). Since the file +will contain lisp code, it should end in @file{.el}. Under Windows and +MacOS, you also need to specify the search path for IDL library files in +the variable @code{idlwave-library-path}. Under UNIX, this path will +be automatically inferred from an IDLWAVE shell.@refill + +The command @kbd{M-x idlwave-create-libinfo-file} can then be used to +scan library files. It brings up a widget in which you can select some +or all directories on the search path. Pressing the @w{@samp{[Scan & Save]}} +button in the widget will scan all files in the selected directories and +write the resulting routine information into the file +@code{idlwave-libinfo-file}. In order to update the library information +from the same directories, call the command +@code{idlwave-update-routine-info} with a double prefix argument: +@kbd{C-u C-u C-c C-i}. This will rescan files in the previously +selected directories, write an updated version of the libinfo file and +rebuild IDLWAVEs internal lists.@refill + +A note of caution: Depending on your local installation, the IDL +library can be very large. Parsing it for routine information will take +time and loading this information into Emacs can require a +significant amount of memory.@refill + +A routine which is both in the library listing and compiled under the +shell will show up twice in the @file{*Completions*} listing. This is +usually not a serious problem. However, if you have scanned the part of +the library relevant for you, and if you are not compiling files which +are not on the library search path, the information about compiled +routines is in fact unnecessary. In this case, you can turn of the +shell query for compiled routines with the variable +@code{idlwave-query-shell-for-routine-info}.@refill + +@defopt idlwave-libinfo-file +File for routine information of the IDL library. +@end defopt + +@defopt idlwave-library-path +IDL library path for Windows and MacOS. Not needed under Unix. +@end defopt + + +@node Updating idlwave-rinfo.el, , Library Scan, Sources of Routine Info +@section Updating @file{idlwave-rinfo.el} +@cindex @file{get_rinfo} +@cindex @file{idlwave.rinfo.el} +@cindex Perl program, to create @file{idlwave.rinfo.el} + +The file @file{idlwave-rinfo.el} contains the routine information for +the routines build into IDL. This constant depends upon the version of +IDL. If you are lucky, the maintainer of IDLWAVE will always have +access to the newest version of IDL and provide updates of +@file{idlwave-rinfo.el} reflecting the currently released version of +IDL. The IDLWAVE package also contains a Perl program @file{get_rinfo} +which constructs this file by scanning selected files from the IDL +documentation. The program needs @file{pdftotext} by Derek B. Noonburg. +Instructions on how to use @file{get_rinfo} are in the program +itself.@refill + +@node Configuration Examples, Index, Sources of Routine Info, Top +@appendix Configuration Examples +@cindex Configuration examples +@cindex Example configuration + +@noindent +@b{Question:} So now you have all these complicated configuration +options in your package, but which ones do @emph{you} as the maintainer +actually set in your own configuration? + +@noindent +@b{Answer:} Hardly any. As the maintainer, I set the default of all +options to what I think is best. However, I do not turn on features by +default which +@itemize @minus +@item +are not self-evident (i.e. too magic) when used by an unsuspecting user +@item +are too intrusive +@item +will not work properly on all Emacs installations out there +@item +break with what I think are widely used standards. +@end itemize + +@noindent To see what I mean, here is the entire configuration I have in +my @file{.emacs}: + +@lisp +(setq idlwave-shell-activate-alt-keybindings t + idlwave-expand-generic-end t + idlwave-store-inquired-class t + idlwave-shell-automatic-start t + idlwave-libinfo-file "~/lib/idl/libinfo.el" + idlwave-main-block-indent 2) +(add-hook 'idlwave-shell-mode-hook + (lambda() + (define-key idlwave-mode-map [(shift button1)] + 'idlwave-shell-mouse-print) + (define-key idlwave-mode-map [(shift button2)] + 'idlwave-shell-mouse-help))) +@end lisp + +However, if you are an Emacs power-user and want IDLWAVE to work +completely differently, the options allow you to change almost every +aspect of it. Here is an example of a much more extensive configuration +of IDLWAVE. To say it again - this is not what I recommend, but the +user is King!@refill + +@example +;;; Settings for IDLWAVE mode + +(setq idlwave-block-indent 3) ; Indentation settings +(setq idlwave-main-block-indent 3) +(setq idlwave-end-offset -3) +(setq idlwave-continuation-indent 1) +(setq idlwave-begin-line-comment "^;[^;]") ; Leave ";" but not ";;" + ; anchored at start of line. +(setq idlwave-surround-by-blank t) ; Turn on padding ops =,<,> +(setq idlwave-pad-keyword nil) ; Remove spaces for keyword '=' +(setq idlwave-expand-generic-end t) ; convert END to ENDIF etc... +(setq idlwave-reserved-word-upcase t) ; Make reserved words upper case + ; (with abbrevs only) +(setq idlwave-abbrev-change-case nil) ; Don't force case of expansions +(setq idlwave-hang-indent-regexp ": ") ; Change from "- " for auto-fill +(setq idlwave-show-block nil) ; Turn off blinking to begin +(setq idlwave-abbrev-move t) ; Allow abbrevs to move point + +;; Some setting can only be done from a mode hook. Here is an example: + +(add-hook 'idlwave-mode-hook + (lambda () + (setq abbrev-mode 1) ; Turn on abbrevs (-1 for off) + (setq case-fold-search nil) ; Make searches case sensitive + ;; Run other functions here + (font-lock-mode 1) ; Turn on font-lock mode + (idlwave-auto-fill-mode 0) ; Turn off auto filling + ;; + ;; Pad with with 1 space (if -n is used then make the + ;; padding a minimum of n spaces.) The defaults use -1 + ;; instead of 1. + (idlwave-action-and-binding "=" '(idlwave-expand-equal 1 1)) + (idlwave-action-and-binding "<" '(idlwave-surround 1 1)) + (idlwave-action-and-binding ">" '(idlwave-surround 1 1 '(?-))) + (idlwave-action-and-binding "&" '(idlwave-surround 1 1)) + ;; + ;; Only pad after comma and with exactly 1 space + (idlwave-action-and-binding "," '(idlwave-surround nil 1)) + ;; + ;; Set some personal bindings + ;; (In this case, makes `,' have the normal self-insert behavior.) + (local-set-key "," 'self-insert-command) + ;; Create a newline, indenting the original and new line. + ;; A similar function that does _not_ reindent the original + ;; line is on "\C-j" (The default for emacs programming modes). + (local-set-key "\n" 'idlwave-newline) + ;; (local-set-key "\C-j" 'idlwave-newline) ; My preference. + )) + +;;; Settings for IDLWAVE SHELL mode + +(setq idlwave-shell-overlay-arrow "=>") ; default is ">" +(setq idlwave-shell-use-dedicated-frame t) ; Make a dedicated frame +(setq idlwave-shell-prompt-pattern "^WAVE> ") ; default is "^IDL> " +(setq idlwave-shell-explicit-file-name "wave") +(setq idlwave-shell-process-name "wave") +(setq idlwave-shell-use-dedicated-frame t) ; Shell on separate frame +(setq idlwave-shell-use-toolbar nil) ; No toolbar +@end example + +@node Index, , Configuration Examples, Top +@unnumbered Index +@printindex cp + +@summarycontents +@contents +@bye +