]> code.delx.au - gnu-emacs/blob - man/idlwave.texi
(enum event_kind) [MAC_OS]: Update comment for MAC_APPLE_EVENT.
[gnu-emacs] / man / idlwave.texi
1 \input texinfo @c -*-texinfo-*-
2 @c %**start of header
3 @setfilename ../info/idlwave
4 @settitle IDLWAVE User Manual
5 @dircategory Emacs
6 @direntry
7 * IDLWAVE: (idlwave). Major mode and shell for IDL files.
8 @end direntry
9 @synindex ky cp
10 @syncodeindex vr cp
11 @syncodeindex fn cp
12 @set VERSION 6.0
13 @set EDITION 6.0
14 @set IDLVERSION 6.2
15 @set NSYSROUTINES 1966
16 @set DATE Feb, 2006
17 @set AUTHOR J.D. Smith & Carsten Dominik
18 @set AUTHOREMAIL jdsmith@@as.arizona.edu
19 @set MAINTAINER J.D. Smith
20 @set MAINTAINEREMAIL jdsmith@@as.arizona.edu
21 @set IDLWAVEHOMEPAGE http://idlwave.org/
22 @c %**end of header
23 @finalout
24
25 @ifinfo
26 This file documents IDLWAVE, a major mode for editing IDL files with
27 Emacs, and interacting with an IDL shell run as a subprocess.
28
29 This is edition @value{EDITION} of the IDLWAVE User Manual for IDLWAVE
30 @value{VERSION}
31
32 Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005,
33 2006 Free Software Foundation, Inc.
34
35 Permission is granted to copy, distribute and/or modify this document
36 under the terms of the GNU Free Documentation License, Version 1.2 or
37 any later version published by the Free Software Foundation; with no
38 Invariant Sections, with the Front-Cover texts being ``A GNU
39 Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
40 license is included in the section entitled ``GNU Free Documentation
41 License'' in the Emacs manual.
42
43 (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
44 this GNU Manual, like GNU software. Copies published by the Free
45 Software Foundation raise funds for GNU development.''
46
47 This document is part of a collection distributed under the GNU Free
48 Documentation License. If you want to distribute this document
49 separately from the collection, you can do so by adding a copy of the
50 license to the document, as described in section 6 of the license.
51 @end ifinfo
52
53 @titlepage
54 @title IDLWAVE User Manual
55 @subtitle Emacs major mode and shell for IDL
56 @subtitle Edition @value{EDITION}, @value{DATE}
57
58 @author by J.D. Smith & Carsten Dominik
59 @page
60 This is edition @value{EDITION} of the @cite{IDLWAVE User Manual} for
61 IDLWAVE version @value{VERSION}, @value{DATE}.
62 @sp 2
63 Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005,
64 2006 Free Software Foundation, Inc.
65 @sp 2
66 @cindex Copyright, of IDLWAVE
67 Permission is granted to copy, distribute and/or modify this document
68 under the terms of the GNU Free Documentation License, Version 1.2 or
69 any later version published by the Free Software Foundation; with no
70 Invariant Sections, with the Front-Cover texts being ``A GNU
71 Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
72 license is included in the section entitled ``GNU Free Documentation
73 License'' in the Emacs manual.
74
75 (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
76 this GNU Manual, like GNU software. Copies published by the Free
77 Software Foundation raise funds for GNU development.''
78
79 This document is part of a collection distributed under the GNU Free
80 Documentation License. If you want to distribute this document
81 separately from the collection, you can do so by adding a copy of the
82 license to the document, as described in section 6 of the license.
83 @end titlepage
84 @contents
85
86 @page
87
88 @ifnottex
89
90 @node Top, Introduction, (dir), (dir)
91
92 IDLWAVE is a package which supports editing source code written in the
93 Interactive Data Language (IDL), and running IDL as an inferior shell.
94
95 @end ifnottex
96
97 @menu
98 * Introduction:: What IDLWAVE is, and what it is not
99 * IDLWAVE in a Nutshell:: One page quick-start guide
100 * Getting Started:: Tutorial
101 * The IDLWAVE Major Mode:: The mode for editing IDL programs
102 * The IDLWAVE Shell:: The mode for running IDL as an inferior program
103 * Acknowledgements:: Who did what
104 * Sources of Routine Info:: How does IDLWAVE know about routine XYZ
105 * HTML Help Browser Tips::
106 * Configuration Examples:: The user is king
107 * Windows and MacOS:: What still works, and how
108 * Troubleshooting:: When good computers turn bad
109 * Index:: Fast access
110
111 @detailmenu
112 --- The Detailed Node Listing ---
113
114 Getting Started (Tutorial)
115
116 * Lesson I -- Development Cycle::
117 * Lesson II -- Customization::
118 * Lesson III -- User Catalog::
119
120 The IDLWAVE Major Mode
121
122 * Code Formatting:: Making code look nice
123 * Routine Info:: Calling Sequence and Keyword List
124 * Online Help:: One key press from source to help
125 * Completion:: Completing routine names and Keywords
126 * Routine Source:: Finding routines, the easy way
127 * Resolving Routines:: Force the Shell to compile a routine
128 * Code Templates:: Frequent code constructs
129 * Abbreviations:: Abbreviations for common commands
130 * Actions:: Changing case, Padding, End checking
131 * Doc Header:: Inserting a standard header
132 * Motion Commands:: Moving through the structure of a program
133 * Misc Options:: Things that fit nowhere else
134
135 Code Formatting
136
137 * Code Indentation:: Reflecting the logical structure
138 * Continued Statement Indentation::
139 * Comment Indentation:: Special indentation for comment lines
140 * Continuation Lines:: Splitting statements over lines
141 * Syntax Highlighting:: Font-lock support
142 * Octals and Highlighting:: Why "123 causes problems
143
144 Online Help
145
146 * Help with HTML Documentation::
147 * Help with Source::
148
149 Completion
150
151 * Case of Completed Words:: CaseOFcomPletedWords
152 * Object Method Completion and Class Ambiguity:: obj->Method, what?
153 * Object Method Completion in the Shell::
154 * Class and Keyword Inheritance:: obj->Method, _EXTRA=e
155 * Structure Tag Completion:: Completing state.Tag
156
157 Actions
158
159 * Block Boundary Check:: Is the END statement correct?
160 * Padding Operators:: Enforcing space around `=' etc
161 * Case Changes:: Enforcing upper case keywords
162
163 The IDLWAVE Shell
164
165 * Starting the Shell:: How to launch IDL as a subprocess
166 * Using the Shell:: Interactively working with the Shell
167 * Commands Sent to the Shell::
168 * Debugging IDL Programs::
169 * Examining Variables::
170 * Custom Expression Examination::
171
172 Debugging IDL Programs
173
174 * A Tale of Two Modes::
175 * Debug Key Bindings::
176 * Breakpoints and Stepping::
177 * Compiling Programs::
178 * Walking the Calling Stack::
179 * Electric Debug Mode::
180
181 Sources of Routine Info
182
183 * Routine Definitions:: Where IDL Routines are defined.
184 * Routine Information Sources:: So how does IDLWAVE know about...
185 * Catalogs::
186 * Load-Path Shadows:: Routines defined in several places
187 * Documentation Scan:: Scanning the IDL Manuals
188
189 Catalogs
190
191 * Library Catalogs::
192 * User Catalog::
193
194 @end detailmenu
195 @end menu
196
197 @node Introduction, IDLWAVE in a Nutshell, Top, Top
198 @chapter Introduction
199 @cindex Introduction
200 @cindex CORBA (Common Object Request Broker Architecture)
201 @cindex Interface Definition Language
202 @cindex Interactive Data Language
203 @cindex cc-mode.el
204 @cindex @file{idl.el}
205 @cindex @file{idl-shell.el}
206 @cindex Feature overview
207
208 IDLWAVE is a package which supports editing source files written in
209 the Interactive Data Language (IDL), and running IDL as an inferior shell@footnote{IDLWAVE can also be used
210 for editing source files for the related WAVE/CL language, but with only
211 limited support.}. It is a feature-rich replacement for the IDLDE
212 development environment included with IDL, and uses the full power of
213 Emacs to make editing and running IDL programs easier, quicker, and more
214 structured.
215
216 IDLWAVE consists of two main parts: a major mode for editing IDL
217 source files (@code{idlwave-mode}) and a mode for running the IDL
218 program as an inferior shell (@code{idlwave-shell-mode}). Although
219 one mode can be used without the other, both work together closely to
220 form a complete development environment. Here is a brief summary of
221 what IDLWAVE does:
222
223 @itemize @bullet
224 @item
225 Smart code indentation and automatic-formatting.
226 @item
227 Three level syntax highlighting support.
228 @item
229 Context-sensitive display of calling sequences and keywords for more
230 than 1000 native IDL routines, extendible to any additional number of
231 local routines, and already available with many pre-scanned libraries.
232 @item
233 Fast, context-sensitive online HTML help, or source-header help for
234 undocumented routines.
235 @item
236 Context sensitive completion of routine names, keywords, system
237 variables, class names and much more.
238 @item
239 Easy insertion of code templates and abbreviations of common constructs.
240 @item
241 Automatic corrections to enforce a variety of customizable coding
242 standards.
243 @item
244 Integrity checks and auto-termination of logical blocks.
245 @item
246 Routine name space conflict search with likelihood-of-use ranking.
247 @item
248 Support for @file{imenu} (Emacs) and @file{func-menu} (XEmacs).
249 @item
250 Documentation support.
251 @item
252 Running IDL as an inferior Shell with history search, command line
253 editing and all the completion and routine info capabilities present in
254 IDL source buffers.
255 @item
256 Full handling of debugging with breakpoints, with interactive setting
257 of break conditions, and easy stepping through code.
258 @item
259 Compilation, execution and interactive single-keystroke debugging of
260 programs directly from the source buffer.
261 @item
262 Quick, source-guided navigation of the calling stack, with variable
263 inspection, etc.
264 @item
265 Examining variables and expressions with a mouse click.
266 @item
267 And much, much more...
268 @end itemize
269
270 @ifnottex
271 @cindex Screenshots
272 Here are a number of screenshots showing IDLWAVE in action:
273
274 @itemize @bullet
275 @item
276 @uref{http://idlwave.org/screenshots/emacs_21_nav.gif,An IDLWAVE buffer}
277 @item
278 @uref{http://idlwave.org/screenshots/emacs_21_keys.gif,A keyword being completed}
279 @item
280 @uref{http://idlwave.org/screenshots/emacs_21_help.gif,Online help text.}
281 @item
282 @uref{http://idlwave.org/screenshots/emacs_21_ri.gif,Routine information displayed}
283 @item
284 @uref{http://idlwave.org/screenshots/emacs_21_bp.gif,Debugging code
285 stopped at a breakpoint}
286 @end itemize
287 @end ifnottex
288
289 IDLWAVE is the distant successor to the @file{idl.el} and
290 @file{idl-shell.el} files written by Chris Chase. The modes and files
291 had to be renamed because of a name space conflict with CORBA's
292 @code{idl-mode}, defined in Emacs in the file @file{cc-mode.el}.
293
294 In this manual, each section ends with a list of related user options.
295 Don't be confused by the sheer number of options available --- in most
296 cases the default settings are just fine. The variables are listed here
297 to make sure you know where to look if you want to change anything. For
298 a full description of what a particular variable does and how to
299 configure it, see the documentation string of that variable (available
300 with @kbd{C-h v}). Some configuration examples are also given in the
301 appendix.
302
303 @node IDLWAVE in a Nutshell, Getting Started, Introduction, Top
304 @chapter IDLWAVE in a Nutshell
305 @cindex Summary of important commands
306 @cindex IDLWAVE in a Nutshell
307 @cindex Nutshell, IDLWAVE in a
308
309 @subheading Editing IDL Programs
310
311 @multitable @columnfractions .15 .85
312 @item @key{TAB}
313 @tab Indent the current line relative to context.
314 @item @kbd{C-M-\}
315 @tab Re-indent all lines in the current region.
316 @item @kbd{C-M-q}
317 @tab Re-indent all lines in the current routine.
318 @item @kbd{C-u @key{TAB}}
319 @tab Re-indent all lines in the current statement.
320 @item @kbd{M-@key{RET}}
321 @tab Start a continuation line, splitting the current line at point.
322 @item @kbd{M-q}
323 @tab Fill the current comment paragraph.
324 @item @kbd{C-c ?}
325 @tab Display calling sequence and keywords for the procedure or function call
326 at point.
327 @item @kbd{M-?}
328 @tab Load context sensitive online help for nearby routine, keyword, etc.
329 @item @kbd{M-@key{TAB}}
330 @tab Complete a procedure name, function name or keyword in the buffer.
331 @item @kbd{C-c C-i}
332 @tab Update IDLWAVE's knowledge about functions and procedures.
333 @item @kbd{C-c C-v}
334 @tab Visit the source code of a procedure/function.
335 @item @kbd{C-u C-c C-v}
336 @tab Visit the source code of a procedure/function in this buffer.
337 @item @kbd{C-c C-h}
338 @tab Insert a standard documentation header.
339 @item @kbd{C-c @key{RET}}
340 @tab Insert a new timestamp and history item in the documentation header.
341 @end multitable
342
343 @subheading Running the IDLWAVE Shell, Debugging Programs
344
345 @multitable @columnfractions .15 .85
346 @item @kbd{C-c C-s}
347 @tab Start IDL as a subprocess and/or switch to the shell buffer.
348 @item @key{Up}, @kbd{M-p}
349 @tab Cycle back through IDL command history.
350 @item @key{Down},@kbd{M-n}
351 @tab Cycle forward.
352 @item @kbd{@key{TAB}}
353 @tab Complete a procedure name, function name or keyword in the shell buffer.
354 @item @kbd{C-c C-d C-c}
355 @tab Save and compile the source file in the current buffer.
356 @item @kbd{C-c C-d C-x}
357 @tab Go to next syntax error.
358 @item @kbd{C-c C-d C-v}
359 @tab Switch to electric debug mode.
360 @item @kbd{C-c C-d C-b}
361 @tab Set a breakpoint at the nearest viable source line.
362 @item @kbd{C-c C-d C-d}
363 @tab Clear the nearest breakpoint.
364 @item @kbd{C-c C-d [}
365 @tab Go to the previous breakpoint.
366 @item @kbd{C-c C-d ]}
367 @tab Go to the next breakpoint.
368 @item @kbd{C-c C-d C-p}
369 @tab Print the value of the expression near point in IDL.
370 @end multitable
371
372 @subheading Commonly used Settings in @file{.emacs}
373 @lisp
374 ;; Change the indentation preferences
375 ;; Start autoloading routine info after 2 idle seconds
376 (setq idlwave-init-rinfo-when-idle-after 2)
377 ;; Pad operators with spaces
378 (setq idlwave-do-actions t
379 idlwave-surround-by-blank t)
380 ;; Syntax Highlighting
381 (add-hook 'idlwave-mode-hook 'turn-on-font-lock)
382 ;; Automatically start the shell when needed
383 (setq idlwave-shell-automatic-start t)
384 ;; Bind debugging commands with CONTROL and SHIFT modifiers
385 (setq idlwave-shell-debug-modifiers '(control shift))
386 @end lisp
387
388 @html
389 <A NAME="TUTORIAL"></A>
390 @end html
391
392 @node Getting Started, The IDLWAVE Major Mode, IDLWAVE in a Nutshell, Top
393 @chapter Getting Started (Tutorial)
394 @cindex Quick-Start
395 @cindex Tutorial
396 @cindex Getting Started
397
398 @menu
399 * Lesson I -- Development Cycle::
400 * Lesson II -- Customization::
401 * Lesson III -- User Catalog::
402 @end menu
403
404 @node Lesson I -- Development Cycle, Lesson II -- Customization, Getting Started, Getting Started
405 @section Lesson I: Development Cycle
406
407 The purpose of this tutorial is to guide you through a very basic
408 development cycle using IDLWAVE. We will paste a simple program into
409 a buffer and use the shell to compile, debug and run it. On the way
410 we will use many of the important IDLWAVE commands. Note, however,
411 that IDLWAVE has many more capabilities than covered here, which can
412 be discovered by reading the entire manual, or hovering over the
413 shoulder of your nearest IDLWAVE guru for a few days.
414
415 It is assumed that you have access to Emacs or XEmacs with the full
416 IDLWAVE package including online help. We also assume that you are
417 familiar with Emacs and can read the nomenclature of key presses in
418 Emacs (in particular, @kbd{C} stands for @key{CONTROL} and @kbd{M} for
419 @key{META} (often the @key{ALT} key carries this functionality)).
420
421 Open a new source file by typing:
422
423 @example
424 @kbd{C-x C-f tutorial.pro @key{RET}}
425 @end example
426
427 A buffer for this file will pop up, and it should be in IDLWAVE mode,
428 indicated in the mode line just below the editing window. Also, the
429 menu bar should contain @samp{IDLWAVE}.
430
431 Now cut-and-paste the following code, also available as
432 @file{tutorial.pro} in the IDLWAVE distribution.
433
434 @example
435 function daynr,d,m,y
436 ;; compute a sequence number for a date
437 ;; works 1901-2099.
438 if y lt 100 then y = y+1900
439 if m le 2 then delta = 1 else delta = 0
440 m1 = m + delta*12 + 1
441 y1 = y * delta
442 return, d + floor(m1*30.6)+floor(y1*365.25)+5
443 end
444
445 function weekday,day,month,year
446 ;; compute weekday number for date
447 nr = daynr(day,month,year)
448 return, nr mod 7
449 end
450
451 pro plot_wday,day,month
452 ;; Plot the weekday of a date in the first 10 years of this century.
453 years = 2000,+indgen(10)
454 wdays = intarr(10)
455 for i=0,n_elements(wdays)-1 do begin
456 wdays[i] = weekday(day,month,years[i])
457 end
458 plot,years,wdays,YS=2,YT="Wday (0=Sunday)"
459 end
460 @end example
461
462 The indentation probably looks funny, since it's different from the
463 settings you use, so use the @key{TAB} key in each line to
464 automatically line it up (or, more quickly, @emph{select} the entire
465 buffer with @kbd{C-x h}, and indent the whole region with
466 @kbd{C-M-\}). Notice how different syntactical elements are
467 highlighted in different colors, if you have set up support for
468 font-lock.
469
470 Let's check out two particular editing features of IDLWAVE. Place the
471 cursor after the @code{end} statement of the @code{for} loop and press
472 @key{SPC}. IDLWAVE blinks back to the beginning of the block and
473 changes the generic @code{end} to the specific @code{endfor}
474 automatically (as long as the variable @code{idlwave-expand-generic-end}
475 is turned on --- @pxref{Lesson II -- Customization}). Now place the
476 cursor in any line you would like to split and press @kbd{M-@key{RET}}.
477 The line is split at the cursor position, with the continuation @samp{$}
478 and indentation all taken care of. Use @kbd{C-/} to undo the last
479 change.
480
481 The procedure @code{plot_wday} is supposed to plot the day of the week
482 of a given date for the first 10 years of the 21st century. As in
483 most code, there are a few bugs, which we are going to use IDLWAVE to
484 help us fix.
485
486 First, let's launch the IDLWAVE shell. You do this with the command
487 @kbd{C-c C-s}. The Emacs window will split or another window will popup
488 to display IDL running in a shell interaction buffer. Type a few
489 commands like @code{print,!PI} to convince yourself that you can work
490 there just as well as in a terminal, or the IDLDE. Use the arrow keys
491 to cycle through your command history. Are we having fun now?
492
493 Now go back to the source window and type @kbd{C-c C-d C-c} to compile
494 the program. If you watch the shell buffer, you see that IDLWAVE types
495 @samp{.run "tutorial.pro"} for you. But the compilation fails because
496 there is a comma in the line @samp{years=...}. The line with the error
497 is highlighted and the cursor positioned at the error, so remove the
498 comma (you should only need to hit @kbd{Delete}!). Compile again, using
499 the same keystrokes as before. Notice that the file is automatically
500 saved for you. This time everything should work fine, and you should
501 see the three routines compile.
502
503 Now we want to use the command to plot the day of the week on January
504 1st. We could type the full command ourselves, but why do that? Go
505 back to the shell window, type @samp{plot_} and hit @key{TAB}. After
506 a bit of a delay (while IDLWAVE initializes its routine info database,
507 if necessary), the window will split to show all procedures it knows
508 starting with that string, and @w{@code{plot_wday}} should be one of
509 them. Saving the buffer alerted IDLWAVE about this new routine.
510 Click with the middle mouse button on @code{plot_wday} and it will be
511 copied to the shell buffer, or if you prefer, add @samp{w} to
512 @samp{plot_} to make it unambiguous (depending on what other routines
513 starting with @samp{plot_} you have installed on your system), hit
514 @key{TAB} again, and the full routine name will be completed. Now
515 provide the two arguments:
516
517 @example
518 plot_wday,1,1
519 @end example
520
521 @noindent and press @key{RET}. This fails with an error message telling
522 you the @code{YT} keyword to plot is ambiguous. What are the allowed
523 keywords again? Go back to the source window and put the cursor into
524 the `plot' line and press @kbd{C-c ?}. This shows the routine info
525 window for the plot routine, which contains a list of keywords, along
526 with the argument list. Oh, we wanted @code{YTITLE}. Fix that up.
527 Recompile with @kbd{C-c C-d C-c}. Jump back into the shell with
528 @kbd{C-c C-s}, press the @key{UP} arrow to recall the previous command
529 and execute again.
530
531 This time we get a plot, but it is pretty ugly --- the points are all
532 connected with a line. Hmm, isn't there a way for @code{plot} to use
533 symbols instead? What was that keyword? Position the cursor on the
534 plot line after a comma (where you'd normally type a keyword), and hit
535 @kbd{M-@key{Tab}}. A long list of plot's keywords appears. Aha,
536 there it is, @code{PSYM}. Middle click to insert it. An @samp{=}
537 sign is included for you too. Now what were the values of @code{PSYM}
538 supposed to be? With the cursor on or after the keyword, press
539 @kbd{M-?} for online help (alternatively, you could have right clicked
540 on the colored keyword itself in the completion list). A browser will
541 pop up showing the HTML documentation for the @code{PYSM} keyword.
542 OK, let's use diamonds=4. Fix this, recompile (you know the command
543 by now: @kbd{C-c C-d C-c}), go back to the shell (if it's vanished,
544 you know what to do: @kbd{C-c C-s}) and execute again. Now things
545 look pretty good.
546
547 Let's try a different day --- how about April fool's day?
548
549 @example
550 plot_wday,1,4
551 @end example
552
553 Oops, this looks very wrong. All April Fool's days cannot be Fridays!
554 We've got a bug in the program, perhaps in the @code{daynr} function.
555 Let's put a breakpoint on the last line there. Position the cursor on
556 the @samp{return, d+...} line and press @kbd{C-c C-d C-b}. IDL sets a
557 breakpoint (as you see in the shell window), and the break line is
558 indicated. Back to the shell buffer, re-execute the previous command.
559 IDL stops at the line with the breakpoint. Now hold down the SHIFT
560 key and click with the middle mouse button on a few variables there:
561 @samp{d}, @samp{y}, @samp{m}, @samp{y1}, etc. Maybe @code{d} isn't
562 the correct type. CONTROL-SHIFT middle-click on it for help. Well,
563 it's an integer, so that's not the problem. Aha, @samp{y1} is zero,
564 but it should be the year, depending on delta. Shift click
565 @samp{delta} to see that it's 0. Below, we see the offending line:
566 @samp{y1=y*delta...} the multiplication should have been a minus sign!
567 Hit @kbd{q} to exit the debugging mode, and fix the line to read:
568
569 @example
570 y1 = y - delta
571 @end example
572
573 Now remove all breakpoints: @kbd{C-c C-d C-a}. Recompile and rerun the
574 command. Everything should now work fine. How about those leap years?
575 Change the code to plot 100 years and see that every 28 years, the
576 sequence of weekdays repeats.
577
578 @node Lesson II -- Customization, Lesson III -- User Catalog, Lesson I -- Development Cycle, Getting Started
579 @section Lesson II: Customization
580
581 Emacs is probably the most customizable piece of software ever written,
582 and it would be a shame if you did not make use of this to adapt IDLWAVE
583 to your own preferences. Customizing Emacs or IDLWAVE is accomplished
584 by setting Lisp variables in the @file{.emacs} file in your home
585 directory --- but do not be dismayed; for the most part, you can just
586 copy and work from the examples given here.
587
588 Let's first use a boolean variable. These are variables which you turn
589 on or off, much like a checkbox. A value of @samp{t} means on, a value
590 of @samp{nil} means off. Copy the following line into your
591 @file{.emacs} file, exit and restart Emacs.
592
593 @lisp
594 (setq idlwave-reserved-word-upcase t)
595 @end lisp
596
597 When this option is turned on, each reserved word you type into an IDL
598 source buffer will be converted to upper case when you press @key{SPC}
599 or @key{RET} right after the word. Try it out! @samp{if} changes to
600 @samp{IF}, @samp{begin} to @samp{BEGIN}. If you don't like this
601 behavior, remove the option again from your @file{.emacs} file and
602 restart Emacs.
603
604 You likely have your own indentation preferences for IDL code. For
605 example, some may prefer to indent the main block of an IDL program
606 slightly from the margin and use only 3 spaces as indentation between
607 @code{BEGIN} and @code{END}. Try the following lines in @file{.emacs}:
608
609 @lisp
610 (setq idlwave-main-block-indent 1)
611 (setq idlwave-block-indent 3)
612 (setq idlwave-end-offset -3)
613 @end lisp
614
615 Restart Emacs, and re-indent the program we developed in the first part
616 of this tutorial with @kbd{C-c h} and @kbd{C-M-\}. You may want to keep
617 these lines in @file{.emacs}, with values adjusted to your likings. If
618 you want to get more information about any of these variables, type,
619 e.g., @kbd{C-h v idlwave-main-block-indent @key{RET}}. To find which
620 variables can be customized, look for items marked @samp{User Option:}
621 throughout this manual.
622
623 If you cannot seem to master this Lisp customization in @file{.emacs},
624 there is another, more user-friendly way to customize all the IDLWAVE
625 variables. You can access it through the IDLWAVE menu in one of the
626 @file{.pro} buffers, menu item @code{Customize->Browse IDLWAVE
627 Group}. Here you'll be presented with all the various variables grouped
628 into categories. You can navigate the hierarchy (e.g. @samp{IDLWAVE
629 Code Formatting->Idlwave Abbrev And Indent Action->Idlwave Expand
630 Generic End} to turn on @code{END} expansion), read about the variables,
631 change them, and `Save for Future Sessions'. Few of these variables
632 need customization, but you can exercise considerable control over
633 IDLWAVE's functionality with them.
634
635 You may also find the key bindings used for the debugging commands too
636 long and complicated. Often we have heard complaints along the lines
637 of, ``Do I really have to go through the finger gymnastics of @kbd{C-c
638 C-d C-c} to run a simple command?'' Due to Emacs rules and
639 conventions, shorter bindings cannot be set by default, but you can
640 easily enable them. First, there is a way to assign all debugging
641 commands in a single sweep to another simpler combination. The only
642 problem is that we have to use something which Emacs does not need for
643 other important commands. One good option is to execute debugging
644 commands by holding down @key{CONTROL} and @key{SHIFT} while pressing
645 a single character: @kbd{C-S-b} for setting a breakpoint, @kbd{C-S-c}
646 for compiling the current source file, @kbd{C-S-a} for deleting all
647 breakpoints (try it, it's easier). You can enable this with:
648
649 @lisp
650 (setq idlwave-shell-debug-modifiers '(shift control))
651 @end lisp
652
653 @noindent If you have a special keyboard with, for example, a
654 @key{SUPER} key, you could even shorten that:
655
656 @lisp
657 (setq idlwave-shell-debug-modifiers '(super))
658 @end lisp
659
660 @noindent to get compilation on @kbd{S-c}. Often, a modifier key like
661 @key{SUPER} or @key{HYPER} is bound or can be bound to an otherwise
662 unused key on your keyboard --- consult your system documentation.
663
664 You can also assign specific commands to keys. This you must do in the
665 @emph{mode-hook}, a special function which is run when a new IDLWAVE
666 buffer gets set up. The possibilities for key customization are
667 endless. Here we set function keys f4-f8 to common debugging commands.
668
669 @lisp
670 ;; First for the source buffer
671 (add-hook 'idlwave-mode-hook
672 (lambda ()
673 (local-set-key [f4] 'idlwave-shell-retall)
674 (local-set-key [f5] 'idlwave-shell-break-here)
675 (local-set-key [f6] 'idlwave-shell-clear-current-bp)
676 (local-set-key [f7] 'idlwave-shell-cont)
677 (local-set-key [f8] 'idlwave-shell-clear-all-bp)))
678 ;; Then for the shell buffer
679 (add-hook 'idlwave-shell-mode-hook
680 (lambda ()
681 (local-set-key [f4] 'idlwave-shell-retall)
682 (local-set-key [f5] 'idlwave-shell-break-here)
683 (local-set-key [f6] 'idlwave-shell-clear-current-bp)
684 (local-set-key [f7] 'idlwave-shell-cont)
685 (local-set-key [f8] 'idlwave-shell-clear-all-bp)))
686 @end lisp
687
688 @node Lesson III -- User Catalog, , Lesson II -- Customization, Getting Started
689 @section Lesson III: User and Library Catalogs
690
691 We have already used the routine info display in the first part of this
692 tutorial. This was the invoked using @kbd{C-c ?}, and displays
693 information about the IDL routine near the cursor position. Wouldn't it
694 be nice to have the same kind of information available for your own
695 routines and for the huge amount of code in major libraries like JHUPL
696 or the IDL-Astro library? In many cases, you may already have this
697 information. Files named @file{.idlwave_catalog} in library directories
698 contain scanned information on the routines in that directory; many
699 popular libraries ship with these ``library catalogs'' pre-scanned.
700 Users can scan their own routines in one of two ways: either using the
701 supplied tool to scan directories and build their own
702 @file{.idlwave_catalog} files, or using the built-in method to create a
703 single ``user catalog'', which we'll show here. @xref{Catalogs}, for
704 more information on choosing which method to use.
705
706 To build a user catalog, select @code{Routine Info/Select Catalog
707 Directories} from the IDLWAVE entry in the menu bar. If necessary,
708 start the shell first with @kbd{C-c C-s} (@pxref{Starting the Shell}).
709 IDLWAVE will find out about the IDL @code{!PATH} variable and offer a
710 list of directories on the path. Simply select them all (or whichever
711 you want --- directories with existing library catalogs will not be
712 selected by default) and click on the @samp{Scan&Save} button. Then
713 go for a cup of coffee while IDLWAVE collects information for each and
714 every IDL routine on your search path. All this information is
715 written to the file @file{.idlwave/idlusercat.el} in your home
716 directory and will from now on automatically load whenever you use
717 IDLWAVE. You may find it necessary to rebuild the catalog on occasion
718 as your local libraries change, or build a library catalog for those
719 directories instead. Invoke routine info (@kbd{C-c ?}) or completion
720 (@kbd{M-@key{TAB}}) on any routine or partial routine name you know to
721 be located in the library. E.g., if you have scanned the IDL-Astro
722 library:
723
724 @example
725 a=readf@key{M-@key{TAB}}
726 @end example
727
728 expands to `readfits('. Then try
729
730 @example
731 a=readfits(@key{C-c ?}
732 @end example
733
734 and you get:
735
736 @example
737 Usage: Result = READFITS(filename, header, heap)
738 ...
739 @end example
740
741 I hope you made it until here. Now you are set to work with IDLWAVE.
742 On the way you will want to change other things, and to learn more
743 about the possibilities not discussed in this short tutorial. Read
744 the manual, look at the documentation strings of interesting variables
745 (with @kbd{C-h v idlwave<-variable-name> @key{RET}}) and ask the
746 remaining questions on the newsgroup @code{comp.lang.idl-pvwave}.
747
748 @node The IDLWAVE Major Mode, The IDLWAVE Shell, Getting Started, Top
749 @chapter The IDLWAVE Major Mode
750 @cindex IDLWAVE major mode
751 @cindex Major mode, @code{idlwave-mode}
752
753 The IDLWAVE major mode supports editing IDL source files. In this
754 chapter we describe the main features of the mode and how to customize
755 them.
756
757 @menu
758 * Code Formatting:: Making code look nice
759 * Routine Info:: Calling Sequence and Keyword List
760 * Online Help:: One key press from source to help
761 * Completion:: Completing routine names and Keywords
762 * Routine Source:: Finding routines, the easy way
763 * Resolving Routines:: Force the Shell to compile a routine
764 * Code Templates:: Frequent code constructs
765 * Abbreviations:: Abbreviations for common commands
766 * Actions:: Changing case, Padding, End checking
767 * Doc Header:: Inserting a standard header
768 * Motion Commands:: Moving through the structure of a program
769 * Misc Options:: Things that fit nowhere else
770 @end menu
771
772 @node Code Formatting, Routine Info, The IDLWAVE Major Mode, The IDLWAVE Major Mode
773 @section Code Formatting
774 @cindex Code formatting
775 @cindex Formatting, of code
776
777 @menu
778 * Code Indentation:: Reflecting the logical structure
779 * Continued Statement Indentation::
780 * Comment Indentation:: Special indentation for comment lines
781 * Continuation Lines:: Splitting statements over lines
782 * Syntax Highlighting:: Font-lock support
783 * Octals and Highlighting:: Why "123 causes problems
784 @end menu
785
786 The IDL language, with its early roots in FORTRAN, modern
787 implementation in C, and liberal borrowing of features of many vector
788 and other languages along its 25+ year history, has inherited an
789 unusual mix of syntax elements. Left to his or her own devices, a
790 novice IDL programmer will often conjure code which is very difficult
791 to read and impossible to adapt. Much can be gleaned from studying
792 available IDL code libraries for coding style pointers, but, due to
793 the variety of IDL syntax elements, replicating this style can be
794 challenging at best. Luckily, IDLWAVE understands the structure of
795 IDL code very well, and takes care of almost all formatting issues for
796 you. After configuring it to match your coding standards, you can
797 rely on it to help keep your code neat and organized.
798
799
800 @node Code Indentation, Continued Statement Indentation, Code Formatting, Code Formatting
801 @subsection Code Indentation
802 @cindex Code indentation
803 @cindex Indentation
804
805 Like all Emacs programming modes, IDLWAVE performs code indentation.
806 The @key{TAB} key indents the current line relative to context.
807 @key{LFD} insert a newline and indents the new line. The indentation is
808 governed by a number of variables. IDLWAVE indents blocks (between
809 @code{PRO}/@code{FUNCTION}/@code{BEGIN} and @code{END}), and
810 continuation lines.
811
812 @cindex Foreign code, adapting
813 @cindex Indentation, of foreign code
814 @kindex C-M-\
815 To re-indent a larger portion of code (e.g. when working with foreign
816 code written with different conventions), use @kbd{C-M-\}
817 (@code{indent-region}) after marking the relevant code. Useful marking
818 commands are @kbd{C-x h} (the entire file) or @kbd{C-M-h} (the current
819 subprogram). The command @kbd{C-M-q} reindents the entire current
820 routine. @xref{Actions}, for information how to impose additional
821 formatting conventions on foreign code.
822
823 @defopt idlwave-main-block-indent (@code{2})
824 Extra indentation for the main block of code. That is the block between
825 the FUNCTION/PRO statement and the END statement for that program
826 unit.
827 @end defopt
828
829 @defopt idlwave-block-indent (@code{3})
830 Extra indentation applied to block lines. If you change this, you
831 probably also want to change @code{idlwave-end-offset}.
832 @end defopt
833
834 @defopt idlwave-end-offset (@code{-3})
835 Extra indentation applied to block END lines. A value equal to negative
836 @code{idlwave-block-indent} will make END lines line up with the block
837 BEGIN lines.
838 @end defopt
839
840 @node Continued Statement Indentation, Comment Indentation, Code Indentation, Code Formatting
841 @subsection Continued Statement Indentation
842 @cindex Indentation, continued statement
843 @cindex Continued statement indentation
844 Continuation lines (following a line ending with @code{$}) can receive a
845 fixed indentation offset from the main level, but in several situations
846 IDLWAVE can use a special form of indentation which aligns continued
847 statements more naturally. Special indentation is calculated for
848 continued routine definition statements and calls, enclosing parentheses
849 (like function calls, structure/class definitions, explicit structures
850 or lists, etc.), and continued assignments. An attempt is made to line
851 up with the first non-whitespace character after the relevant opening
852 punctuation mark (@code{,},@code{(},@code{@{},@code{[},@code{=}). For
853 lines without any non-comment characters on the line with the opening
854 punctuation, the continued line(s) are aligned just past the
855 punctuation. An example:
856
857 @example
858 function foo, a, b, $
859 c, d
860 bar = sin( a + b + $
861 c + d)
862 end
863 @end example
864 @noindent
865
866 The only drawback to this special continued statement indentation is
867 that it consumes more space, e.g., for long function names or left hand
868 sides of an assignment:
869
870 @example
871 function thisfunctionnameisverylongsoitwillleavelittleroom, a, b, $
872 c, d
873 @end example
874
875 You can instruct IDLWAVE when to avoid using this special continuation
876 indentation by setting the variable
877 @code{idlwave-max-extra-continuation-indent}, which specifies the
878 maximum additional indentation beyond the basic indent to be
879 tolerated, otherwise defaulting to a fixed-offset from the enclosing
880 indent (the size of which offset is set in
881 @code{idlwave-continuation-indent}). As a special case, continuations
882 of routine calls without any arguments or keywords will @emph{not}
883 align the continued line, under the assumption that you continued
884 because you needed the space.
885
886 Also, since the indentation level can be somewhat dynamic in continued
887 statements with special continuation indentation, especially if
888 @code{idlwave-max-extra-continuation-indent} is small, the key
889 @kbd{C-u @key{TAB}} will re-indent all lines in the current statement.
890 Note that @code{idlwave-indent-to-open-paren}, if non-@code{nil},
891 overrides the @code{idlwave-max-extra-continuation-indent} limit, for
892 parentheses only, forcing them always to line up.
893
894
895 @defopt idlwave-continuation-indent (@code{2})
896 Extra indentation applied to normal continuation lines.
897 @end defopt
898
899 @defopt idlwave-max-extra-continuation-indent (@code{20})
900 The maximum additional indentation (over the basic continuation-indent)
901 that will be permitted for special continues. To effectively disable
902 special continuation indentation, set to @code{0}. To enable it
903 constantly, set to a large number (like @code{100}). Note that the
904 indentation in a long continued statement never decreases from line to
905 line, outside of nested parentheses statements.
906 @end defopt
907
908 @defopt idlwave-indent-to-open-paren (@code{t})
909 Non-@code{nil} means indent continuation lines to innermost open
910 parenthesis, regardless of whether the
911 @code{idlwave-max-extra-continuation-indent} limit is satisfied.
912 @end defopt
913
914 @node Comment Indentation, Continuation Lines, Continued Statement Indentation, Code Formatting
915 @subsection Comment Indentation
916 @cindex Comment indentation
917 @cindex Hanging paragraphs
918 @cindex Paragraphs, filling
919 @cindex Paragraphs, hanging
920
921 In IDL, lines starting with a @samp{;} are called @emph{comment lines}.
922 Comment lines are indented as follows:
923
924 @multitable @columnfractions .1 .90
925 @item @code{;;;}
926 @tab The indentation of lines starting with three semicolons remains
927 unchanged.
928 @item @code{;;}
929 @tab Lines starting with two semicolons are indented like the surrounding code.
930 @item @code{;}
931 @tab Lines starting with a single semicolon are indented to a minimum column.
932 @end multitable
933
934 @noindent
935 The indentation of comments starting in column 0 is never changed.
936
937 @defopt idlwave-no-change-comment
938 The indentation of a comment starting with this regexp will not be
939 changed.
940 @end defopt
941
942 @defopt idlwave-begin-line-comment
943 A comment anchored at the beginning of line.
944 @end defopt
945
946 @defopt idlwave-code-comment
947 A comment that starts with this regexp is indented as if it is a part of
948 IDL code.
949 @end defopt
950
951 @node Continuation Lines, Syntax Highlighting, Comment Indentation, Code Formatting
952 @subsection Continuation Lines and Filling
953 @cindex Continuation lines
954 @cindex Line splitting
955 @cindex String splitting
956 @cindex Splitting, of lines
957
958 @kindex M-@key{RET}
959 In IDL, a newline character terminates a statement unless preceded by a
960 @samp{$}. If you would like to start a continuation line, use
961 @kbd{M-@key{RET}}, which calls the command @code{idlwave-split-line}.
962 It inserts the continuation character @samp{$}, terminates the line and
963 indents the new line. The command @kbd{M-@key{RET}} can also be invoked
964 inside a string to split it at that point, in which case the @samp{+}
965 concatenation operator is used.
966
967 @cindex Filling
968 @cindex @code{auto-fill-mode}
969 @cindex Hanging paragraphs
970 When filling comment paragraphs, IDLWAVE overloads the normal filling
971 functions and uses a function which creates the hanging paragraphs
972 customary in IDL routine headers. When @code{auto-fill-mode} is turned
973 on (toggle with @kbd{C-c C-a}), comments will be auto-filled. If the
974 first line of a paragraph contains a match for
975 @code{idlwave-hang-indent-regexp} (a dash-space by default), subsequent
976 lines are positioned to line up after it, as in the following example.
977
978 @example
979 @group
980 ;=================================
981 ; x - an array containing
982 ; lots of interesting numbers.
983 ;
984 ; y - another variable where
985 ; a hanging paragraph is used
986 ; to describe it.
987 ;=================================
988 @end group
989 @end example
990
991 @kindex M-q
992 You can also refill a comment at any time paragraph with @kbd{M-q}.
993 Comment delimiting lines as in the above example, consisting of one or
994 more @samp{;} followed by one or more of the characters @samp{+=-_*},
995 are kept in place, as is.
996
997 @defopt idlwave-fill-comment-line-only (@code{t})
998 Non-@code{nil} means auto fill will only operate on comment lines.
999 @end defopt
1000
1001 @defopt idlwave-auto-fill-split-string (@code{t})
1002 Non-@code{nil} means auto fill will split strings with the IDL @samp{+}
1003 operator.
1004 @end defopt
1005
1006 @defopt idlwave-split-line-string (@code{t})
1007 Non-@code{nil} means @code{idlwave-split-line} will split strings with
1008 @samp{+}.
1009 @end defopt
1010
1011 @defopt idlwave-hanging-indent (@code{t})
1012 Non-@code{nil} means comment paragraphs are indented under the hanging
1013 indent given by @code{idlwave-hang-indent-regexp} match in the first
1014 line of the paragraph.
1015 @end defopt
1016
1017 @defopt idlwave-hang-indent-regexp (@code{"- "})
1018 Regular expression matching the position of the hanging indent
1019 in the first line of a comment paragraph.
1020 @end defopt
1021
1022 @defopt idlwave-use-last-hang-indent (@code{nil})
1023 Non-@code{nil} means use last match on line for
1024 @code{idlwave-indent-regexp}.
1025 @end defopt
1026
1027 @node Syntax Highlighting, Octals and Highlighting, Continuation Lines, Code Formatting
1028 @subsection Syntax Highlighting
1029 @cindex Syntax highlighting
1030 @cindex Highlighting of syntax
1031 @cindex Font lock
1032
1033 Highlighting of keywords, comments, strings etc. can be accomplished
1034 with @code{font-lock}. If you are using @code{global-font-lock-mode}
1035 (in Emacs), or have @code{font-lock} turned on in any other buffer in
1036 XEmacs, it should also automatically work in IDLWAVE buffers. If you'd
1037 prefer invoking font-lock individually by mode, you can enforce it in
1038 @code{idlwave-mode} with the following line in your @file{.emacs}:
1039
1040 @lisp
1041 (add-hook 'idlwave-mode-hook 'turn-on-font-lock)
1042 @end lisp
1043
1044 @noindent IDLWAVE supports 3 increasing levels of syntax highlighting.
1045 The variable @code{font-lock-maximum-decoration} determines which level
1046 is selected. Individual categories of special tokens can be selected
1047 for highlighting using the variable
1048 @code{idlwave-default-font-lock-items}.
1049
1050 @defopt idlwave-default-font-lock-items
1051 Items which should be fontified on the default fontification level
1052 2.
1053 @end defopt
1054
1055 @node Octals and Highlighting, , Syntax Highlighting, Code Formatting
1056 @subsection Octals and Highlighting
1057 @cindex Syntax highlighting, Octals
1058 @cindex Highlighting of syntax, Octals
1059
1060 A rare syntax highlighting problem results from an extremely unfortunate
1061 notation for octal numbers in IDL: @code{"123}. This unpaired quotation
1062 mark is very difficult to parse, given that it can be mixed on a single
1063 line with any number of strings. Emacs will incorrectly identify this
1064 as a string, and the highlighting of following lines of code can be
1065 distorted, since the string is never terminated.
1066
1067 One solution to this involves terminating the mistakenly identified
1068 string yourself by providing a closing quotation mark in a comment:
1069
1070 @example
1071 string("305B) + $ ;" <--- for font-lock
1072 ' is an Angstrom.'
1073 @end example
1074
1075 @noindent A far better solution is to abandon this notation for octals
1076 altogether, and use the more sensible alternative IDL provides:
1077
1078 @example
1079 string('305'OB) + ' is an Angstrom.'
1080 @end example
1081
1082 @noindent This simultaneously solves the font-lock problem and is more
1083 consistent with the notation for hexadecimal numbers, e.g. @code{'C5'XB}.
1084
1085 @node Routine Info, Online Help, Code Formatting, The IDLWAVE Major Mode
1086 @section Routine Info
1087 @cindex Routine info
1088 @cindex Updating routine info
1089 @cindex Scanning buffers for routine info
1090 @cindex Buffers, scanning for routine info
1091 @cindex Shell, querying for routine info
1092
1093 @kindex C-c C-i
1094 IDL comes bundled with more than one thousand procedures, functions
1095 and object methods, and large libraries typically contain hundreds or
1096 even thousands more (each with a few to tens of keywords and
1097 arguments). This large command set can make it difficult to remember
1098 the calling sequence and keywords for the routines you use, but
1099 IDLWAVE can help. It builds up routine information from a wide
1100 variety of sources; IDLWAVE in fact knows far more about the
1101 @samp{.pro} routines on your system than IDL itself! It maintains a
1102 list of all built-in routines, with calling sequences and
1103 keywords@footnote{This list is created by scanning the IDL manuals and
1104 might contain (very few) errors. Please report any errors to the
1105 maintainer, so that they can be fixed.}. It also scans Emacs buffers
1106 for routine definitions, queries the IDLWAVE-Shell for information
1107 about routines currently compiled there, and automatically locates
1108 library and user-created catalogs. This information is updated
1109 automatically, and so should usually be current. To force a global
1110 update and refresh the routine information, use @kbd{C-c C-i}
1111 (@code{idlwave-update-routine-info}).
1112
1113 @kindex C-c ?
1114 To display the information about a routine, press @kbd{C-c ?}, which
1115 calls the command @code{idlwave-routine-info}. When the current cursor
1116 position is on the name or in the argument list of a procedure or
1117 function, information will be displayed about the routine. For example,
1118 consider the indicated cursor positions in the following line:
1119
1120 @example
1121 plot,x,alog(x+5*sin(x) + 2),
1122 | | | | | | | |
1123 1 2 3 4 5 6 7 8
1124 @end example
1125
1126 @cindex Default routine, for info and help
1127 On positions 1,2 and 8, information about the @samp{plot} procedure will
1128 be shown. On positions 3,4, and 7, the @samp{alog} function will be
1129 described, while positions 5 and 6 will investigate the @samp{sin}
1130 function.
1131
1132 When you ask for routine information about an object method, and the
1133 method exists in several classes, IDLWAVE queries for the class of the
1134 object, unless the class is already known through a text property on the
1135 @samp{->} operator (@pxref{Object Method Completion and Class
1136 Ambiguity}), or by having been explicity included in the call
1137 (e.g. @code{a->myclass::Foo}).
1138
1139 @cindex Calling sequences
1140 @cindex Keywords of a routine
1141 @cindex Routine source information
1142 The description displayed contains the calling sequence, the list of
1143 keywords and the source location of this routine. It looks like this:
1144
1145 @example
1146 Usage: XMANAGER, NAME, ID
1147 Keywords: BACKGROUND CATCH CLEANUP EVENT_HANDLER GROUP_LEADER
1148 JUST_REG MODAL NO_BLOCK
1149 Source: SystemLib [LCSB] /soft1/idl53/lib/xmanager.pro
1150 @end example
1151
1152 @cindex Categories, of routines
1153 @cindex Load-path shadows
1154 @cindex Shadows, load-path
1155 @cindex IDL variable @code{!PATH}
1156 @cindex @code{!PATH}, IDL variable
1157 @cindex IDL variable @code{!DIR}
1158 @cindex @code{!DIR}, IDL variable
1159
1160 If a definition of this routine exists in several files accessible to
1161 IDLWAVE, several @samp{Source} lines will point to the different
1162 files. This may indicate that your routine is shadowing a system
1163 library routine, which may or may not be what you want
1164 (@pxref{Load-Path Shadows}). The information about the calling
1165 sequence and keywords is derived from the first source listed.
1166 Library routines are available only if you have scanned your local IDL
1167 directories or are using pre-scanned libraries (@pxref{Catalogs}).
1168 The source entry consists of a @emph{source category}, a set of
1169 @emph{flags} and the path to the @emph{source file}. The following
1170 default categories exist:
1171
1172 @multitable @columnfractions .15 .85
1173 @item @i{System}
1174 @tab A system routine of unknown origin. When the system library has
1175 been scanned as part of a catalog (@pxref{Catalogs}), this category
1176 will automatically split into the next two.
1177 @item @i{Builtin}
1178 @tab A builtin system routine with no source code available.
1179 @item @i{SystemLib}
1180 @tab A library system routine in the official lib directory @file{!DIR/lib}.
1181 @item @i{Obsolete}
1182 @tab A library routine in the official lib directory @file{!DIR/lib/obsolete}.
1183 @item @i{Library}
1184 @tab A routine in a file on IDL's search path @code{!PATH}.
1185 @item @i{Other}
1186 @tab Any other routine with a file not known to be on the search path.
1187 @item @i{Unresolved}
1188 @tab An otherwise unkown routine the shell lists as unresolved
1189 (referenced, but not compiled).
1190 @end multitable
1191
1192 Any routines discovered in library catalogs (@pxref{Library
1193 Catalogs}), will display the category assigned during creation,
1194 e.g. @samp{NasaLib}. For routines not discovered in this way, you can
1195 create additional categories based on the routine's filename using the
1196 variable @code{idlwave-special-lib-alist}.
1197
1198 @cindex Flags, in routine info
1199 @cindex Duplicate routines
1200 @cindex Multiply defined routines
1201 @cindex Routine definitions, multiple
1202 The flags @code{[LCSB]} indicate the source of the information IDLWAVE
1203 has regarding the file: from a library catalog (@w{@code{[L---]}}),
1204 from a user catalog (@w{@code{[-C--]}}, from the IDL Shell
1205 (@w{@code{[--S-]}}) or from an Emacs buffer (@w{@code{[---B]}}).
1206 Combinations are possible (a compiled library routine visited in a
1207 buffer might read @w{@code{[L-SB]}}). If a file contains multiple
1208 definitions of the same routine, the file name will be prefixed with
1209 @samp{(Nx)} where @samp{N} is the number of definitions.
1210
1211 @cindex Online Help from the routine info buffer
1212 @cindex Active text, in routine info
1213 @cindex Inserting keywords, from routine info
1214 @cindex Source file, access from routine info
1215 Some of the text in the @file{*Help*} routine info buffer will be active
1216 (it is highlighted when the mouse moves over it). Typically, clicking
1217 with the right mouse button invokes online help lookup, and clicking
1218 with the middle mouse button inserts keywords or visits files:
1219
1220 @multitable @columnfractions 0.15 0.85
1221 @item @i{Usage}
1222 @tab If online help is installed, a click with the @emph{right} mouse
1223 button on the @i{Usage:} line will access the help for the
1224 routine (@pxref{Online Help}).
1225 @item @i{Keyword}
1226 @tab Online help about keywords is also available with the
1227 @emph{right} mouse button. Clicking on a keyword with the @emph{middle}
1228 mouse button will insert this keyword in the buffer from where
1229 @code{idlwave-routine-info} was called. Holding down @key{SHIFT} while
1230 clicking also adds the initial @samp{/}.
1231 @item @i{Source}
1232 @tab Clicking with the @emph{middle} mouse button on a @samp{Source} line
1233 finds the source file of the routine and visits it in another window.
1234 Another click on the same line switches back to the buffer from which
1235 @kbd{C-c ?} was called. If you use the @emph{right} mouse button, the
1236 source will not be visited by a buffer, but displayed in the online help
1237 window.
1238 @item @i{Classes}
1239 @tab The @i{Classes} line is only included in the routine info window if
1240 the current class inherits from other classes. You can click with the
1241 @emph{middle} mouse button to display routine info about the current
1242 method in other classes on the inheritance chain, if such a method
1243 exists there.
1244 @end multitable
1245
1246 @defopt idlwave-resize-routine-help-window (@code{t})
1247 Non-@code{nil} means resize the Routine-info @file{*Help*} window to
1248 fit the content.
1249 @end defopt
1250
1251 @defopt idlwave-special-lib-alist
1252 Alist of regular expressions matching special library directories.
1253 @end defopt
1254
1255 @defopt idlwave-rinfo-max-source-lines (@code{5})
1256 Maximum number of source files displayed in the Routine Info window.
1257 @end defopt
1258
1259
1260 @html
1261 <A NAME="ONLINE_HELP"></A>
1262 @end html
1263 @node Online Help, Completion, Routine Info, The IDLWAVE Major Mode
1264 @section Online Help
1265
1266 @cindex Online Help
1267 @cindex @file{idlw-help.txt}
1268 @cindex @file{idlw-help.el}
1269 @cindex Installing online help
1270 @cindex Online Help, Installation
1271 @cindex Speed, of online help
1272 @cindex XML Help Catalog
1273
1274 For IDL system routines, extensive documentation is supplied with IDL.
1275 IDLWAVE can access the HTML version of this documentation very quickly
1276 and accurately, based on the local context. This can be @emph{much}
1277 faster than using the IDL online help application, because IDLWAVE
1278 usually gets you to the right place in the documentation directly ---
1279 e.g. a specific keyword of a routine --- without any additional browsing
1280 and scrolling.
1281
1282 For this online help to work, an HTML version of the IDL documentation
1283 is required. Beginning with IDL 6.2, HTML documentation is distributed
1284 directly with IDL, along with an XML-based catalog of routine
1285 information. By default, IDLWAVE automatically attempts to convert this
1286 XML catalog into a format Emacs can more easily understand, and caches
1287 this information in your @code{idlwave_config_directory}
1288 (@file{~/.idlwave/}, by default). It also re-scans the XML catalog if
1289 it is newer than the current cached version. You can force rescan with
1290 the menu entry @code{IDLWAVE->Routine Info->Rescan XML Help Catalog}.
1291
1292 Before IDL 6.2, the HTML help was not distributed with IDL, and was not
1293 part of the standalone IDLWAVE distribution, but had to be downloaded
1294 separately. This is no longer necessary: all help and routine
1295 information is supplied with IDL versions 6.2 and later.
1296
1297 There are a variety of options for displaying the HTML help: see below.
1298 Help for routines without HTML documentation is also available, by using
1299 the routine documentation header and/or routine source.
1300
1301 @kindex M-?
1302 In any IDL program (or, as with most IDLWAVE commands, in the IDL
1303 Shell), press @kbd{M-?} (@code{idlwave-context-help}), or click with
1304 @kbd{S-Mouse-3} to access context sensitive online help. The following
1305 locations are recognized context for help:
1306
1307 @cindex Context, for online help
1308 @multitable @columnfractions .25 .75
1309 @item @i{Routine names}
1310 @tab The name of a routine (function, procedure, method).
1311 @item @i{Keyword Parameters}
1312 @tab A keyword parameter of a routine.
1313 @item @i{System Variables}
1314 @tab System variables like @code{!DPI}.
1315 @item @i{System Variable Tags}
1316 @tab System variables tags like @code{!D.X_SIZE}.
1317 @item @i{IDL Statements}
1318 @tab Statements like @code{PRO}, @code{REPEAT}, @code{COMPILE_OPT}, etc.
1319 @item @i{IDL Controls}
1320 @tab Control structures like @code{FOR}, @code{SWITCH}, etc.
1321 @item @i{Class names}
1322 @tab A class name in an @code{OBJ_NEW} call.
1323 @item @i{Class Init Keywords}
1324 @tab Beyond the class name in an @code{OBJ_NEW} call.
1325 @item @i{Executive Command}
1326 @tab An executive command like @code{.RUN}. Mostly useful in the shell.
1327 @item @i{Structure Tags}
1328 @tab Structure tags like @code{state.xsize}
1329 @item @i{Class Tags}
1330 @tab Class tags like @code{self.value}.
1331 @item @i{Default}
1332 @tab The routine that would be selected for routine info display.
1333 @end multitable
1334
1335 @cindex @code{OBJ_NEW}, special online help
1336 Note that the @code{OBJ_NEW} function is special in that the help
1337 displayed depends on the cursor position. If the cursor is on the
1338 @samp{OBJ_NEW}, this function is described. If it is on the class
1339 name inside the quotes, the documentation for the class is pulled up.
1340 If the cursor is @emph{after} the class name, anywhere in the argument
1341 list, the documentation for the corresponding @code{Init} method and
1342 its keywords is targeted.
1343
1344 Apart from an IDLWAVE buffer or shell, there are two more places from
1345 which online help can be accessed.
1346
1347 @itemize @bullet
1348 @item
1349 Online help for routines and keywords can be accessed through the
1350 Routine Info display. Click with @kbd{Mouse-3} on an item to see the
1351 corresponding help (@pxref{Routine Info}).
1352 @item
1353 When using completion and Emacs pops up a @file{*Completions*} buffer
1354 with possible completions, clicking with @kbd{Mouse-3} on a completion
1355 item invokes help on that item (@pxref{Completion}). Items for which
1356 help is available in the online system documentation (vs. just the
1357 program source itself) will be emphasized (e.g. colored blue).
1358 @end itemize
1359 @noindent
1360 In both cases, a blue face indicates that the item is documented in
1361 the IDL manual, but an attempt will be made to visit non-blue items
1362 directly in the originating source file.
1363
1364
1365 @menu
1366 * Help with HTML Documentation::
1367 * Help with Source::
1368 @end menu
1369
1370 @node Help with HTML Documentation, Help with Source, Online Help, Online Help
1371 @subsection Help with HTML Documentation
1372 @cindex HTML Help
1373 @cindex Help using HTML manuals
1374 @cindex IDL manual, HTML version
1375 @cindex IDL Assistant
1376
1377 Help using the HTML documentation is invoked with the built-in Emacs
1378 command @code{browse-url}, which displays the relevant help topic in a
1379 browser of your choosing. Beginning with version 6.2, IDL comes with
1380 the help browser @emph{IDL Assistant}, which it uses by default for
1381 displaying online help on all supported platforms. This browser
1382 offers topical searches, an index, and is also now the default and
1383 recommended IDLWAVE help browser. The variable
1384 @code{idlwave-help-use-assistant} controls whether this browser is
1385 used. Note that, due to limitations in the Assistant, invoking help
1386 within IDLWAVE and @code{? topic} within IDL will result in two
1387 running copies of Assistant.
1388
1389 Aside from the IDL Assistant, there are many possible browsers to choose
1390 among, with differing advantages and disadvantages. The variable
1391 @code{idlwave-help-browser-function} controls which browser help is sent
1392 to (as long as @code{idlwave-help-use-assistant} is not set). This
1393 function is used to set the variable @code{browse-url-browser-function}
1394 locally for IDLWAVE help only. Customize the latter variable to see
1395 what choices of browsers your system offers. Certain browsers like
1396 @code{w3} (bundled with many versions of Emacs) and @code{w3m}
1397 (@uref{http://emacs-w3m.namazu.org/}) are run within Emacs, and use
1398 Emacs buffers to display the HTML help. This can be convenient,
1399 especially on small displays, and images can even be displayed in-line
1400 on newer Emacs versions. However, better formatting results are often
1401 achieved with external browsers, like Mozilla. IDLWAVE assumes any
1402 browser function containing "w3" is displayed in a local buffer. If you
1403 are using another Emacs-local browser for which this is not true, set
1404 the variable @code{idlwave-help-browser-is-local}.
1405
1406 With IDL 6.2 or later, it is important to ensure that the variable
1407 @code{idlwave-system-directory} is set (@pxref{Catalogs}). One easy way
1408 to ensure this is to run the IDL Shell (@kbd{C-c C-s}). It will be
1409 queried for this directory, and the results will be cached to file for
1410 subsequent use.
1411
1412 @xref{HTML Help Browser Tips}, for more information on selecting and
1413 configuring a browser for use with IDL's HTML help system.
1414
1415 @defopt idlwave-html-system-help-location @file{help/online_help}
1416 Relative directory of the system-supplied HTML help directory,
1417 considered with respect to @code{idlwave-system-directory}. Relevant
1418 for IDL 6.2 and greater. Should not change.
1419 @end defopt
1420
1421 @defopt idlwave-html-help-location @file{/usr/local/etc/}
1422 The directory where the @file{idl_html_help} HTML directory live.
1423 Obsolete and ignored for IDL 6.2 and greater
1424 (@code{idlwave-html-system-help-location} is used instead).
1425 @end defopt
1426
1427 @defopt idlwave-help-use-assistant @code{t}
1428 If set, use the IDL Assistant if possible for online HTML help,
1429 otherwise use the browser function specified in
1430 @code{idlwave-help-browser-function}.
1431 @end defopt
1432
1433 @defopt idlwave-help-browser-function
1434 The browser function to use to display IDLWAVE HTML help. Should be
1435 one of the functions available for setting
1436 @code{browse-url-browser-function}, which see.
1437 @end defopt
1438
1439 @defopt idlwave-help-browser-is-local
1440 Is the browser selected in @code{idlwave-help-browser-function} run in a
1441 local Emacs buffer or window? Defaults to @code{t} if the function
1442 contains "-w3".
1443 @end defopt
1444
1445 @defopt idlwave-help-link-face
1446 The face for links to IDLWAVE online help.
1447 @end defopt
1448
1449 @node Help with Source, , Help with HTML Documentation, Online Help
1450 @subsection Help with Source
1451 @cindex Help using routine source
1452
1453 @cindex Source code, as online help
1454 @cindex DocLib header, as online help
1455 For routines which are not documented in an HTML manual (for example
1456 personal or library routines), the source code itself is used as help
1457 text. If the requested information can be found in a (more or less)
1458 standard DocLib file header, IDLWAVE shows the header (scrolling down to
1459 a keyword, if appropriate). Otherwise the routine definition statement
1460 (@code{pro}/@code{function}) is shown. The doclib header sections which
1461 are searched for include @samp{NAME} and @samp{KEYWORDS}. Localization
1462 support can be added by customizing the @code{idlwave-help-doclib-name}
1463 and @code{idlwave-help-doclib-keyword} variables.
1464
1465 @cindex Structure tags, in online help
1466 @cindex Class tags, in online help
1467 Help is also available for class structure tags (@code{self.TAG}), and
1468 generic structure tags, if structure tag completion is enabled
1469 (@pxref{Structure Tag Completion}). This is implemented by visiting the
1470 tag within the class or structure definition source itself. Help is not
1471 available on built-in system class tags.
1472
1473 The help window is normally displayed in the same frame, but can be
1474 popped-up in a separate frame. The following commands can be used to
1475 navigate inside the help system for source files:
1476
1477 @multitable @columnfractions .15 .85
1478 @item @kbd{@key{SPACE}}
1479 @tab Scroll forward one page.
1480 @item @kbd{@key{RET}}
1481 @tab Scroll forward one line.
1482 @item @kbd{@key{DEL}}
1483 @tab Scroll back one page.
1484 @item @kbd{h}
1485 @tab Jump to DocLib Header of the routine whose source is displayed
1486 as help.
1487 @item @kbd{H}
1488 @tab Jump to the first DocLib Header in the file.
1489 @item @kbd{.} @r{(Dot)}
1490 @tab Jump back and forth between the routine definition (the
1491 @code{pro}/@code{function} statement) and the description of the help
1492 item in the DocLib header.
1493 @item @kbd{F}
1494 @tab Fontify the buffer like source code. See the variable @code{idlwave-help-fontify-source-code}.
1495 @item @kbd{q}
1496 @tab Kill the help window.
1497 @end multitable
1498
1499
1500 @defopt idlwave-help-use-dedicated-frame (@code{nil})
1501 Non-@code{nil} means use a separate frame for Online Help if possible.
1502 @end defopt
1503
1504 @defopt idlwave-help-frame-parameters
1505 The frame parameters for the special Online Help frame.
1506 @end defopt
1507
1508 @defopt idlwave-max-popup-menu-items (@code{20})
1509 Maximum number of items per pane in pop-up menus.
1510 @end defopt
1511
1512 @defopt idlwave-extra-help-function
1513 Function to call for help if the normal help fails.
1514 @end defopt
1515
1516 @defopt idlwave-help-fontify-source-code (@code{nil})
1517 Non-@code{nil} means fontify source code displayed as help.
1518 @end defopt
1519
1520 @defopt idlwave-help-source-try-header (@code{t})
1521 Non-@code{nil} means try to find help in routine header when
1522 displaying source file.
1523 @end defopt
1524
1525 @defopt idlwave-help-doclib-name (@code{"name"})
1526 The case-insensitive heading word in doclib headers to locate the
1527 @emph{name} section. Can be a regexp, e.g. @code{"\\(name\\|nom\\)"}.
1528 @end defopt
1529
1530 @defopt idlwave-help-doclib-keyword (@code{"KEYWORD"})
1531 The case-insensitive heading word in doclib headers to locate the
1532 @emph{keywords} section. Can be a regexp.
1533 @end defopt
1534
1535
1536 @node Completion, Routine Source, Online Help, The IDLWAVE Major Mode
1537 @section Completion
1538 @cindex Completion
1539 @cindex Keyword completion
1540 @cindex Method completion
1541 @cindex Object method completion
1542 @cindex Class name completion
1543 @cindex Function name completion
1544 @cindex Procedure name completion
1545
1546 @kindex M-@key{TAB}
1547 @kindex C-c C-i
1548 IDLWAVE offers completion for class names, routine names, keywords,
1549 system variables, system variable tags, class structure tags, regular
1550 structure tags and file names. As in many programming modes, completion
1551 is bound to @kbd{M-@key{TAB}} (or simply @kbd{@key{TAB}} in the IDLWAVE
1552 Shell --- @pxref{Using the Shell}). Completion uses exactly the same
1553 internal information as routine info, so when necessary (rarely) it can
1554 be updated with @kbd{C-c C-i} (@code{idlwave-update-routine-info}).
1555
1556 The completion function is context sensitive and figures out what to
1557 complete based on the location of the point. Here are example lines and
1558 what @kbd{M-@key{TAB}} would try to complete when the cursor is on the
1559 position marked with a @samp{_}:
1560
1561 @example
1562 plo_ @r{Procedure}
1563 x = a_ @r{Function}
1564 plot,xra_ @r{Keyword of @code{plot} procedure}
1565 plot,x,y,/x_ @r{Keyword of @code{plot} procedure}
1566 plot,min(_ @r{Keyword of @code{min} function}
1567 obj -> a_ @r{Object method (procedure)}
1568 a[2,3] = obj -> a_ @r{Object method (function)}
1569 x = obj_new('IDL_ @r{Class name}
1570 x = obj_new('MyCl',a_ @r{Keyword to @code{Init} method in class @code{MyCl}}
1571 pro A_ @r{Class name}
1572 pro _ @r{Fill in @code{Class::} of first method in this file}
1573 !v_ @r{System variable}
1574 !version.t_ @r{Structure tag of system variable}
1575 self.g_ @r{Class structure tag in methods}
1576 state.w_ @r{Structure tag, if tag completion enabled}
1577 name = 'a_ @r{File name (default inside quotes)}
1578 @end example
1579
1580 @cindex Completion, ambiguity
1581 @cindex Completion, forcing function name
1582 The only place where completion is ambiguous is procedure/function
1583 @emph{keywords} versus @emph{functions}. After @samp{plot,x,_}, IDLWAVE
1584 will always assume a keyword to @samp{plot}. However, a function is
1585 also a possible completion here. You can force completion of a function
1586 name at such a location by using a prefix arg: @kbd{C-u M-@key{TAB}}.
1587
1588 Giving two prefix arguments (@kbd{C-u C-u M-@key{TAB}}) prompts for a
1589 regular expression to search among the commands to be completed. As
1590 an example, completing a blank line in this way will allow you to
1591 search for a procedure matching a regexp.
1592
1593 @cindex Scrolling the @file{*Completions*} window
1594 @cindex Completion, scrolling
1595 @cindex Completion, Online Help
1596 @cindex Online Help in @file{*Completions*} buffer
1597 If the list of completions is too long to fit in the
1598 @file{*Completions*} window, the window can be scrolled by pressing
1599 @kbd{M-@key{TAB}} repeatedly. Online help (if installed) for each
1600 possible completion is available by clicking with @kbd{Mouse-3} on the
1601 item. Items for which system online help (from the IDL manual) is
1602 available will be emphasized (e.g. colored blue). For other items, the
1603 corresponding source code or DocLib header will be used as the help
1604 text.
1605
1606 @cindex Completion, cancelling
1607 @cindex Cancelling completion
1608 Completion is not a blocking operation --- you are free to continue
1609 editing, enter commands, or simply ignore the @file{*Completions*}
1610 buffer during a completion operation. If, however, the most recent
1611 command was a completion, @kbd{C-g} will remove the buffer and restore
1612 the window configuration. You can also remove the buffer at any time
1613 with no negative consequences.
1614
1615 @defopt idlwave-keyword-completion-adds-equal (@code{t})
1616 Non-@code{nil} means completion automatically adds @samp{=} after
1617 completed keywords.
1618 @end defopt
1619
1620 @defopt idlwave-function-completion-adds-paren (@code{t})
1621 Non-@code{nil} means completion automatically adds @samp{(} after
1622 completed function. A value of `2' means also add the closing
1623 parenthesis and position the cursor between the two.
1624 @end defopt
1625
1626 @defopt idlwave-completion-restore-window-configuration (@code{t})
1627 Non-@code{nil} means restore window configuration after successful
1628 completion.
1629 @end defopt
1630
1631 @defopt idlwave-highlight-help-links-in-completion (@code{t})
1632 Non-@code{nil} means highlight completions for which system help is
1633 available.
1634 @end defopt
1635
1636 @menu
1637 * Case of Completed Words:: CaseOFcomPletedWords
1638 * Object Method Completion and Class Ambiguity:: obj->Method, what?
1639 * Object Method Completion in the Shell::
1640 * Class and Keyword Inheritance:: obj->Method, _EXTRA=e
1641 * Structure Tag Completion:: Completing state.Tag
1642 @end menu
1643
1644 @node Case of Completed Words, Object Method Completion and Class Ambiguity, Completion, Completion
1645 @subsection Case of Completed Words
1646 @cindex Case of completed words
1647 @cindex Mixed case completion
1648 IDL is a case-insensitive language, so casing is a matter of style
1649 only. IDLWAVE helps maintain a consistent casing style for completed
1650 items. The case of the completed words is determined by what is
1651 already in the buffer. As an exception, when the partial word being
1652 completed is all lower case, the completion will be lower case as
1653 well. If at least one character is upper case, the string will be
1654 completed in upper case or mixed case, depending on the value of the
1655 variable @code{idlwave-completion-case}. The default is to use upper
1656 case for procedures, functions and keywords, and mixed case for object
1657 class names and methods, similar to the conventions in the IDL
1658 manuals. For instance, to enable mixed-case completion for routines
1659 in addition to classes and methods, you need an entry such as
1660 @code{(routine . preserve)} in that variable. To enable total control
1661 over the case of completed items, independent of buffer context, set
1662 @code{idlwave-completion-force-default-case} to non-@code{nil}.
1663
1664 @defopt idlwave-completion-case
1665 Association list setting the case (UPPER/lower/Capitalized/MixedCase...)
1666 of completed words.
1667 @end defopt
1668
1669 @defopt idlwave-completion-force-default-case (@code{nil})
1670 Non-@code{nil} means completion will always honor the settings in
1671 @code{idlwave-completion-case}. When nil (the default), entirely lower
1672 case strings will always be completed to lower case, no matter what the
1673 settings in @code{idlwave-completion-case}.
1674 @end defopt
1675
1676 @defopt idlwave-complete-empty-string-as-lower-case (@code{nil})
1677 Non-@code{nil} means the empty string is considered lower case for
1678 completion.
1679 @end defopt
1680
1681 @node Object Method Completion and Class Ambiguity, Object Method Completion in the Shell, Case of Completed Words, Completion
1682 @subsection Object Method Completion and Class Ambiguity
1683 @cindex Object methods
1684 @cindex Class ambiguity
1685 @cindex @code{self} object, default class
1686 An object method is not uniquely determined without the object's class.
1687 Since the class is almost always omitted in the calling source (as
1688 required to obtain the true benefits of object-based programming),
1689 IDLWAVE considers all available methods in all classes as possible
1690 method name completions. The combined list of keywords of the current
1691 method in @emph{all} known classes which contain that method will be
1692 considered for keyword completion. In the @file{*Completions*} buffer,
1693 the matching classes will be shown next to each item (see option
1694 @code{idlwave-completion-show-classes}). As a special case, the class
1695 of an object called @samp{self} is always taken to be the class of the
1696 current routine, when in an IDLWAVE buffer. All inherits classes are
1697 considered as well.
1698
1699 @cindex Forcing class query.
1700 @cindex Class query, forcing
1701 You can also call @code{idlwave-complete} with a prefix arg: @kbd{C-u
1702 M-@key{TAB}}. IDLWAVE will then prompt you for the class in order to
1703 narrow down the number of possible completions. The variable
1704 @code{idlwave-query-class} can be configured to make such prompting the
1705 default for all methods (not recommended), or selectively for very
1706 common methods for which the number of completing keywords would be too
1707 large (e.g. @code{Init,SetProperty,GetProperty}).
1708
1709 @cindex Saving object class on @code{->}
1710 @cindex @code{->}
1711 After you have specified the class for a particular statement (e.g. when
1712 completing the method), IDLWAVE can remember it for the rest of the
1713 editing session. Subsequent completions in the same statement
1714 (e.g. keywords) can then reuse this class information. This works by
1715 placing a text property on the method invocation operator @samp{->},
1716 after which the operator will be shown in a different face (bold by
1717 default). The variable @code{idlwave-store-inquired-class} can be used
1718 to turn it off or on.
1719
1720 @defopt idlwave-completion-show-classes (@code{1})
1721 Non-@code{nil} means show up to that many classes in
1722 @file{*Completions*} buffer when completing object methods and
1723 keywords.
1724 @end defopt
1725
1726 @defopt idlwave-completion-fontify-classes (@code{t})
1727 Non-@code{nil} means fontify the classes in completions buffer.
1728 @end defopt
1729
1730 @defopt idlwave-query-class (@code{nil})
1731 Association list governing query for object classes during completion.
1732 @end defopt
1733
1734 @defopt idlwave-store-inquired-class (@code{t})
1735 Non-@code{nil} means store class of a method call as text property on
1736 @samp{->}.
1737 @end defopt
1738
1739 @defopt idlwave-class-arrow-face
1740 Face to highlight object operator arrows @samp{->} which carry a saved
1741 class text property.
1742 @end defopt
1743
1744 @node Object Method Completion in the Shell, Class and Keyword Inheritance, Object Method Completion and Class Ambiguity, Completion
1745 @subsection Object Method Completion in the Shell
1746 @cindex Method Completion in Shell
1747 In the IDLWAVE Shell (@pxref{The IDLWAVE Shell}), objects on which
1748 methods are being invoked have a special property: they must exist as
1749 variables, and so their class can be determined (for instance, using the
1750 @code{obj_class()} function). In the Shell, when attempting completion,
1751 routine info, or online help within a method routine, a query is sent to
1752 determine the class of the object. If this query is successful, the
1753 class found will be used to select appropriate completions, routine
1754 info, or help. If unsuccessful, information from all known classes will
1755 be used (as in the buffer).
1756
1757 @node Class and Keyword Inheritance, Structure Tag Completion, Object Method Completion in the Shell, Completion
1758 @subsection Class and Keyword Inheritance
1759 @cindex Inheritance, class
1760 @cindex Keyword inheritance
1761 @cindex Inheritance, keyword
1762
1763 Class inheritance affects which methods are called in IDL. An object of
1764 a class which inherits methods from one or more superclasses can
1765 override that method by defining its own method of the same name, extend
1766 the method by calling the method(s) of its superclass(es) in its
1767 version, or inherit the method directly by making no modifications.
1768 IDLWAVE examines class definitions during completion and routine
1769 information display, and records all inheritance information it finds.
1770 This information is displayed if appropriate with the calling sequence
1771 for methods (@pxref{Routine Info}), as long as variable
1772 @code{idlwave-support-inheritance} is non-@code{nil}.
1773
1774 In many class methods, @emph{keyword} inheritance (@code{_EXTRA} and
1775 @code{_REF_EXTRA}) is used hand-in-hand with class inheritance and
1776 method overriding. E.g., in a @code{SetProperty} method, this technique
1777 allows a single call @code{obj->SetProperty} to set properties up the
1778 entire class inheritance chain. This is often referred to as
1779 @emph{chaining}, and is characterized by chained method calls like
1780 @w{@code{self->MySuperClass::SetProperty,_EXTRA=e}}.
1781
1782 IDLWAVE can accomodate this special synergy between class and keyword
1783 inheritance: if @code{_EXTRA} or @code{_REF_EXTRA} is detected among a
1784 method's keyword parameters, all keywords of superclass versions of
1785 the method being considered can be included in completion. There is
1786 of course no guarantee that this type of keyword chaining actually
1787 occurrs, but for some methods it's a very convenient assumption. The
1788 variable @code{idlwave-keyword-class-inheritance} can be used to
1789 configure which methods have keyword inheritance treated in this
1790 simple, class-driven way. By default, only @code{Init} and
1791 @code{(Get|Set)Property} are. The completion buffer will label
1792 keywords based on their originating class.
1793
1794 @defopt idlwave-support-inheritance (@code{t})
1795 Non-@code{nil} means consider inheritance during completion, online help etc.
1796 @end defopt
1797
1798 @defopt idlwave-keyword-class-inheritance
1799 A list of regular expressions to match methods for which simple
1800 class-driven keyword inheritance will be used for Completion.
1801 @end defopt
1802
1803 @node Structure Tag Completion, , Class and Keyword Inheritance, Completion
1804 @subsection Structure Tag Completion
1805 @cindex Completion, structure tag
1806 @cindex Structure tag completion
1807
1808 In many programs, especially those involving widgets, large structures
1809 (e.g. the @samp{state} structure) are used to communicate among
1810 routines. It is very convenient to be able to complete structure tags,
1811 in the same way as for instance variables (tags) of the @samp{self}
1812 object (@pxref{Object Method Completion and Class Ambiguity}). Add-in
1813 code for structure tag completion is available in the form of a loadable
1814 completion module: @file{idlw-complete-structtag.el}. Tag completion in
1815 structures is highly ambiguous (much more so than @samp{self}
1816 completion), so @code{idlw-complete-structtag} makes an unusual and very
1817 specific assumption: the exact same variable name is used to refer to
1818 the structure in all parts of the program. This is entirely unenforced
1819 by the IDL language, but is a typical convention. If you consistently
1820 refer to the same structure with the same variable name
1821 (e.g. @samp{state}), structure tags which are read from its definition
1822 in the same file can be used for completion.
1823
1824 Structure tag completion is not enabled by default. To enable it,
1825 simply add the following to your @file{.emacs}:
1826
1827 @lisp
1828 (add-hook 'idlwave-load-hook
1829 (lambda () (require 'idlw-complete-structtag)))
1830 @end lisp
1831
1832 Once enabled, you'll also be able to access online help on the structure
1833 tags, using the usual methods (@pxref{Online Help}). In addition,
1834 structure variables in the shell will be queried for tag names, similar
1835 to the way object variables in the shell are queried for method names.
1836 So, e.g.:
1837
1838 @example
1839 IDL> st.[Tab]
1840 @end example
1841
1842 @noindent will complete with all structure fields of the structure
1843 @code{st}.
1844
1845 @node Routine Source, Resolving Routines, Completion, The IDLWAVE Major Mode
1846 @section Routine Source
1847 @cindex Routine source file
1848 @cindex Module source file
1849 @cindex Source file, of a routine
1850 @kindex C-c C-v
1851 In addition to clicking on a @i{Source:} line in the routine info
1852 window, there is another way to quickly visit the source file of a
1853 routine. The command @kbd{C-c C-v} (@code{idlwave-find-module}) asks
1854 for a module name, offering the same default as
1855 @code{idlwave-routine-info} would have used, taken from nearby buffer
1856 contents. In the minibuffer, specify a complete routine name (including
1857 any class part). IDLWAVE will display the source file in another
1858 window, positioned at the routine in question. You can also limit this
1859 to a routine in the current buffer only, with completion, and a
1860 context-sensitive default, by using a single prefix (@kbd{C-u C-c C-v})
1861 or the convenience binding @kbd{C-c C-t}.
1862
1863 @cindex Buffers, killing
1864 @cindex Killing autoloaded buffers
1865 Since getting the source of a routine into a buffer is so easy with
1866 IDLWAVE, too many buffers visiting different IDL source files are
1867 sometimes created. The special command @kbd{C-c C-k}
1868 (@code{idlwave-kill-autoloaded-buffers}) can be used to easily remove
1869 these buffers.
1870
1871 @node Resolving Routines, Code Templates, Routine Source, The IDLWAVE Major Mode
1872 @section Resolving Routines
1873 @cindex @code{RESOLVE_ROUTINE}
1874 @cindex Compiling library modules
1875 @cindex Routines, resolving
1876
1877 The key sequence @kbd{C-c =} calls the command @code{idlwave-resolve}
1878 and sends the line @samp{RESOLVE_ROUTINE, '@var{routine_name}'} to IDL
1879 in order to resolve (compile) it. The default routine to be resolved is
1880 taken from context, but you get a chance to edit it. Usually this is
1881 not necessary, since IDL automatically discovers routines on its path.
1882
1883 @code{idlwave-resolve} is one way to get a library module within reach
1884 of IDLWAVE's routine info collecting functions. A better way is to
1885 keep routine information available in catalogs (@pxref{Catalogs}).
1886 Routine info on modules will then be available without the need to
1887 compile the modules first, and even without a running shell.
1888
1889 @xref{Sources of Routine Info}, for more information on the ways IDLWAVE
1890 collects data about routines, and how to update this information.
1891
1892 @node Code Templates, Abbreviations, Resolving Routines, The IDLWAVE Major Mode
1893 @section Code Templates
1894 @cindex Code templates
1895 @cindex Templates
1896
1897 IDLWAVE can insert IDL code templates into the buffer. For a few
1898 templates, this is done with direct key bindings:
1899
1900 @multitable @columnfractions .15 .85
1901 @item @kbd{C-c C-c}
1902 @tab @code{CASE} statement template
1903 @item @kbd{C-c C-f}
1904 @tab @code{FOR} loop template
1905 @item @kbd{C-c C-r}
1906 @tab @code{REPEAT} loop template
1907 @item @kbd{C-c C-w}
1908 @tab @code{WHILE} loop template
1909 @end multitable
1910
1911 All code templates are also available as abbreviations
1912 (@pxref{Abbreviations}).
1913
1914 @node Abbreviations, Actions, Code Templates, The IDLWAVE Major Mode
1915 @section Abbreviations
1916 @cindex Abbreviations
1917
1918 Special abbreviations exist to enable rapid entry of commonly used
1919 commands. Emacs abbreviations are expanded by typing text into the
1920 buffer and pressing @key{SPC} or @key{RET}. The special abbreviations
1921 used to insert code templates all start with a @samp{\} (the backslash),
1922 or, optionally, any other character set in
1923 @code{idlwave-abbrev-start-char}. IDLWAVE ensures that abbreviations are
1924 only expanded where they should be (i.e., not in a string or comment),
1925 and permits the point to be moved after an abbreviation expansion ---
1926 very useful for positioning the mark inside of parentheses, etc.
1927
1928 Special abbreviations are pre-defined for code templates and other
1929 useful items. To visit the full list of abbreviations, use @kbd{M-x
1930 idlwave-list-abbrevs}.
1931
1932 Template abbreviations:
1933
1934 @multitable @columnfractions .15 .85
1935 @item @code{\pr}
1936 @tab @code{PROCEDURE} template
1937 @item @code{\fu}
1938 @tab @code{FUNCTION} template
1939 @item @code{\c}
1940 @tab @code{CASE} statement template
1941 @item @code{\f}
1942 @tab @code{FOR} loop template
1943 @item @code{\r}
1944 @tab @code{REPEAT} loop template
1945 @item @code{\w}
1946 @tab @code{WHILE} loop template
1947 @item @code{\i}
1948 @tab @code{IF} statement template
1949 @item @code{\elif}
1950 @tab @code{IF-ELSE} statement template
1951 @end multitable
1952
1953 String abbreviations:
1954
1955 @multitable @columnfractions .15 .85
1956 @item @code{\ap}
1957 @tab @code{arg_present()}
1958 @item @code{\b}
1959 @tab @code{begin}
1960 @item @code{\cb}
1961 @tab @code{byte()}
1962 @item @code{\cc}
1963 @tab @code{complex()}
1964 @item @code{\cd}
1965 @tab @code{double()}
1966 @item @code{\cf}
1967 @tab @code{float()}
1968 @item @code{\cl}
1969 @tab @code{long()}
1970 @item @code{\co}
1971 @tab @code{common}
1972 @item @code{\cs}
1973 @tab @code{string()}
1974 @item @code{\cx}
1975 @tab @code{fix()}
1976 @item @code{\e}
1977 @tab @code{else}
1978 @item @code{\ec}
1979 @tab @code{endcase}
1980 @item @code{\ee}
1981 @tab @code{endelse}
1982 @item @code{\ef}
1983 @tab @code{endfor}
1984 @item @code{\ei}
1985 @tab @code{endif else if}
1986 @item @code{\el}
1987 @tab @code{endif else}
1988 @item @code{\en}
1989 @tab @code{endif}
1990 @item @code{\er}
1991 @tab @code{endrep}
1992 @item @code{\es}
1993 @tab @code{endswitch}
1994 @item @code{\ew}
1995 @tab @code{endwhile}
1996 @item @code{\g}
1997 @tab @code{goto,}
1998 @item @code{\h}
1999 @tab @code{help,}
2000 @item @code{\ik}
2001 @tab @code{if keyword_set() then}
2002 @item @code{\iap}
2003 @tab @code{if arg_present() then}
2004 @item @code{\ine}
2005 @tab @code{if n_elements() eq 0 then}
2006 @item @code{\inn}
2007 @tab @code{if n_elements() ne 0 then}
2008 @item @code{\k}
2009 @tab @code{keyword_set()}
2010 @item @code{\n}
2011 @tab @code{n_elements()}
2012 @item @code{\np}
2013 @tab @code{n_params()}
2014 @item @code{\oi}
2015 @tab @code{on_ioerror,}
2016 @item @code{\or}
2017 @tab @code{openr,}
2018 @item @code{\ou}
2019 @tab @code{openu,}
2020 @item @code{\ow}
2021 @tab @code{openw,}
2022 @item @code{\p}
2023 @tab @code{print,}
2024 @item @code{\pt}
2025 @tab @code{plot,}
2026 @item @code{\pv}
2027 @tab @code{ptr_valid()}
2028 @item @code{\re}
2029 @tab @code{read,}
2030 @item @code{\rf}
2031 @tab @code{readf,}
2032 @item @code{\rt}
2033 @tab @code{return}
2034 @item @code{\ru}
2035 @tab @code{readu,}
2036 @item @code{\s}
2037 @tab @code{size()}
2038 @item @code{\sc}
2039 @tab @code{strcompress()}
2040 @item @code{\sl}
2041 @tab @code{strlowcase()}
2042 @item @code{\sm}
2043 @tab @code{strmid()}
2044 @item @code{\sn}
2045 @tab @code{strlen()}
2046 @item @code{\sp}
2047 @tab @code{strpos()}
2048 @item @code{\sr}
2049 @tab @code{strtrim()}
2050 @item @code{\st}
2051 @tab @code{strput()}
2052 @item @code{\su}
2053 @tab @code{strupcase()}
2054 @item @code{\t}
2055 @tab @code{then}
2056 @item @code{\u}
2057 @tab @code{until}
2058 @item @code{\wc}
2059 @tab @code{widget_control,}
2060 @item @code{\wi}
2061 @tab @code{widget_info()}
2062 @item @code{\wu}
2063 @tab @code{writeu,}
2064 @end multitable
2065
2066 @noindent You can easily add your own abbreviations or override existing
2067 abbrevs with @code{define-abbrev} in your mode hook, using the
2068 convenience function @code{idlwave-define-abbrev}:
2069
2070 @lisp
2071 (add-hook 'idlwave-mode-hook
2072 (lambda ()
2073 (idlwave-define-abbrev "wb" "widget_base()"
2074 (idlwave-keyword-abbrev 1))
2075 (idlwave-define-abbrev "ine" "IF N_Elements() EQ 0 THEN"
2076 (idlwave-keyword-abbrev 11))))
2077 @end lisp
2078
2079 Notice how the abbreviation (here @emph{wb}) and its expansion
2080 (@emph{widget_base()}) are given as arguments, and the single argument to
2081 @code{idlwave-keyword-abbrev} (here @emph{1}) specifies how far back to
2082 move the point upon expansion (in this example, to put it between the
2083 parentheses).
2084
2085 The abbreviations are expanded in upper or lower case, depending upon
2086 the variables @code{idlwave-abbrev-change-case} and, for reserved word
2087 templates, @code{idlwave-reserved-word-upcase} (@pxref{Case Changes}).
2088
2089 @defopt idlwave-abbrev-start-char (@code{"\"})
2090 A single character string used to start abbreviations in abbrev mode.
2091 Beware of common characters which might naturally occur in sequence with
2092 abbreviation strings.
2093 @end defopt
2094
2095 @defopt idlwave-abbrev-move (@code{t})
2096 Non-@code{nil} means the abbrev hook can move point, e.g. to end up
2097 between the parentheses of a function call.
2098 @end defopt
2099
2100 @node Actions, Doc Header, Abbreviations, The IDLWAVE Major Mode
2101 @section Actions
2102 @cindex Actions
2103 @cindex Coding standards, enforcing
2104
2105 @emph{Actions} are special formatting commands which are executed
2106 automatically while you write code in order to check the structure of
2107 the program or to enforce coding standards. Most actions which have
2108 been implemented in IDLWAVE are turned off by default, assuming that the
2109 average user wants her code the way she writes it. But if you are a
2110 lazy typist and want your code to adhere to certain standards, actions
2111 can be helpful.
2112
2113 Actions can be applied in three ways:
2114
2115 @itemize @bullet
2116 @item
2117 Some actions are applied directly while typing. For example, pressing
2118 @samp{=} can run a check to make sure that this operator is surrounded
2119 by spaces and insert these spaces if necessary. Pressing @key{SPC}
2120 after a reserved word can call a command to change the word to upper
2121 case.
2122 @item
2123 When a line is re-indented with @key{TAB}, actions can be applied to the
2124 entire line. To enable this, the variable @code{idlwave-do-actions}
2125 must be non-@code{nil}.
2126 @item
2127 @cindex Foreign code, adapting
2128 @cindex Actions, applied to foreign code
2129 Actions can also be applied to a larger piece of code, e.g. to convert
2130 foreign code to your own style. To do this, mark the relevant part of
2131 the code and execute @kbd{M-x expand-region-abbrevs}. Useful marking
2132 commands are @kbd{C-x h} (the entire file) or @kbd{C-M-h} (the current
2133 subprogram). @xref{Code Indentation}, for information how to adjust the
2134 indentation of the code.
2135 @end itemize
2136
2137 @defopt idlwave-do-actions (@code{nil})
2138 Non-@code{nil} means performs actions when indenting. Individual action
2139 settings are described below and set separately.
2140 @end defopt
2141
2142 @menu
2143 * Block Boundary Check:: Is the END statement correct?
2144 * Padding Operators:: Enforcing space around `=' etc
2145 * Case Changes:: Enforcing upper case keywords
2146 @end menu
2147
2148 @node Block Boundary Check, Padding Operators, Actions, Actions
2149 @subsection Block Boundary Check
2150 @cindex Block boundary check
2151 @cindex @code{END} type checking
2152 @cindex @code{END}, automatic insertion
2153 @cindex @code{END}, expanding
2154 @cindex Block, closing
2155 @cindex Closing a block
2156
2157 Whenever you type an @code{END} statement, IDLWAVE finds the
2158 corresponding start of the block and the cursor blinks back to that
2159 location for a second. If you have typed a specific @code{END}, like
2160 @code{ENDIF} or @code{ENDCASE}, you get a warning if that terminator
2161 does not match the type of block it terminates.
2162
2163 Set the variable @code{idlwave-expand-generic-end} in order to have all
2164 generic @code{END} statements automatically expanded to the appropriate
2165 type. You can also type @kbd{C-c ]} to close the current block by
2166 inserting the appropriate @code{END} statement.
2167
2168 @defopt idlwave-show-block (@code{t})
2169 Non-@code{nil} means point blinks to block beginning for
2170 @code{idlwave-show-begin}.
2171 @end defopt
2172
2173 @defopt idlwave-expand-generic-end (@code{t})
2174 Non-@code{nil} means expand generic END to ENDIF/ENDELSE/ENDWHILE etc.
2175 @end defopt
2176
2177 @defopt idlwave-reindent-end (@code{t})
2178 Non-@code{nil} means re-indent line after END was typed.
2179 @end defopt
2180
2181 @node Padding Operators, Case Changes, Block Boundary Check, Actions
2182 @subsection Padding Operators
2183 @cindex Padding operators with spaces
2184 @cindex Operators, padding with spaces
2185 @cindex Space, around operators
2186
2187 Some operators can be automatically surrounded by spaces. This can
2188 happen when the operator is typed, or later when the line is indented.
2189 IDLWAVE can pad the operators @samp{<}, @samp{>}, @samp{,}, @samp{=},
2190 and @samp{->}, as well as the modified assignment operators
2191 (@samp{AND=}, @samp{OR=}, etc.). This feature is turned off by default.
2192 If you want to turn it on, customize the variables
2193 @code{idlwave-surround-by-blank} and @code{idlwave-do-actions} and turn
2194 both on. You can also define similar actions for other operators by
2195 using the function @code{idlwave-action-and-binding} in the mode hook.
2196 For example, to enforce space padding of the @samp{+} and @samp{*}
2197 operators (outside of strings and comments, of course), try this in
2198 @file{.emacs}
2199
2200 @lisp
2201 (add-hook 'idlwave-mode-hook
2202 (lambda ()
2203 (setq idlwave-surround-by-blank t) ; Turn this type of actions on
2204 (idlwave-action-and-binding "*" '(idlwave-surround 1 1))
2205 (idlwave-action-and-binding "+" '(idlwave-surround 1 1))))
2206 @end lisp
2207
2208 Note that the modified assignment operators which begin with a word
2209 (@samp{AND=}, @samp{OR=}, @samp{NOT=}, etc.) require a leading space to
2210 be recognized (e.g @code{vAND=4} would be intepreted as a variable
2211 @code{vAND}). Also note that, since e.g., @code{>} and @code{>=} are
2212 both valid operators, it is impossible to surround both by blanks while
2213 they are being typed. Similarly with @code{&} and @code{&&}. For
2214 these, a compromise is made: the padding is placed on the left, and if
2215 the longer operator is keyed in, on the right as well (otherwise you
2216 must insert spaces to pad right yourself, or press simply press Tab to
2217 repad everything if @code{idlwave-do-actions} is on).
2218
2219 @defopt idlwave-surround-by-blank (@code{nil})
2220 Non-@code{nil} means enable @code{idlwave-surround}. If non-@code{nil},
2221 @samp{=}, @samp{<}, @samp{>}, @samp{&}, @samp{,}, @samp{->}, and the
2222 modified assignment operators (@samp{AND=}, @samp{OR=}, etc.) are
2223 surrounded with spaces by @code{idlwave-surround}.
2224 @end defopt
2225
2226 @defopt idlwave-pad-keyword (@code{t})
2227 Non-@code{nil} means space-pad the @samp{=} in keyword assignments.
2228 @end defopt
2229
2230 @node Case Changes, , Padding Operators, Actions
2231 @subsection Case Changes
2232 @cindex Case changes
2233 @cindex Upcase, enforcing for reserved words
2234 @cindex Downcase, enforcing for reserved words
2235
2236 Actions can be used to change the case of reserved words or expanded
2237 abbreviations by customizing the variables
2238 @code{idlwave-abbrev-change-case} and
2239 @code{idlwave-reserved-word-upcase}. If you want to change the case of
2240 additional words automatically, put something like the following into
2241 your @file{.emacs} file:
2242
2243 @lisp
2244 (add-hook 'idlwave-mode-hook
2245 (lambda ()
2246 ;; Capitalize system vars
2247 (idlwave-action-and-binding idlwave-sysvar '(capitalize-word 1) t)
2248 ;; Capitalize procedure name
2249 (idlwave-action-and-binding "\\<\\(pro\\|function\\)\\>[ \t]*\\<"
2250 '(capitalize-word 1) t)
2251 ;; Capitalize common block name
2252 (idlwave-action-and-binding "\\<common\\>[ \t]+\\<"
2253 '(capitalize-word 1) t)))
2254 @end lisp
2255
2256 For more information, see the documentation string for the function
2257 @code{idlwave-action-and-binding}. For information on controlling the
2258 case of routines, keywords, classes, and methods as they are completed, see
2259 @ref{Completion}.
2260
2261 @defopt idlwave-abbrev-change-case (@code{nil})
2262 Non-@code{nil} means all abbrevs will be forced to either upper or lower
2263 case. Valid values are @code{nil}, @code{t}, and @code{down}.
2264 @end defopt
2265
2266 @defopt idlwave-reserved-word-upcase (@code{nil})
2267 Non-@code{nil} means reserved words will be made upper case via abbrev
2268 expansion.
2269 @end defopt
2270
2271
2272 @node Doc Header, Motion Commands, Actions, The IDLWAVE Major Mode
2273 @section Documentation Header
2274 @cindex Documentation header
2275 @cindex DocLib header
2276 @cindex Modification timestamp
2277 @cindex Header, for file documentation
2278 @cindex Timestamp, in doc header.
2279 @cindex Changelog, in doc header.
2280
2281 @kindex C-c C-h
2282 @kindex C-c C-m
2283 The command @kbd{C-c C-h} inserts a standard routine header into the
2284 buffer, with the usual fields for documentation (a different header can
2285 be specified with @code{idlwave-file-header}). One of the keywords is
2286 @samp{MODIFICATION HISTORY} under which the changes to a routine can be
2287 recorded. The command @kbd{C-c C-m} jumps to the @samp{MODIFICATION
2288 HISTORY} of the current routine or file and inserts the user name with a
2289 timestamp.
2290
2291 @defopt idlwave-file-header
2292 The doc-header template or a path to a file containing it.
2293 @end defopt
2294
2295 @defopt idlwave-header-to-beginning-of-file (@code{nil})
2296 Non-@code{nil} means the documentation header will always be at start
2297 of file.
2298 @end defopt
2299
2300 @defopt idlwave-timestamp-hook
2301 The hook function used to update the timestamp of a function.
2302 @end defopt
2303
2304 @defopt idlwave-doc-modifications-keyword
2305 The modifications keyword to use with the log documentation commands.
2306 @end defopt
2307
2308 @defopt idlwave-doclib-start
2309 Regexp matching the start of a document library header.
2310 @end defopt
2311
2312 @defopt idlwave-doclib-end
2313 Regexp matching the start of a document library header.
2314 @end defopt
2315
2316 @node Motion Commands, Misc Options, Doc Header, The IDLWAVE Major Mode
2317 @section Motion Commands
2318 @cindex Motion commands
2319 @cindex Program structure, moving through
2320 @cindex Code structure, moving through
2321 @cindex @file{Func-menu}, XEmacs package
2322 @cindex @file{Imenu}, Emacs package
2323 @cindex Function definitions, jumping to
2324 @cindex Procedure definitions, jumping to
2325
2326 IDLWAVE supports both @file{Imenu} and @file{Func-menu}, two packages
2327 which make it easy to jump to the definitions of functions and
2328 procedures in the current file with a pop-up selection. To bind
2329 @file{Imenu} to a mouse-press, use in your @file{.emacs}:
2330
2331 @lisp
2332 (define-key global-map [S-down-mouse-3] 'imenu)
2333 @end lisp
2334
2335 @cindex @file{Speedbar}, Emacs package
2336
2337 In addition, @file{Speedbar} support allows convenient navigation of a
2338 source tree of IDL routine files, quickly stepping to routine
2339 definitions. See @code{Tools->Display Speedbar}.
2340
2341 Several commands allow you to move quickly through the structure of an
2342 IDL program:
2343
2344 @multitable @columnfractions .15 .85
2345 @item @kbd{C-M-a}
2346 @tab Beginning of subprogram
2347 @item @kbd{C-M-e}
2348 @tab End of subprogram
2349 @item @kbd{C-c @{}
2350 @tab Beginning of block (stay inside the block)
2351 @item @kbd{C-c @}}
2352 @tab End of block (stay inside the block)
2353 @item @kbd{C-M-n}
2354 @tab Forward block (on same level)
2355 @item @kbd{C-M-p}
2356 @tab Backward block (on same level)
2357 @item @kbd{C-M-d}
2358 @tab Down block (enters a block)
2359 @item @kbd{C-M-u}
2360 @tab Backward up block (leaves a block)
2361 @item @kbd{C-c C-n}
2362 @tab Next Statement
2363 @end multitable
2364
2365
2366 @node Misc Options, , Motion Commands, The IDLWAVE Major Mode
2367 @section Miscellaneous Options
2368 @cindex Hooks
2369
2370 @defopt idlwave-help-application
2371 The external application providing reference help for programming.
2372 @end defopt
2373
2374 @defopt idlwave-startup-message (@code{t})
2375 Non-@code{nil} means display a startup message when @code{idlwave-mode}'
2376 is first called.
2377 @end defopt
2378
2379 @defopt idlwave-mode-hook
2380 Normal hook. Executed when a buffer is put into @code{idlwave-mode}.
2381 @end defopt
2382
2383 @defopt idlwave-load-hook
2384 Normal hook. Executed when @file{idlwave.el} is loaded.
2385 @end defopt
2386
2387 @node The IDLWAVE Shell, Acknowledgements, The IDLWAVE Major Mode, Top
2388 @chapter The IDLWAVE Shell
2389 @cindex IDLWAVE shell
2390 @cindex Major mode, @code{idlwave-shell-mode}
2391 @cindex IDL, as Emacs subprocess
2392 @cindex Subprocess of Emacs, IDL
2393 @cindex Comint, Emacs package
2394 @cindex Windows
2395 @cindex MacOS
2396
2397 The IDLWAVE shell is an Emacs major mode which permits running the IDL
2398 program as an inferior process of Emacs, and works closely with the
2399 IDLWAVE major mode in buffers. It can be used to work with IDL
2400 interactively, to compile and run IDL programs in Emacs buffers and to
2401 debug these programs. The IDLWAVE shell is built on @file{comint}, an
2402 Emacs packages which handles the communication with the IDL program.
2403 Unfortunately, IDL for Windows does not have command-prompt versions and
2404 thus do not allow the interaction with Emacs --- so the IDLWAVE shell
2405 currently only works under Unix and MacOSX.
2406
2407 @menu
2408 * Starting the Shell:: How to launch IDL as a subprocess
2409 * Using the Shell:: Interactively working with the Shell
2410 * Commands Sent to the Shell::
2411 * Debugging IDL Programs::
2412 * Examining Variables::
2413 * Custom Expression Examination::
2414 @end menu
2415
2416 @node Starting the Shell, Using the Shell, The IDLWAVE Shell, The IDLWAVE Shell
2417 @section Starting the Shell
2418 @cindex Starting the shell
2419 @cindex Shell, starting
2420 @cindex Dedicated frame, for shell buffer
2421 @cindex Frame, for shell buffer
2422 @cindex Subprocess of Emacs, IDL
2423
2424 @kindex C-c C-s
2425 The IDLWAVE shell can be started with the command @kbd{M-x
2426 idlwave-shell}. In @code{idlwave-mode} the function is bound to
2427 @kbd{C-c C-s}. It creates a buffer @file{*idl*} which is used to
2428 interact with the shell. If the shell is already running, @kbd{C-c
2429 C-s} will simply switch to the shell buffer. The command @kbd{C-c
2430 C-l} (@code{idlwave-shell-recenter-shell-window}) displays the shell
2431 window without selecting it. The shell can also be started
2432 automatically when another command tries to send a command to it. To
2433 enable auto start, set the variable
2434 @code{idlwave-shell-automatic-start} to @code{t}.
2435
2436 In order to create a separate frame for the IDLWAVE shell buffer, call
2437 @code{idlwave-shell} with a prefix argument: @kbd{C-u C-c C-s} or
2438 @kbd{C-u C-c C-l}. If you always want a dedicated frame for the shell
2439 window, configure the variable
2440 @code{idlwave-shell-use-dedicated-frame}.
2441
2442 To launch a quick IDLWAVE shell directly from a shell prompt without
2443 an IDLWAVE buffer (e.g., as a replacement for running inside an
2444 xterm), define a system alias with the following content:
2445
2446 @example
2447 emacs -geometry 80x32 -eval "(idlwave-shell 'quick)"
2448 @end example
2449
2450 Replace the @samp{-geometry 80x32} option with @samp{-nw} if you prefer
2451 the Emacs process to run directly inside the terminal window.
2452
2453 @cindex ENVI
2454 @cindex IDL> Prompt
2455
2456 To use IDLWAVE with ENVI or other custom packages which change the
2457 @samp{IDL> } prompt, you must change the
2458 @code{idlwave-shell-prompt-pattern}, which defaults to @samp{"^ ?IDL>
2459 "}. Normally, you can just replace the @samp{IDL} in this expression
2460 with the prompt you see. A suitable pattern which matches the prompt
2461 for both ENVI and IDL simultaneously is @samp{"^ ?\\(ENVI\\|IDL\\)> "}.
2462
2463 @defopt idlwave-shell-explicit-file-name (@file{idl})
2464 This is the command to run IDL.
2465 @end defopt
2466
2467 @defopt idlwave-shell-command-line-options
2468 A list of command line options for calling the IDL program.
2469 @end defopt
2470
2471 @defopt idlwave-shell-prompt-pattern
2472 Regexp to match IDL prompt at beginning of a line.
2473 @end defopt
2474
2475 @defopt idlwave-shell-process-name
2476 Name to be associated with the IDL process.
2477 @end defopt
2478
2479 @defopt idlwave-shell-automatic-start (@code{nil})
2480 Non-@code{nil} means attempt to invoke idlwave-shell if not already
2481 running.
2482 @end defopt
2483
2484 @defopt idlwave-shell-initial-commands
2485 Initial commands, separated by newlines, to send to IDL.
2486 @end defopt
2487
2488 @defopt idlwave-shell-save-command-history (@code{t})
2489 Non-@code{nil} means preserve command history between sessions.
2490 @end defopt
2491
2492 @defopt idlwave-shell-command-history-file (@file{~/.idlwave/.idlwhist})
2493 The file in which the command history of the idlwave shell is saved.
2494 Unless it's an absolute path, it goes in
2495 @code{idlwave-config-directory}.
2496 @end defopt
2497
2498 @defopt idlwave-shell-use-dedicated-frame (@code{nil})
2499 Non-@code{nil} means IDLWAVE should use a special frame to display the
2500 shell buffer.
2501 @end defopt
2502
2503 @defopt idlwave-shell-use-dedicated-window (@code{nil})
2504 Non-@code{nil} means use a dedicated window for the shell, taking care
2505 not it replace it with other buffers.
2506 @end defopt
2507
2508 @defopt idlwave-shell-frame-parameters
2509 The frame parameters for a dedicated idlwave-shell frame.
2510 @end defopt
2511
2512 @defopt idlwave-shell-raise-frame (@code{t})
2513 Non-@code{nil} means `idlwave-shell' raises the frame showing the shell
2514 window.
2515 @end defopt
2516
2517 @defopt idlwave-shell-temp-pro-prefix
2518 The prefix for temporary IDL files used when compiling regions.
2519 @end defopt
2520
2521 @cindex Hooks
2522 @defopt idlwave-shell-mode-hook
2523 Hook for customizing @code{idlwave-shell-mode}.
2524 @end defopt
2525
2526 @node Using the Shell, Commands Sent to the Shell, Starting the Shell, The IDLWAVE Shell
2527 @section Using the Shell
2528 @cindex Comint
2529 @cindex Shell, basic commands
2530
2531 The IDLWAVE shell works in the same fashion as other shell modes in
2532 Emacs. It provides command history, command line editing and job
2533 control. The @key{UP} and @key{DOWN} arrows cycle through the input
2534 history just like in an X terminal@footnote{This is different from
2535 normal Emacs/Comint behavior, but more like an xterm. If you prefer the
2536 default comint functionality, check the variable
2537 @code{idlwave-shell-arrows-do-history}.}. The history is preserved
2538 between emacs and IDL sessions. Here is a list of commonly used
2539 commands:
2540
2541 @multitable @columnfractions .12 .88
2542 @item @key{UP}, @key{M-p}
2543 @tab Cycle backwards in input history
2544 @item @key{DOWN}, @key{M-n}
2545 @tab Cycle forwards in input history
2546 @item @kbd{M-r}
2547 @tab Previous input matching a regexp
2548 @item @kbd{M-s}
2549 @tab Next input matching a regexp
2550 @item @kbd{return}
2551 @tab Send input or copy line to current prompt
2552 @item @kbd{C-c C-a}
2553 @tab Beginning of line; skip prompt
2554 @item @kbd{C-c C-u}
2555 @tab Kill input to beginning of line
2556 @item @kbd{C-c C-w}
2557 @tab Kill word before cursor
2558 @item @kbd{C-c C-c}
2559 @tab Send ^C
2560 @item @kbd{C-c C-z}
2561 @tab Send ^Z
2562 @item @kbd{C-c C-\}
2563 @tab Send ^\
2564 @item @kbd{C-c C-o}
2565 @tab Delete last batch of process output
2566 @item @kbd{C-c C-r}
2567 @tab Show last batch of process output
2568 @item @kbd{C-c C-l}
2569 @tab List input history
2570 @end multitable
2571
2572 In addition to these standard @file{comint} commands,
2573 @code{idlwave-shell-mode} provides many of the same commands which
2574 simplify writing IDL code available in IDLWAVE buffers. This includes
2575 abbreviations, online help, and completion. See @ref{Routine Info} and
2576 @ref{Online Help} and @ref{Completion} for more information on these
2577 commands.
2578
2579 @cindex Completion, in the shell
2580 @cindex Routine info, in the shell
2581 @cindex Online Help, in the shell
2582 @multitable @columnfractions .12 .88
2583 @item @kbd{@key{TAB}}
2584 @tab Completion of file names (between quotes and after executive
2585 commands @samp{.run} and @samp{.compile}), routine names, class names,
2586 keywords, system variables, system variable tags etc.
2587 (@code{idlwave-shell-complete}).
2588 @item @kbd{M-@key{TAB}}
2589 @tab Same as @key{TAB}
2590 @item @kbd{C-c ?}
2591 @tab Routine Info display (@code{idlwave-routine-info})
2592 @item @kbd{M-?}
2593 @tab IDL online help on routine (@code{idlwave-routine-info-from-idlhelp})
2594 @item @kbd{C-c C-i}
2595 @tab Update routine info from buffers and shell
2596 (@code{idlwave-update-routine-info})
2597 @item @kbd{C-c C-v}
2598 @tab Find the source file of a routine (@code{idlwave-find-module})
2599 @item @kbd{C-c C-t}
2600 @tab Find the source file of a routine in the currently visited file
2601 (@code{idlwave-find-module-this-file}).
2602 @item @kbd{C-c =}
2603 @tab Compile a library routine (@code{idlwave-resolve})
2604 @end multitable
2605
2606 @defopt idlwave-shell-arrows-do-history (@code{t})
2607 Non-@code{nil} means @key{UP} and @key{DOWN} arrows move through command
2608 history like xterm.
2609 @end defopt
2610
2611 @defopt idlwave-shell-comint-settings
2612 Alist of special settings for the comint variables in the IDLWAVE Shell.
2613 @end defopt
2614
2615 @defopt idlwave-shell-file-name-chars
2616 The characters allowed in file names, as a string. Used for file name
2617 completion.
2618 @end defopt
2619
2620 @defopt idlwave-shell-graphics-window-size
2621 Size of IDL graphics windows popped up by special IDLWAVE command.
2622 @end defopt
2623
2624 @cindex Input mode
2625 @cindex Character input mode (Shell)
2626 @cindex Line input mode (Shell)
2627 @cindex Magic spells, for input mode
2628 @cindex Spells, magic
2629 IDLWAVE works in line input mode: You compose a full command line, using
2630 all the power Emacs gives you to do this. When you press @key{RET}, the
2631 whole line is sent to IDL. Sometimes it is necessary to send single
2632 characters (without a newline), for example when an IDL program is
2633 waiting for single character input with the @code{GET_KBRD} function.
2634 You can send a single character to IDL with the command @kbd{C-c C-x}
2635 (@code{idlwave-shell-send-char}). When you press @kbd{C-c C-y}
2636 (@code{idlwave-shell-char-mode-loop}), IDLWAVE runs a blocking loop
2637 which accepts characters and immediately sends them to IDL. The loop
2638 can be exited with @kbd{C-g}. It terminates also automatically when the
2639 current IDL command is finished. Check the documentation of the two
2640 variables described below for a way to make IDL programs trigger
2641 automatic switches of the input mode.
2642
2643 @defopt idlwave-shell-use-input-mode-magic (@code{nil})
2644 Non-@code{nil} means IDLWAVE should check for input mode spells in
2645 output.
2646 @end defopt
2647
2648 @defopt idlwave-shell-input-mode-spells
2649 The three regular expressions which match the magic spells for input
2650 modes.
2651 @end defopt
2652
2653 @node Commands Sent to the Shell, Debugging IDL Programs, Using the Shell, The IDLWAVE Shell
2654 @section Commands Sent to the Shell
2655 @cindex Commands in shell, showing
2656 @cindex Showing commands in shell
2657
2658 The IDLWAVE buffers and shell interact very closely. In addition to the
2659 normal commands you enter at the @code{IDL>} prompt, many other special
2660 commands are sent to the shell, sometimes as a direct result of invoking
2661 a key command, menu item, or toolbar button, but also automatically, as
2662 part of the normal flow of information updates between the buffer and
2663 shell.
2664
2665 The commands sent include @code{breakpoint}, @code{.step} and other
2666 debug commands (@pxref{Debugging IDL Programs}), @code{.run} and other
2667 compilation statements (@pxref{Compiling Programs}), examination
2668 commands like @code{print} and @code{help} (@pxref{Examining
2669 Variables}), and other special purpose commands designed to keep
2670 information on the running shell current.
2671
2672 By default, much of this background shell input and output is hidden
2673 from the user, but this is configurable. The custom variable
2674 @code{idlwave-abbrev-show-commands} allows you to configure which
2675 commands sent to the shell are shown there. For a related customization
2676 for separating the output of @emph{examine} commands, see @ref{Examining
2677 Variables}.
2678
2679 @defopt idlwave-shell-show-commands (@code{'(run misc breakpoint)})
2680 A list of command types to echo in the shell when sent. Possible values
2681 are @code{run} for @code{.run}, @code{.compile} and other run commands,
2682 @code{misc} for lesser used commands like @code{window},
2683 @code{retall},@code{close}, etc., @code{breakpoint} for breakpoint
2684 setting and clearing commands, and @code{debug} for other debug,
2685 stepping, and continue commands. In addition, if the variable is set to
2686 the single symbol @code{'everything}, all the copious shell input is
2687 displayed (which is probably only useful for debugging purposes).
2688 N.B. For hidden commands which produce output by side-effect, that
2689 output remains hidden (e.g., stepping through a @code{print} command).
2690 As a special case, any error message in the output will be displayed
2691 (e.g., stepping to an error).
2692 @end defopt
2693
2694 @node Debugging IDL Programs, Examining Variables, Commands Sent to the Shell, The IDLWAVE Shell
2695 @section Debugging IDL Programs
2696 @cindex Debugging
2697 @cindex Keybindings for debugging
2698 @cindex Toolbar
2699
2700 Programs can be compiled, run, and debugged directly from the source
2701 buffer in Emacs, walking through arbitrarily deeply nested code,
2702 printing expressions and skipping up and down the calling stack along
2703 the way. IDLWAVE makes compiling and debugging IDL programs far less
2704 cumbersome by providing a full-featured, key/menu/toolbar-driven
2705 interface to commands like @code{breakpoint}, @code{.step},
2706 @code{.run}, etc. It can even perform complex debug operations not
2707 natively supported by IDL (like continuing to the line at the cursor).
2708
2709 The IDLWAVE shell installs key bindings both in the shell buffer and
2710 in all IDL code buffers of the current Emacs session, so debug
2711 commands work in both places (in the shell, commands operate on the
2712 last file compiled). On Emacs versions which support it, a debugging
2713 toolbar is also installed. The toolbar display can be toggled with
2714 @kbd{C-c C-d C-t} (@code{idlwave-shell-toggle-toolbar}).
2715
2716
2717 @defopt idlwave-shell-use-toolbar (@code{t})
2718 Non-@code{nil} means use the debugging toolbar in all IDL related
2719 buffers.
2720 @end defopt
2721
2722 @menu
2723 * A Tale of Two Modes::
2724 * Debug Key Bindings::
2725 * Breakpoints and Stepping::
2726 * Compiling Programs::
2727 * Walking the Calling Stack::
2728 * Electric Debug Mode::
2729 @end menu
2730
2731
2732 @node A Tale of Two Modes, Debug Key Bindings, Debugging IDL Programs, Debugging IDL Programs
2733 @subsection A Tale of Two Modes
2734 @cindex Electric Debug Mode
2735 @cindex Debugging Interface
2736
2737 The many debugging, compiling, and examination commands provided in
2738 IDLWAVE are available simultaneously through two different interfaces:
2739 the original, multi-key command interface, and the new Electric Debug
2740 Mode. The functionality they offer is similar, but the way you interact
2741 with them is quite different. The main difference is that, in Electric
2742 Debug Mode, the source buffers are made read-only, and single
2743 key-strokes are used to step through, examine expressions, set and
2744 remove breakpoints, etc. The same variables, prefix arguments, and
2745 settings apply to both versions, and both can be used interchangeably.
2746 By default, when breakpoints are hit, Electric Debug Mode is enabled.
2747 The traditional interface is described first. @xref{Electric Debug
2748 Mode}, for more on that mode. Note that electric debug mode can be
2749 prevented from activating automatically by customizing the variable
2750 @code{idlwave-shell-automatic-electric-debug}.
2751
2752 @node Debug Key Bindings, Breakpoints and Stepping, A Tale of Two Modes, Debugging IDL Programs
2753 @subsection Debug Key Bindings
2754 @kindex C-c C-d
2755 @cindex Key bindings
2756
2757 The standard debugging key bindings are always available by default on
2758 the prefix key @kbd{C-c C-d}, so, for example, setting a breakpoint is
2759 done with @kbd{C-c C-d C-b}, and compiling a source file with @kbd{C-c
2760 C-d C-c}. You can also easily configure IDLWAVE to use one or more
2761 modifier keys not in use by other commands, in lieu of the prefix
2762 @kbd{C-c C-d} (though these bindings will typically also be available
2763 --- see @code{idlwave-shell-activate-prefix-keybindings}). For
2764 example, if you include in @file{.emacs}:
2765
2766 @lisp
2767 (setq idlwave-shell-debug-modifiers '(control shift))
2768 @end lisp
2769
2770 @noindent a breakpoint can then be set by pressing @kbd{b} while holding down
2771 @kbd{shift} and @kbd{control} keys, i.e. @kbd{C-S-b}. Compiling a
2772 source file will be on @kbd{C-S-c}, deleting a breakpoint @kbd{C-S-d},
2773 etc. In the remainder of this chapter we will assume that the
2774 @kbd{C-c C-d} bindings are active, but each of these bindings will
2775 have an equivalent shortcut if modifiers are given in the
2776 @code{idlwave-shell-debug-modifiers} variable (@pxref{Lesson II --
2777 Customization}). A much simpler and faster form of debugging for
2778 running code is also available by default --- see @ref{Electric Debug
2779 Mode}.
2780
2781 @defopt idlwave-shell-prefix-key (@kbd{C-c C-d})
2782 The prefix key for the debugging map
2783 @code{idlwave-shell-mode-prefix-map}.
2784 @end defopt
2785
2786 @defopt idlwave-shell-activate-prefix-keybindings (@code{t})
2787 Non-@code{nil} means debug commands will be bound to the prefix
2788 key, like @kbd{C-c C-d C-b}.
2789 @end defopt
2790
2791 @defopt idlwave-shell-debug-modifiers (@code{nil})
2792 List of modifier keys to use for additional, alternative binding of
2793 debugging commands in the shell and source buffers. Can be one or
2794 more of @code{control}, @code{meta}, @code{super}, @code{hyper},
2795 @code{alt}, and @code{shift}.
2796 @end defopt
2797
2798 @node Breakpoints and Stepping, Compiling Programs, Debug Key Bindings, Debugging IDL Programs
2799 @subsection Breakpoints and Stepping
2800 @cindex Breakpoints
2801 @cindex Stepping
2802 @cindex Execution, controlled
2803
2804 @kindex C-c C-d C-b
2805 @kindex C-c C-d C-b
2806 IDLWAVE helps you set breakpoints and step through code. Setting a
2807 breakpoint in the current line of the source buffer is accomplished
2808 with @kbd{C-c C-d C-b} (@code{idlwave-shell-break-here}). With a
2809 prefix arg of 1 (i.e. @kbd{C-1 C-c C-d C-b}), the breakpoint gets a
2810 @code{/ONCE} keyword, meaning that it will be deleted after first use.
2811 With a numeric prefix greater than one (e.g. @kbd{C-4 C-c C-d C-b}),
2812 the breakpoint will only be active the @code{nth} time it is hit.
2813 With a single non-numeric prefix (i.e. @kbd{C-u C-c C-d C-b}), prompt
2814 for a condition --- an IDL expression to be evaulated and trigger the
2815 breakpoint only if true. To clear the breakpoint in the current line,
2816 use @kbd{C-c C-d C-d} (@code{idlwave-clear-current-bp}). When
2817 executed from the shell window, the breakpoint where IDL is currently
2818 stopped will be deleted. To clear all breakpoints, use @kbd{C-c C-d
2819 C-a} (@code{idlwave-clear-all-bp}). Breakpoints can also be disabled
2820 and re-enabled: @kbd{C-c C-d C-\}
2821 (@code{idlwave-shell-toggle-enable-current-bp}).
2822
2823 Breakpoint lines are highlighted or indicated with an icon in the source
2824 code (different icons for conditional, after, and other break types).
2825 Disabled breakpoints are @emph{grayed out} by default. Note that IDL
2826 places breakpoints as close as possible on or after the line you
2827 specify. IDLWAVE queries the shell for the actual breakpoint location
2828 which was set, so the exact line you specify may not be marked. You can
2829 re-sync the breakpoint list and update the display at any time (e.g., if
2830 you add or remove some on the command line) using @kbd{C-c C-d C-l}.
2831
2832 In recent IDLWAVE versions, the breakpoint line is highlighted when the
2833 mouse is moved over it, and a tooltip pops up describing the break
2834 details. @kbd{Mouse-3} on the breakpoint line pops up a menu of
2835 breakpoint actions, including clearing, disabling, and adding or
2836 changing break conditions or ``after'' break count.
2837
2838 Once the program has stopped somewhere, you can step through it. The
2839 most important stepping commands are @kbd{C-c C-d C-s} to execute one
2840 line of IDL code ("step into"); @kbd{C-c C-d C-n} to step a single line,
2841 treating procedure and function calls as a single step ("step over");
2842 @kbd{C-c C-d C-h} to continue execution to the line at the cursor and
2843 @kbd{C-c C-d C-r} to continue execution. @xref{Commands Sent to the
2844 Shell}, for information on displaying or hiding the breakpoint and
2845 stepping commands the shell receives. Here is a summary of the
2846 breakpoint and stepping commands:
2847
2848 @multitable @columnfractions .23 .77
2849 @item @kbd{C-c C-d C-b}
2850 @tab Set breakpoint (@code{idlwave-shell-break-here})
2851 @item @kbd{C-c C-d C-i}
2852 @tab Set breakpoint in module named here (@code{idlwave-shell-break-in})
2853 @item @kbd{C-c C-d C-d}
2854 @tab Clear current breakpoint (@code{idlwave-shell-clear-current-bp})
2855 @item @kbd{C-c C-d C-a}
2856 @tab Clear all breakpoints (@code{idlwave-shell-clear-all-bp})
2857 @item @kbd{C-c C-d [}
2858 @tab Go to the previous breakpoint (@code{idlwave-shell-goto-previous-bp})
2859 @item @kbd{C-c C-d ]}
2860 @tab Go to the next breakpoint (@code{idlwave-shell-goto-next-bp})
2861 @item @kbd{C-c C-d C-\}
2862 @tab Disable/Enable current breakpoint (@code{idlwave-shell-toggle-enable-current-bp})
2863 @item @kbd{C-c C-d C-j}
2864 @tab Set a breakpoint at the beginning of the enclosing routine.
2865 @item @kbd{C-c C-d C-s}
2866 @tab Step, into function calls (@code{idlwave-shell-step})
2867 @item @kbd{C-c C-d C-n}
2868 @tab Step, over function calls (@code{idlwave-shell-stepover})
2869 @item @kbd{C-c C-d C-k}
2870 @tab Skip one statement (@code{idlwave-shell-skip})
2871 @item @kbd{C-c C-d C-u}
2872 @tab Continue to end of block (@code{idlwave-shell-up})
2873 @item @kbd{C-c C-d C-m}
2874 @tab Continue to end of function (@code{idlwave-shell-return})
2875 @item @kbd{C-c C-d C-o}
2876 @tab Continue past end of function (@code{idlwave-shell-out})
2877 @item @kbd{C-c C-d C-h}
2878 @tab Continue to line at cursor position (@code{idlwave-shell-to-here})
2879 @item @kbd{C-c C-d C-r}
2880 @tab Continue execution to next breakpoint, if any (@code{idlwave-shell-cont})
2881 @item @kbd{C-c C-d C-up}
2882 @tab Show higher level in calling stack (@code{idlwave-shell-stack-up})
2883 @item @kbd{C-c C-d C-down}
2884 @tab Show lower level in calling stack (@code{idlwave-shell-stack-down})
2885 @end multitable
2886
2887 All of these commands have equivalents in Electric Debug Mode, which
2888 provides faster single-key access (@pxref{Electric Debug Mode}).
2889
2890 The line where IDL is currently stopped, at breakpoints, halts, and
2891 errors, etc., is marked with a color overlay or arrow, depending on the
2892 setting in @code{idlwave-shell-mark-stop-line}. If an overlay face is
2893 used to mark the stop line (as it is by default), when stepping through
2894 code, the face color is temporarily changed to gray, until IDL completes
2895 the next command and moves to the new line.
2896
2897 @defopt idlwave-shell-mark-breakpoints (@code{t})
2898 Non-@code{nil} means mark breakpoints in the source file buffers. The
2899 value indicates the preferred method. Valid values are @code{nil},
2900 @code{t}, @code{face}, and @code{glyph}.
2901 @end defopt
2902
2903 @defopt idlwave-shell-breakpoint-face
2904 The face for breakpoint lines in the source code if
2905 @code{idlwave-shell-mark-breakpoints} has the value @code{face}.
2906 @end defopt
2907
2908 @defopt idlwave-shell-breakpoint-popup-menu (@code{t})
2909 Whether to pop-up a menu and present a tooltip description on
2910 breakpoint lines.
2911 @end defopt
2912
2913 @defopt idlwave-shell-mark-stop-line (@code{t})
2914 Non-@code{nil} means mark the source code line where IDL is currently
2915 stopped. The value specifies the preferred method. Valid values are
2916 @code{nil}, @code{t}, @code{arrow}, and @code{face}.
2917 @end defopt
2918
2919 @defopt idlwave-shell-overlay-arrow (@code{">"})
2920 The overlay arrow to display at source lines where execution halts, if
2921 configured in @code{idlwave-shell-mark-stop-line}.
2922 @end defopt
2923
2924 @defopt idlwave-shell-stop-line-face
2925 The face which highlights the source line where IDL is stopped, if
2926 configured in @code{idlwave-shell-mark-stop-line}.
2927 @end defopt
2928
2929
2930 @node Compiling Programs, Walking the Calling Stack, Breakpoints and Stepping, Debugging IDL Programs
2931 @subsection Compiling Programs
2932 @cindex Compiling programs
2933 @cindex Programs, compiling
2934 @cindex Default command line, executing
2935 @cindex Executing a default command line
2936
2937 @kindex C-c C-d C-c
2938 In order to compile the current buffer under the IDLWAVE shell, press
2939 @kbd{C-c C-d C-c} (@code{idlwave-save-and-run}). This first saves the
2940 current buffer and then sends the command @samp{.run path/to/file} to the
2941 shell. You can also execute @kbd{C-c C-d C-c} from the shell buffer, in
2942 which case the most recently compiled buffer will be saved and
2943 re-compiled.
2944
2945 When developing or debugging a program, it is often necessary to execute
2946 the same command line many times. A convenient way to do this is
2947 @kbd{C-c C-d C-y} (@code{idlwave-shell-execute-default-command-line}).
2948 This command first resets IDL from a state of interrupted execution by
2949 closing all files and returning to the main interpreter level. Then a
2950 default command line is send to the shell. To edit the default command
2951 line, call @code{idlwave-shell-execute-default-command-line} with a
2952 prefix argument: @kbd{C-u C-c C-d C-y}. If no default command line has
2953 been set (or you give two prefix arguments), the last command on the
2954 @code{comint} input history is sent.
2955
2956 @node Walking the Calling Stack, Electric Debug Mode, Compiling Programs, Debugging IDL Programs
2957 @subsection Walking the Calling Stack
2958 @cindex Calling stack, walking
2959
2960 While debugging a program, it can be very useful to check the context in
2961 which the current routine was called, for instance to help understand
2962 the value of the arguments passed. To do so conveniently you need to
2963 examine the calling stack. If execution is stopped somewhere deep in a
2964 program, you can use the commands @kbd{C-c C-d C-@key{UP}}
2965 (@code{idlwave-shell-stack-up}) and @kbd{C-c C-d C-@key{DOWN}}
2966 (@code{idlwave-shell-stack-down}), or the corresponding toolbar buttons,
2967 to move up or down through the calling stack. The mode line of the
2968 shell window will indicate the position within the stack with a label
2969 like @samp{[-3:MYPRO]}. The line of IDL code at that stack position
2970 will be highlighted. If you continue execution, IDLWAVE will
2971 automatically return to the current level. @xref{Examining Variables},
2972 for information how to examine the value of variables and expressions on
2973 higher calling stack levels.
2974
2975 @html
2976 <A NAME="EDEBUG"></A>
2977 @end html
2978 @node Electric Debug Mode, , Walking the Calling Stack, Debugging IDL Programs
2979 @subsection Electric Debug Mode
2980 @cindex Electric Debug Mode
2981 @cindex @samp{*Debugging*}
2982
2983 Even with a convenient debug key prefix enabled, repetitive stepping,
2984 variable examination (@pxref{Examining Variables}), and other debugging
2985 activities can be awkward and slow using commands which require multiple
2986 keystrokes. Luckily, there's a better way, inspired by the lisp e-debug
2987 mode, and available through the @emph{Electric Debug Mode}. By default,
2988 as soon as a breakpoint is hit, this minor mode is enabled. The buffer
2989 showing the line where execution has halted is switched to Electric
2990 Debug Mode. This mode is visible as @samp{*Debugging*} in the mode
2991 line, and a different face (violet by default, if color is available)
2992 for the line stopped at point. The buffer is made read-only and
2993 single-character bindings for the most commonly used debugging commands
2994 are enabled. These character commands (a list of which is available
2995 with @kbd{C-?}) are:
2996
2997 @multitable @columnfractions .2 .8
2998 @item @kbd{a}
2999 @tab Clear all breakpoints (@code{idlwave-shell-clear-all-bp})
3000 @item @kbd{b}
3001 @tab Set breakpoint, @kbd{C-u b} for a conditional break, @kbd{C-n b} for nth hit (@code{idlwave-shell-break-here})
3002 @item @kbd{d}
3003 @tab Clear current breakpoint (@code{idlwave-shell-clear-current-bp})
3004 @item @kbd{e}
3005 @tab Prompt for expression to print (@code{idlwave-shell-clear-current-bp}).
3006 @item @kbd{h}
3007 @tab Continue to the line at cursor position (@code{idlwave-shell-to-here})
3008 @item @kbd{i}
3009 @tab Set breakpoint in module named here (@code{idlwave-shell-break-in})
3010 @item @kbd{[}
3011 @tab Go to the previous breakpoint in the file (@code{idlwave-shell-goto-previous-bp})
3012 @item @kbd{]}
3013 @tab Go to the next breakpoint in the file
3014 (@code{idlwave-shell-goto-next-bp})
3015 @item @kbd{\}
3016 @tab Disable/Enable current breakpoint (@code{idlwave-shell-toggle-enable-current-bp})
3017 @item @kbd{j}
3018 @tab Set breakpoint at beginning of enclosing routine (@code{idlwave-shell-break-this-module})
3019 @item @kbd{k}
3020 @tab Skip one statement (@code{idlwave-shell-skip})
3021 @item @kbd{m}
3022 @tab Continue to end of function (@code{idlwave-shell-return})
3023 @item @kbd{n}
3024 @tab Step, over function calls (@code{idlwave-shell-stepover})
3025 @item @kbd{o}
3026 @tab Continue past end of function (@code{idlwave-shell-out})
3027 @item @kbd{p}
3028 @tab Print expression near point or in region with @kbd{C-u p} (@code{idlwave-shell-print})
3029 @item @kbd{q}
3030 @tab End the debugging session and return to the Shell's main level
3031 (@code{idlwave-shell-retall})
3032 @item @kbd{r}
3033 @tab Continue execution to next breakpoint, if any (@code{idlwave-shell-cont})
3034 @item @kbd{s} or @kbd{@key{SPACE}}
3035 @tab Step, into function calls (@code{idlwave-shell-step})
3036 @item @kbd{t}
3037 @tab Print a calling-level traceback in the shell
3038 @item @kbd{u}
3039 @tab Continue to end of block (@code{idlwave-shell-up})
3040 @item @kbd{v}
3041 @tab Turn Electric Debug Mode off
3042 (@code{idlwave-shell-electric-debug-mode})
3043 @item @kbd{x}
3044 @tab Examine expression near point (or in region with @kbd{C-u x})
3045 with shortcut of examine type.
3046 @item @kbd{z}
3047 @tab Reset IDL (@code{idlwave-shell-reset})
3048 @item @kbd{+} or @kbd{=}
3049 @tab Show higher level in calling stack (@code{idlwave-shell-stack-up})
3050 @item @kbd{-} or @kbd{_}
3051 @tab Show lower level in calling stack (@code{idlwave-shell-stack-down})
3052 @item @kbd{?}
3053 @tab Help on expression near point or in region with @kbd{C-u ?}
3054 (@code{idlwave-shell-help-expression})
3055 @item @kbd{C-?}
3056 @tab Show help on the commands available.
3057 @end multitable
3058
3059 Most single-character electric debug bindings use the final keystroke
3060 of the equivalent multiple key commands (which are of course also
3061 still available), but some differ (e.g. @kbd{e},@kbd{t},@kbd{q},@kbd{x}).
3062 Some have additional convenience bindings (like @kbd{@key{SPACE}} for
3063 stepping). All prefix and other argument options described in this
3064 section for the commands invoked by electric debug bindings are still
3065 valid. For example, @kbd{C-u b} sets a conditional breakpoint, just
3066 as it did with @kbd{C-u C-c C-d C-b}.
3067
3068 You can toggle the electric debug mode at any time in a buffer using
3069 @kbd{C-c C-d C-v} (@kbd{v} to turn it off while in the mode), or from
3070 the Debug menu. Normally the mode will be enabled and disabled at the
3071 appropriate times, but occassionally you might want to edit a file
3072 while still debugging it, or switch to the mode for conveniently
3073 setting lots of breakpoints.
3074
3075 To quickly abandon a debugging session and return to normal editing at
3076 the Shell's main level, use @kbd{q} (@code{idlwave-shell-retall}).
3077 This disables electric debug mode in all IDLWAVE buffers@footnote{Note
3078 that this binding is not symmetric: @kbd{C-c C-d C-q} is bound to
3079 @code{idlwave-shell-quit}, which quits your IDL session.}. Help is
3080 available for the command shortcuts with @kbd{C-?}. If you find this
3081 mode gets in your way, you can keep it from automatically activating
3082 by setting the variable @code{idlwave-shell-automatic-electric-debug}
3083 to @code{nil}, or @code{'breakpoint}. If you'd like the convenient
3084 electric debug shortcuts available also when run-time errors are
3085 encountered, set to @code{t}.
3086
3087 @defopt idlwave-shell-automatic-electric-debug (@code{'breakpoint})
3088 Whether to enter electric debug mode automatically when a breakpoint
3089 or run-time error is encountered, and then disable it in all buffers
3090 when the $MAIN$ level is reached (either through normal program
3091 execution, or retall). In addition to @code{nil} for never, and
3092 @code{t} for both breakpoints and errors, this can be
3093 @code{'breakpoint} (the default) to enable it only at breakpoint
3094 halts.
3095 @end defopt
3096
3097 @defopt idlwave-shell-electric-stop-color (Violet)
3098 Default color of the stopped line overlay when in electric debug mode.
3099 @end defopt
3100
3101 @defopt idlwave-shell-electric-stop-line-face
3102 The face to use for the stopped line. Defaults to a face similar to the
3103 modeline, with color @code{idlwave-shell-electric-stop-color}.
3104 @end defopt
3105
3106 @defopt idlwave-shell-electric-zap-to-file (@code{t})
3107 If set, when entering electric debug mode, select the window displaying
3108 the file where point is stopped. This takes point away from the shell
3109 window, but is useful for immediate stepping, etc.
3110 @end defopt
3111
3112 @html
3113 <A NAME="EXAMINE"></A>
3114 @end html
3115 @node Examining Variables, Custom Expression Examination, Debugging IDL Programs, The IDLWAVE Shell
3116 @section Examining Variables
3117 @cindex @code{PRINT} expressions
3118 @cindex @code{HELP}, on expressions
3119 @cindex Expressions, printing & help
3120 @cindex Examining expressions
3121 @cindex Printing expressions
3122 @cindex Mouse binding to print expressions
3123
3124 @kindex C-c C-d C-p
3125 Do you find yourself repeatedly typing, e.g. @code{print,n_elements(x)},
3126 and similar statements to remind yourself of the
3127 type/size/structure/value/etc. of variables and expressions in your code
3128 or at the command line? IDLWAVE has a suite of special commands to
3129 automate these types of variable or expression examinations. They work
3130 by sending statements to the shell formatted to include the indicated
3131 expression, and can be accessed in several ways.
3132
3133 These @emph{examine} commands can be used in the shell or buffer at any
3134 time (as long as the shell is running), and are very useful when
3135 execution is stopped in a buffer due to a triggered breakpoint or error,
3136 or while composing a long command in the IDLWAVE shell. In the latter
3137 case, the command is sent to the shell and its output is visible, but
3138 point remains unmoved in the command being composed --- you can inspect
3139 the contituents of a command you're building without interrupting the
3140 process of building it! You can even print arbitrary expressions from
3141 older input or output further up in the shell window --- any expression,
3142 variable, number, or function you see can be examined.
3143
3144 If the variable @code{idlwave-shell-separate-examine-output} is
3145 non-@code{nil} (the default), all examine output will be sent to a
3146 special @file{*Examine*} buffer, rather than the shell. The output of
3147 prior examine commands is saved in this buffer. In this buffer @key{c}
3148 clears the contents, and @key{q} hides the buffer.
3149
3150 The two most basic examine commands are bound to @kbd{C-c C-d C-p}, to
3151 print the expression at point, and @kbd{C-c C-d ?}, to invoke help on
3152 this expression@footnote{Available as @kbd{p} and @kbd{?} in Electric
3153 Debug Mode (@pxref{Electric Debug Mode})}. The expression at point is
3154 either an array expression or a function call, or the contents of a pair
3155 of parentheses. The chosen expression is highlighted, and
3156 simultaneously the resulting output is highlighted in the shell or
3157 separate output buffer. Calling the above commands with a prefix
3158 argument will use the current region as expression instead of using the
3159 one at point. which can be useful for examining complicated, multi-line
3160 expressions. Two prefix arguments (@kbd{C-u C-u C-c C-d C-p}) will
3161 prompt for an expression to print directly. By default, when invoking
3162 print, only an initial portion of long arrays will be printed, up to
3163 @code{idlwave-shell-max-print-length}.
3164
3165 For added speed and convenience, there are mouse bindings which allow
3166 you to click on expressions and examine their values. Use
3167 @kbd{S-Mouse-2} to print an expression and @kbd{C-M-Mouse-2} to invoke
3168 help (i.e. you need to hold down @key{META} and @key{CONTROL} while
3169 clicking with the middle mouse button). If you simply click, the
3170 nearest expression will be selected in the same manner as described
3171 above. You can also @emph{drag} the mouse in order to highlight
3172 exactly the specific expression or sub-expression you want to examine.
3173 For custom expression examination, and the powerful customizable
3174 pop-up examine selection, @xref{Custom Expression Examination}.
3175
3176 @cindex Printing expressions, on calling stack
3177 @cindex Restrictions for expression printing
3178 The same variable inspection commands work both in the IDL Shell and
3179 IDLWAVE buffers, and even for variables at higher levels of the calling
3180 stack. For instance, if you're stopped at a breakpoint in a routine,
3181 you can examine the values of variables and expressions inside its
3182 calling routine, and so on, all the way up through the calling stack.
3183 Simply step up the stack, and print variables as you see them
3184 (@pxref{Walking the Calling Stack}, for information on stepping back
3185 through the calling stack). The following restrictions apply for all
3186 levels except the current:
3187
3188 @itemize @bullet
3189 @item
3190 Array expressions must use the @samp{[ ]} index delimiters. Identifiers
3191 with a @samp{( )} will be interpreted as function calls.
3192 @item
3193 @cindex ROUTINE_NAMES, IDL procedure
3194 N.B.: printing values of expressions on higher levels of the calling
3195 stack uses the @emph{unsupported} IDL routine @code{ROUTINE_NAMES},
3196 which may or may not be available in future versions of IDL. Caveat
3197 Examinor.
3198 @end itemize
3199
3200 @defopt idlwave-shell-expression-face
3201 The face for @code{idlwave-shell-expression-overlay}.
3202 Allows you to choose the font, color and other properties for
3203 the expression printed by IDL.
3204 @end defopt
3205
3206 @defopt idlwave-shell-output-face
3207 The face for @code{idlwave-shell-output-overlay}.
3208 Allows to choose the font, color and other properties for the most
3209 recent output of IDL when examining an expression."
3210 @end defopt
3211
3212 @defopt idlwave-shell-separate-examine-output (@code{t})
3213 If non-@code{nil}, re-direct the output of examine commands to a special
3214 @file{*Examine*} buffer, instead of in the shell itself.
3215 @end defopt
3216
3217 @defopt idlwave-shell-max-print-length (200)
3218 The maximum number of leading array entries to print, when examining
3219 array expressions.
3220 @end defopt
3221
3222 @node Custom Expression Examination, , Examining Variables, The IDLWAVE Shell
3223 @section Custom Expression Examination
3224 @cindex Expressions, custom examination
3225 @cindex Custom expression examination
3226
3227 The variety of possible variable and expression examination commands is
3228 endless (just look, for instance, at the keyword list to
3229 @code{widget_info()}). Rather than attempt to include them all, IDLWAVE
3230 provides two easy methods to customize your own commands, with a special
3231 mouse examine command, and two macros for generating your own examine
3232 key and mouse bindings.
3233
3234 The most powerful and flexible mouse examine command of all is
3235 available on @kbd{C-S-Mouse-2}. Just as for all the other mouse
3236 examine commands, it permits click or drag expression selection, but
3237 instead of sending hard-coded commands to the shell, it pops-up a
3238 customizable selection list of examine functions to choose among,
3239 configured with the @code{idlwave-shell-examine-alist}
3240 variable@footnote{In Electric Debug Mode (@pxref{Electric Debug
3241 Mode}), the key @kbd{x} provides a single-character shortcut interface
3242 to the same examine functions for the expression at point or marked by
3243 the region.}. This variable is a list of key-value pairs (an
3244 @emph{alist} in Emacs parlance), where the key gives a name to be
3245 shown for the examine command, and the value is the command strings
3246 itself, in which the text @code{___} (three underscores) will be
3247 replaced by the selected expression before being sent to the shell.
3248 An example might be key @code{Structure Help} with value
3249 @code{help,___,/STRUCTURE}. In that case, you'd be prompted with
3250 @emph{Structure Help}, which might send something like
3251 @code{help,var,/STRUCTURE} to the shell for output.
3252 @code{idlwave-shell-examine-alist} comes configured by default with a
3253 large list of examine commands, but you can easily customize it to add
3254 your own.
3255
3256 In addition to configuring the functions available to the pop-up mouse
3257 command, you can easily create your own customized bindings to inspect
3258 expressions using the two convenience macros
3259 @code{idlwave-shell-examine} and @code{idlwave-shell-mouse-examine}.
3260 These create keyboard or mouse-based custom inspections of variables,
3261 sharing all the same properties of the built-in examine commands.
3262 Both functions take a single string argument sharing the syntax of the
3263 @code{idlwave-shell-examine-alist} values, e.g.:
3264
3265 @lisp
3266 (add-hook 'idlwave-shell-mode-hook
3267 (lambda ()
3268 (idlwave-shell-define-key-both [s-down-mouse-2]
3269 (idlwave-shell-mouse-examine
3270 "print, size(___,/DIMENSIONS)"))
3271 (idlwave-shell-define-key-both [f9] (idlwave-shell-examine
3272 "print, size(___,/DIMENSIONS)"))
3273 (idlwave-shell-define-key-both [f10] (idlwave-shell-examine
3274 "print,size(___,/TNAME)"))
3275 (idlwave-shell-define-key-both [f11] (idlwave-shell-examine
3276 "help,___,/STRUCTURE"))))
3277 @end lisp
3278
3279 @noindent Now pressing @key{f9}, or middle-mouse dragging with the
3280 @key{SUPER} key depressed, will print the dimensions of the nearby or
3281 highlighted expression. Pressing @key{f10} will give the type string,
3282 and @key{f11} will show the contents of a nearby structure. As you can
3283 see, the possibilities are only marginally finite.
3284
3285 @defopt idlwave-shell-examine-alist
3286 An alist of examine commands in which the keys name the command and
3287 are displayed in the selection pop-up, and the values are custom IDL
3288 examine command strings to send, after all instances of @code{___}
3289 (three underscores) are replaced by the indicated expression.
3290 @end defopt
3291
3292 @node Acknowledgements, Sources of Routine Info, The IDLWAVE Shell, Top
3293 @chapter Acknowledgements
3294 @cindex Acknowledgements
3295 @cindex Maintainer, of IDLWAVE
3296 @cindex Authors, of IDLWAVE
3297 @cindex Contributors, to IDLWAVE
3298 @cindex Email address, of Maintainer
3299 @cindex Thanks
3300
3301 @noindent
3302 The main contributors to the IDLWAVE package have been:
3303
3304 @itemize @minus
3305 @item
3306 @uref{mailto:chase@@att.com, @b{Chris Chase}}, the original author.
3307 Chris wrote @file{idl.el} and @file{idl-shell.el} and maintained them
3308 for several years.
3309
3310 @item
3311 @uref{mailto:dominik@@astro.uva.nl, @b{Carsten Dominik}} was in charge
3312 of the package from version 3.0, during which time he overhauled almost
3313 everything, modernized IDLWAVE with many new features, and developed the
3314 manual.
3315
3316 @item
3317 @uref{mailto:jdsmith@@as.arizona.edu, @b{J.D. Smith}}, the current
3318 maintainer, as of version 4.10, helped shape object method completion
3319 and most new features introduced in versions 4.x, and introduced many
3320 new features for IDLWAVE versions 5.x and 6.x.
3321 @end itemize
3322
3323 @noindent
3324 The following people have also contributed to the development of IDLWAVE
3325 with patches, ideas, bug reports and suggestions.
3326
3327 @itemize @minus
3328 @item
3329 Ulrik Dickow <dickow__at__nbi.dk>
3330 @item
3331 Eric E. Dors <edors__at__lanl.gov>
3332 @item
3333 Stein Vidar H. Haugan <s.v.h.haugan__at__astro.uio.no>
3334 @item
3335 David Huenemoerder <dph__at__space.mit.edu>
3336 @item
3337 Kevin Ivory <Kevin.Ivory__at__linmpi.mpg.de>
3338 @item
3339 Dick Jackson <dick__at__d-jackson.com>
3340 @item
3341 Xuyong Liu <liu__at__stsci.edu>
3342 @item
3343 Simon Marshall <Simon.Marshall__at__esrin.esa.it>
3344 @item
3345 Craig Markwardt <craigm__at__cow.physics.wisc.edu>
3346 @item
3347 Laurent Mugnier <mugnier__at__onera.fr>
3348 @item
3349 Lubos Pochman <lubos__at__rsinc.com>
3350 @item
3351 Bob Portmann <portmann__at__al.noaa.gov>
3352 @item
3353 Patrick M. Ryan <pat__at__jaameri.gsfc.nasa.gov>
3354 @item
3355 Marty Ryba <ryba__at__ll.mit.edu>
3356 @item
3357 Phil Williams <williams__at__irc.chmcc.org>
3358 @item
3359 Phil Sterne <sterne__at__dublin.llnl.gov>
3360 @item
3361 Paul Sorenson <aardvark62__at__msn.com>
3362 @end itemize
3363
3364 Doug Dirks was instrumental in providing the crucial IDL XML catalog to
3365 support HTML help with IDL v6.2 and later, and Ali Bahrami provided
3366 scripts and documentation to interface with the IDL Assistant.
3367
3368 @noindent
3369 Thanks to everyone!
3370
3371 @node Sources of Routine Info, HTML Help Browser Tips, Acknowledgements, Top
3372 @appendix Sources of Routine Info
3373
3374 @cindex Sources of routine information
3375 In @ref{Routine Info} and @ref{Completion} we showed how IDLWAVE
3376 displays the calling sequence and keywords of routines, and completes
3377 routine names and keywords. For these features to work, IDLWAVE must
3378 know about the accessible routines.
3379
3380 @menu
3381 * Routine Definitions:: Where IDL Routines are defined.
3382 * Routine Information Sources:: So how does IDLWAVE know about...
3383 * Catalogs::
3384 * Load-Path Shadows:: Routines defined in several places
3385 * Documentation Scan:: Scanning the IDL Manuals
3386 @end menu
3387
3388 @node Routine Definitions, Routine Information Sources, Sources of Routine Info, Sources of Routine Info
3389 @appendixsec Routine Definitions
3390 @cindex Routine definitions
3391 @cindex IDL variable @code{!PATH}
3392 @cindex @code{!PATH}, IDL variable
3393 @cindex @code{CALL_EXTERNAL}, IDL routine
3394 @cindex @code{LINKIMAGE}, IDL routine
3395 @cindex External routines
3396
3397 @noindent Routines which can be used in an IDL program can be defined in
3398 several places:
3399
3400 @enumerate
3401 @item
3402 @emph{Builtin routines} are defined inside IDL itself. The source code
3403 of such routines is not available, but instead are learned about through
3404 the IDL documentation.
3405 @item
3406 Routines which are @emph{part of the current program}, are defined in a
3407 file explicitly compiled by the user. This file may or may not be
3408 located on the IDL search path.
3409 @item
3410 @emph{Library routines} are defined in files located on IDL's search
3411 path. When a library routine is called for the first time, IDL will
3412 find the source file and compile it dynamically. A special sub-category
3413 of library routines are the @emph{system routines} distributed with IDL,
3414 and usually available in the @file{lib} subdirectory of the IDL
3415 distribution.
3416 @item
3417 External routines written in other languages (like Fortran or C) can be
3418 called with @code{CALL_EXTERNAL}, linked into IDL via @code{LINKIMAGE},
3419 or included as dynamically loaded modules (DLMs). Currently IDLWAVE
3420 cannot provide routine info and completion for such external routines,
3421 except by querying the Shell for calling information (DLMs only).
3422 @end enumerate
3423
3424 @node Routine Information Sources, Catalogs, Routine Definitions, Sources of Routine Info
3425 @appendixsec Routine Information Sources
3426 @cindex Routine info sources
3427 @cindex Builtin list of routines
3428 @cindex Updating routine info
3429 @cindex Scanning buffers for routine info
3430 @cindex Buffers, scanning for routine info
3431 @cindex Shell, querying for routine info
3432
3433 @noindent To maintain the most comprehensive information about all IDL
3434 routines on a system, IDLWAVE collects data from many sources:
3435
3436 @enumerate
3437
3438 @item
3439 It has a @emph{builtin list} with information about the routines IDL
3440 ships with. IDLWAVE @value{VERSION} is distributed with a list of
3441 @value{NSYSROUTINES} routines, reflecting IDL version
3442 @value{IDLVERSION}. As of IDL v6.2, the routine info is distributed
3443 directly with IDL in the form of an XML catalog which IDLWAVE scans.
3444 Formerly, this list was created by scanning the IDL manuals to produce
3445 the file @file{idlw-rinfo.el}.
3446
3447 @item
3448 IDLWAVE @emph{scans} all its @emph{buffers} in the current Emacs session
3449 for routine definitions. This is done automatically when routine
3450 information or completion is first requested by the user. Each new
3451 buffer and each buffer saved after making changes is also scanned. The
3452 command @kbd{C-c C-i} (@code{idlwave-update-routine-info}) can be used
3453 at any time to rescan all buffers.
3454
3455 @item
3456 If you have an IDLWAVE-Shell running in the Emacs session, IDLWAVE will
3457 @emph{query the shell} for compiled routines and their arguments. This
3458 happens automatically when routine information or completion is first
3459 requested by the user. Each time an Emacs buffer is compiled with
3460 @kbd{C-c C-d C-c}, the routine info for that file is queried. Though
3461 rarely necessary, the command @kbd{C-c C-i}
3462 (@code{idlwave-update-routine-info}) can be used to explicitly update
3463 the shell routine data.
3464
3465 @item
3466 Many popular libraries are distributed with routine information already
3467 scanned into @emph{library catalogs} (@pxref{Library Catalogs}). These
3468 per-directory catalog files can also be built by the user with the
3469 supplied @file{idlwave_catalog} tool. They are automatically discovered
3470 by IDLWAVE.
3471
3472 @item
3473 IDLWAVE can scan selected directories of source files and store the
3474 result in a single @emph{user catalog} file which will be
3475 automatically loaded just like @file{idlw-rinfo.el}. @xref{User
3476 Catalog}, for information on how to scan files in this way.
3477 @end enumerate
3478
3479 Loading all the routine and catalog information can be a time consuming
3480 process, especially over slow networks. Depending on the system and
3481 network configuration it could take up to 30 seconds (though locally on
3482 fast systems is usually only a few seconds). In order to minimize the
3483 wait time upon your first completion or routine info command in a
3484 session, IDLWAVE uses Emacs idle time to do the initialization in six
3485 steps, yielding to user input in between. If this gets into your way,
3486 set the variable @code{idlwave-init-rinfo-when-idle-after} to 0 (zero).
3487 The more routines documented in library and user catalogs, the slower
3488 the loading will be, so reducing this number can help alleviate any long
3489 load times.
3490
3491 @defopt idlwave-init-rinfo-when-idle-after (@code{10})
3492 Seconds of idle time before routine info is automatically initialized.
3493 @end defopt
3494
3495 @defopt idlwave-scan-all-buffers-for-routine-info (@code{t})
3496 Non-@code{nil} means scan all buffers for IDL programs when updating
3497 info.
3498 @end defopt
3499
3500 @defopt idlwave-query-shell-for-routine-info (@code{t})
3501 Non-@code{nil} means query the shell for info about compiled routines.
3502 @end defopt
3503
3504 @defopt idlwave-auto-routine-info-updates
3505 Controls under what circumstances routine info is updated automatically.
3506 @end defopt
3507
3508 @html
3509 <A NAME="CATALOGS"></A>
3510 @end html
3511 @node Catalogs, Load-Path Shadows, Routine Information Sources, Sources of Routine Info
3512 @appendixsec Catalogs
3513 @cindex Catalogs
3514
3515 @emph{Catalogs} are files containing scanned information on individual
3516 routines, including arguments and keywords, calling sequence, file path,
3517 class and procedure vs. function type, etc. They represent a way of
3518 extending the internal built-in information available for IDL system
3519 routines (@pxref{Routine Info}) to other source collections.
3520
3521 Starting with version 5.0, there are two types of catalogs available
3522 with IDLWAVE. The traditional @emph{user catalog} and the newer
3523 @emph{library catalogs}. Although they can be used interchangeably, the
3524 library catalogs are more flexible, and preferred. There are few
3525 occasions when a user catalog might be preferred --- read below. Both
3526 types of catalogs can coexist without causing problems.
3527
3528 To facilitate the catalog systems, IDLWAVE stores information it gathers
3529 from the shell about the IDL search paths, and can write this
3530 information out automatically, or on-demand (menu @code{Debug->Save Path
3531 Info}). On systems with no shell from which to discover the path
3532 information (e.g. Windows), a library path must be specified in
3533 @code{idlwave-library-path} to allow library catalogs to be located, and
3534 to setup directories for user catalog scan (@pxref{User Catalog} for
3535 more on this variable). Note that, before the shell is running, IDLWAVE
3536 can only know about the IDL search path by consulting the file pointed
3537 to by @code{idlwave-path-file} (@file{~/.idlwave/idlpath.el}, by
3538 default). If @code{idlwave-auto-write-path} is enabled (which is the
3539 default), the paths are written out whenever the IDLWAVE shell is
3540 started.
3541
3542 @defopt idlwave-auto-write-path (@code{t})
3543 Write out information on the !PATH and !DIR paths from IDL automatically
3544 when they change and when the Shell is closed. These paths are needed
3545 to locate library catalogs.
3546 @end defopt
3547
3548 @defopt idlwave-library-path
3549 IDL library path for Windows and MacOS. Under Unix/MacOSX, will be
3550 obtained from the Shell when run.
3551 @end defopt
3552
3553 @defopt idlwave-system-directory
3554 The IDL system directory for Windows and MacOS. Also needed for
3555 locating HTML help and the IDL Assistant for IDL v6.2 and later. Under
3556 Unix/MacOSX, will be obtained from the Shell and recorded, if run.
3557 @end defopt
3558
3559 @defopt idlwave-config-directory (@file{~/.idlwave})
3560 Default path where IDLWAVE saves configuration information, a user
3561 catalog (if any), and a cached scan of the XML catalog (IDL v6.2 and
3562 later).
3563 @end defopt
3564
3565 @menu
3566 * Library Catalogs::
3567 * User Catalog::
3568 @end menu
3569
3570 @html
3571 <A NAME="LIBRARY_CATALOGS"></A>
3572 @end html
3573 @node Library Catalogs, User Catalog, Catalogs, Catalogs
3574 @appendixsubsec Library Catalogs
3575 @cindex @file{.idlwave_catalog}
3576 @cindex Library catalogs
3577 @cindex @code{idlwave_catalog}
3578
3579 Library catalogs consist of files named @file{.idlwave_catalog} stored
3580 in directories containing @code{.pro} routine files. They are
3581 discovered on the IDL search path and loaded automatically when routine
3582 information is read. Each catalog file documents the routines found in
3583 that directory --- one catalog per directory. Every catalog has a
3584 library name associated with it (e.g. @emph{AstroLib}). This name will
3585 be shown briefly when the catalog is found, and in the routine info of
3586 routines it documents.
3587
3588 Many popular libraries of routines are shipped with IDLWAVE catalog
3589 files by default, and so will be automatically discovered. Library
3590 catalogs are scanned externally to Emacs using a tool provided with
3591 IDLWAVE. Each catalog can be re-scanned independently of any other.
3592 Catalogs can easily be made available system-wide with a common source
3593 repository, providing uniform routine information, and lifting the
3594 burden of scanning from the user (who may not even know they're using a
3595 scanned catalog). Since all catalogs are independent, they can be
3596 re-scanned automatically to gather updates, e.g. in a @file{cron} job.
3597 Scanning is much faster than with the built-in user catalog method. One
3598 minor disadvantage: the entire IDL search path is scanned for catalog
3599 files every time IDLWAVE starts up, which might be slow if accessing IDL
3600 routines over a slow network.
3601
3602 A Perl tool to create library catalogs is distributed with IDLWAVE:
3603 @code{idlwave_catalog}. It can be called quite simply:
3604 @example
3605 idlwave_catalog MyLib
3606 @end example
3607
3608 @noindent This will scan all directories recursively beneath the current and
3609 populate them with @file{.idlwave_catalog} files, tagging the routines
3610 found there with the name library ``MyLib''. The full usage
3611 information:
3612
3613 @example
3614 Usage: idlwave_catalog [-l] [-v] [-d] [-s] [-f] [-h] libname
3615 libname - Unique name of the catalog (4 or more alphanumeric
3616 characters).
3617 -l - Scan local directory only, otherwise recursively
3618 catalog all directories at or beneath this one.
3619 -v - Print verbose information.
3620 -d - Instead of scanning, delete all .idlwave_catalog files
3621 here or below.
3622 -s - Be silent.
3623 -f - Force overwriting any catalogs found with a different
3624 library name.
3625 -h - Print this usage.
3626 @end example
3627
3628 To re-load the library catalogs on the IDL path, force a system routine
3629 info update using a single prefix to @code{idlwave-update-routine-info}:
3630 @kbd{C-u C-c C-i}.
3631
3632 @defopt idlwave-use-library-catalogs (@code{t})
3633 Whether to search for and load library catalogs. Disable if load
3634 performance is a problem and/or the catalogs are not needed.
3635 @end defopt
3636
3637 @node User Catalog, , Library Catalogs, Catalogs
3638 @appendixsubsec User Catalog
3639 @cindex User catalog
3640 @cindex IDL library routine info
3641 @cindex Windows
3642 @cindex MacOS
3643 @cindex IDL variable @code{!DIR}
3644 @cindex @code{!DIR}, IDL variable
3645
3646 The user catalog is the old routine catalog system. It is produced
3647 within Emacs, and stored in a single file in the user's home directory
3648 (@file{.idlwave/idlusercat.el} by default). Although library catalogs
3649 are more flexible, there may be reasons to prefer a user catalog
3650 instead, including:
3651
3652 @itemize @bullet
3653 @item The scan is internal to Emacs, so you don't need a working Perl
3654 installation, as you do for library catalogs.
3655 @item Can be used to scan directories for which the user has no write
3656 privileges.
3657 @item Easy widget-based path selection.
3658 @end itemize
3659
3660 However, no routine info is available in the user catalog by default;
3661 the user must actively complete a scan. In addition, this type of
3662 catalog is all or nothing: if a single routine changes, the entire
3663 catalog must be rescanned to update it. Creating the user catalog is
3664 also much slower than scanning library catalogs.
3665
3666 You can scan any of the directories on the currently known path. Under
3667 Windows and MacOS (not OSX), you need to specify the IDL search path in
3668 the variable @code{idlwave-library-path}, and the location of the IDL
3669 directory (the value of the @code{!DIR} system variable) in the variable
3670 @code{idlwave-system-directory}, like this@footnote{The initial @samp{+}
3671 leads to recursive expansion of the path, just like in IDL}:
3672
3673 @lisp
3674 (setq idlwave-library-path
3675 '("+c:/RSI/IDL56/lib/" "+c:/user/me/idllibs"))
3676 (setq idlwave-system-directory "c:/RSI/IDL56/")
3677 @end lisp
3678
3679 @noindent Under GNU/Linux and UNIX, these values will be automatically
3680 gathered from the IDLWAVE shell, if run.
3681
3682 The command @kbd{M-x idlwave-create-user-catalog-file} (or the menu item
3683 @samp{IDLWAVE->Routine Info->Select Catalog Directories}) can then be
3684 used to create a user catalog. It brings up a widget in which you can
3685 select some or all directories on the search path. Directories which
3686 already contain a library catalog are marked with @samp{[LIB]}, and need
3687 not be scanned (although there is no harm if you do so, other than the
3688 additional memory used for the duplication).
3689
3690 After selecting directories, click on the @w{@samp{[Scan & Save]}}
3691 button in the widget to scan all files in the selected directories and
3692 write out the resulting routine information. In order to update the
3693 library information using the directory selection, call the command
3694 @code{idlwave-update-routine-info} with a double prefix argument:
3695 @w{@kbd{C-u C-u C-c C-i}}. This will rescan files in the previously
3696 selected directories, write an updated version of the user catalog file
3697 and rebuild IDLWAVE's internal lists. If you give three prefix
3698 arguments @w{@kbd{C-u C-u C-u C-c C-i}}, updating will be done with a
3699 background job@footnote{Unix systems only, I think.}. You can continue
3700 to work, and the library catalog will be re-read when it is ready. If
3701 you find you need to update the user catalog often, you should consider
3702 building a library catalog for your routines instead (@pxref{Library
3703 Catalogs}).
3704
3705 @defopt idlwave-special-lib-alist
3706 Alist of regular expressions matching special library directories for
3707 labeling in routine-info display.
3708 @end defopt
3709
3710 @node Load-Path Shadows, Documentation Scan, Catalogs, Sources of Routine Info
3711 @appendixsec Load-Path Shadows
3712 @cindex Load-path shadows
3713 @cindex Shadows, load-path
3714 @cindex Duplicate routines
3715 @cindex Multiply defined routines
3716 @cindex Routine definitions, multiple
3717 @cindex Application, testing for shadowing
3718 @cindex Buffer, testing for shadowing
3719
3720 IDLWAVE can compile a list of routines which are (re-)defined in more
3721 than one file. Since one definition will hide (shadow) the others
3722 depending on which file is compiled first, such multiple definitions are
3723 called "load-path shadows". IDLWAVE has several routines to scan for
3724 load path shadows. The output is placed into the special buffer
3725 @file{*Shadows*}. The format of the output is identical to the source
3726 section of the routine info buffer (@pxref{Routine Info}). The
3727 different definitions of a routine are ordered by @emph{likelihood of
3728 use}. So the first entry will be most likely the one you'll get if an
3729 unsuspecting command uses that routine. Before listing shadows, you
3730 should make sure that routine info is up-to-date by pressing @kbd{C-c
3731 C-i}. Here are the different routines (also available in the Menu
3732 @samp{IDLWAVE->Routine Info}):
3733
3734 @table @asis
3735 @item @kbd{M-x idlwave-list-buffer-load-path-shadows}
3736 This commands checks the names of all routines defined in the current
3737 buffer for shadowing conflicts with other routines accessible to
3738 IDLWAVE. The command also has a key binding: @kbd{C-c C-b}
3739 @item @kbd{M-x idlwave-list-shell-load-path-shadows}.
3740 Checks all routines compiled under the shell for shadowing. This is
3741 very useful when you have written a complete application. Just compile
3742 the application, use @code{RESOLVE_ALL} to compile any routines used by
3743 your code, update the routine info inside IDLWAVE with @kbd{C-c C-i} and
3744 then check for shadowing.
3745 @item @kbd{M-x idlwave-list-all-load-path-shadows}
3746 This command checks all routines accessible to IDLWAVE for conflicts.
3747 @end table
3748
3749 For these commands to work fully you need to scan the entire load path
3750 in either a user or library catalog. Also, IDLWAVE should be able to
3751 distinguish between the system library files (normally installed in
3752 @file{/usr/local/rsi/idl/lib}) and any site specific or user specific
3753 files. Therefore, such local files should not be installed inside the
3754 @file{lib} directory of the IDL directory. This is also advisable for
3755 many other reasons.
3756
3757 @cindex Windows
3758 @cindex MacOS
3759 @cindex IDL variable @code{!DIR}
3760 @cindex @code{!DIR}, IDL variable
3761 Users of Windows and MacOS (not X) also must set the variable
3762 @code{idlwave-system-directory} to the value of the @code{!DIR} system
3763 variable in IDL. IDLWAVE appends @file{lib} to the value of this
3764 variable and assumes that all files found on that path are system
3765 routines.
3766
3767 Another way to find out if a specific routine has multiple definitions
3768 on the load path is routine info display (@pxref{Routine Info}).
3769
3770 @node Documentation Scan, , Load-Path Shadows, Sources of Routine Info
3771 @appendixsec Documentation Scan
3772 @cindex @file{get_html_rinfo}
3773 @cindex @file{idlw-rinfo.el}
3774 @cindex Scanning the documentation
3775 @cindex Perl program, to create @file{idlw-rinfo.el}
3776
3777 @strong{Starting with version 6.2, IDL is distributed directly with HTML
3778 online help, and an XML-based catalog of routine information}. This
3779 makes scanning the manuals with the tool @file{get_html_rinfo}, and the
3780 @file{idlw-rinfo.el} file it produced, as described here, entirely
3781 unnecessary. The information is left here for users wishing to produce
3782 a catalog of older IDL versions' help.
3783
3784
3785 IDLWAVE derives its knowledge about system routines from the IDL
3786 manuals. The file @file{idlw-rinfo.el} contains the routine information
3787 for the IDL system routines, and links to relevant sections of the HTML
3788 documentation. The Online Help feature of IDLWAVE requires HTML
3789 versions of the IDL manuals to be available; the HTML documentation is
3790 not distributed with IDLWAVE by default, but must be downloaded
3791 separately.
3792
3793 The HTML files and related images can be produced from the
3794 @file{idl.chm} HTMLHelp file distributed with IDL using the free
3795 Microsoft HTML Help Workshop. If you are lucky, the maintainer of
3796 IDLWAVE will always have access to the newest version of IDL and provide
3797 updates. The IDLWAVE distribution also contains the Perl program
3798 @file{get_html_rinfo} which constructs the @file{idlw-rinfo.el} file by
3799 scanning the HTML documents produced from the IDL documentation.
3800 Instructions on how to use @file{get_html_rinfo} are in the program
3801 itself.
3802
3803 @node HTML Help Browser Tips, Configuration Examples, Sources of Routine Info, Top
3804 @appendix HTML Help Browser Tips
3805 @cindex Browser Tips
3806
3807 There are a wide variety of possible browsers to use for displaying
3808 the online HTML help available with IDLWAVE (starting with version
3809 5.0). Since IDL v6.2, a single cross-platform HTML help browser, the
3810 @emph{IDL Assistant} is distributed with IDL. If this help browser is
3811 available, it is the preferred choice, and the default. The variable
3812 @code{idlwave-help-use-assistant}, enabled by default, controls
3813 whether this help browser is used. If you use the IDL Assistant, the
3814 tips here are not relevant.
3815
3816 Since IDLWAVE runs on a many different system types, a single browser
3817 configuration is not possible, but choices abound. On many systems,
3818 the default browser configured in @code{browse-url-browser-function},
3819 and hence inherited by default by
3820 @code{idlwave-help-browser-function}, is Netscape. Unfortunately, the
3821 HTML manuals decompiled from the original source contain formatting
3822 structures which Netscape 4.x does not handle well, though they are
3823 still readable. A much better choice is Mozilla, or one of the
3824 Mozilla-derived browsers such as
3825 @uref{http://galeon.sourceforge.net/,Galeon} (GNU/Linux),
3826 @uref{http://www.mozilla.org/projects/camino/,Camino} (MacOSX), or
3827 @uref{http://www.mozilla.org/projects/firebird/,Firebird} (all
3828 platforms). Newer versions of Emacs provide a browser-function choice
3829 @code{browse-url-gnome-moz} which uses the Gnome-configured browser.
3830
3831 Note that the HTML files decompiled from the help sources contain
3832 specific references to the @samp{Symbol} font, which by default is not
3833 permitted in normal encodings (it's invalid, technically). Though it
3834 only impacts a few symbols, you can trick Mozilla-based browsers into
3835 recognizing @samp{Symbol} by following the directions
3836 @uref{http://hutchinson.belmont.ma.us/tth/Xfonts.html, here}. With
3837 this fix in place, HTML help pages look almost identical to their PDF
3838 equivalents (yet can be bookmarked, browsed as history, searched,
3839 etc.).
3840
3841 @noindent Individual platform recommendations:
3842
3843 @itemize @bullet
3844 @item Unix/MacOSX: The @uref{http://www.w3m.org,@code{w3m}} browser
3845 and its associated
3846 @uref{http://emacs-w3m.namazu.org/,@code{emacs-w3m}} emacs mode
3847 provide in-buffer browsing with image display, and excellent speed and
3848 formatting. Both the Emacs mode and the browser itself must be
3849 downloaded separately. To use this browser, include
3850
3851 @lisp
3852 (setq idlwave-help-browser-function 'w3m-browse-url)
3853 @end lisp
3854
3855 in your @file{.emacs}. Setting a few other nice @code{w3m} options
3856 cuts down on screen clutter:
3857
3858 @lisp
3859 (setq w3m-use-tab nil
3860 w3m-use-header-line nil
3861 w3m-use-toolbar nil)
3862 @end lisp
3863
3864 If you use a dedicated frame for help, you might want to add the
3865 following, to get consistent behavior with the @kbd{q} key:
3866
3867 @lisp
3868 ;; Close my help window when w3m closes.
3869 (defadvice w3m-close-window (after idlwave-close activate)
3870 (if (boundp 'idlwave-help-frame)
3871 (idlwave-help-quit)))
3872 @end lisp
3873
3874 Note that you can open the file in an external browser from within
3875 @code{w3m} using @kbd{M}.
3876 @end itemize
3877
3878 @node Configuration Examples, Windows and MacOS, HTML Help Browser Tips, Top
3879 @appendix Configuration Examples
3880 @cindex Configuration examples
3881 @cindex Example configuration
3882 @cindex @file{.emacs}
3883 @cindex Default settings, of options
3884 @cindex Interview, with the maintainer
3885
3886 @noindent
3887 @b{Question:} You have all these complicated configuration options in
3888 your package, but which ones do @emph{you} as the maintainer actually
3889 set in your own configuration?
3890
3891 @noindent
3892 @b{Answer:} Not many, beyond custom key bindings. I set most defaults
3893 the way that seems best. However, the default settings do not turn on
3894 features which:
3895
3896 @itemize @minus
3897 @item
3898 are not self-evident (i.e. too magic) when used by an unsuspecting user.
3899 @item
3900 are too intrusive.
3901 @item
3902 will not work properly on all Emacs installations.
3903 @item
3904 break with widely used standards.
3905 @item
3906 use function or other non-standard keys.
3907 @item
3908 are purely personal customizations, like additional key bindings, and
3909 library names.
3910 @end itemize
3911
3912 @noindent To see what I mean, here is the @emph{entire} configuration
3913 the old maintainer had in his @file{.emacs}:
3914
3915 @lisp
3916 (setq idlwave-shell-debug-modifiers '(control shift)
3917 idlwave-store-inquired-class t
3918 idlwave-shell-automatic-start t
3919 idlwave-main-block-indent 2
3920 idlwave-init-rinfo-when-idle-after 2
3921 idlwave-help-dir "~/lib/emacs/idlwave"
3922 idlwave-special-lib-alist '(("/idl-astro/" . "AstroLib")
3923 ("/jhuapl/" . "JHUAPL-Lib")
3924 ("/dominik/lib/idl/" . "MyLib")))
3925 @end lisp
3926
3927 However, if you are an Emacs power-user and want IDLWAVE to work
3928 completely differently, you can change almost every aspect of it. Here
3929 is an example of a much more extensive configuration of IDLWAVE. The
3930 user is King!
3931
3932 @example
3933 ;;; Settings for IDLWAVE mode
3934
3935 (setq idlwave-block-indent 3) ; Indentation settings
3936 (setq idlwave-main-block-indent 3)
3937 (setq idlwave-end-offset -3)
3938 (setq idlwave-continuation-indent 1)
3939 (setq idlwave-begin-line-comment "^;[^;]") ; Leave ";" but not ";;"
3940 ; anchored at start of line.
3941 (setq idlwave-surround-by-blank t) ; Turn on padding ops =,<,>
3942 (setq idlwave-pad-keyword nil) ; Remove spaces for keyword '='
3943 (setq idlwave-expand-generic-end t) ; convert END to ENDIF etc...
3944 (setq idlwave-reserved-word-upcase t) ; Make reserved words upper case
3945 ; (with abbrevs only)
3946 (setq idlwave-abbrev-change-case nil) ; Don't force case of expansions
3947 (setq idlwave-hang-indent-regexp ": ") ; Change from "- " for auto-fill
3948 (setq idlwave-show-block nil) ; Turn off blinking to begin
3949 (setq idlwave-abbrev-move t) ; Allow abbrevs to move point
3950 (setq idlwave-query-class '((method-default . nil) ; No query for method
3951 (keyword-default . nil); or keyword completion
3952 ("INIT" . t) ; except for these
3953 ("CLEANUP" . t)
3954 ("SETPROPERTY" .t)
3955 ("GETPROPERTY" .t)))
3956
3957 ;; Using w3m for help (must install w3m and emacs-w3m)
3958 (autoload 'w3m-browse-url "w3m" "Interface for w3m on Emacs." t)
3959 (setq idlwave-help-browser-function 'w3m-browse-url
3960 w3m-use-tab nil ; no tabs, location line, or toolbar
3961 w3m-use-header-line nil
3962 w3m-use-toolbar nil)
3963
3964 ;; Close my help window or frame when w3m closes with `q'
3965 (defadvice w3m-close-window (after idlwave-close activate)
3966 (if (boundp 'idlwave-help-frame)
3967 (idlwave-help-quit)))
3968
3969 ;; Some setting can only be done from a mode hook. Here is an example:
3970 (add-hook 'idlwave-mode-hook
3971 (lambda ()
3972 (setq case-fold-search nil) ; Make searches case sensitive
3973 ;; Run other functions here
3974 (font-lock-mode 1) ; Turn on font-lock mode
3975 (idlwave-auto-fill-mode 0) ; Turn off auto filling
3976 (setq idlwave-help-browser-function 'browse-url-w3)
3977
3978 ;; Pad with 1 space (if -n is used then make the
3979 ;; padding a minimum of n spaces.) The defaults use -1
3980 ;; instead of 1.
3981 (idlwave-action-and-binding "=" '(idlwave-expand-equal 1 1))
3982 (idlwave-action-and-binding "<" '(idlwave-surround 1 1))
3983 (idlwave-action-and-binding ">" '(idlwave-surround 1 1 '(?-)))
3984 (idlwave-action-and-binding "&" '(idlwave-surround 1 1))
3985
3986 ;; Only pad after comma and with exactly 1 space
3987 (idlwave-action-and-binding "," '(idlwave-surround nil 1))
3988 (idlwave-action-and-binding "&" '(idlwave-surround 1 1))
3989
3990 ;; Pad only after `->', remove any space before the arrow
3991 (idlwave-action-and-binding "->" '(idlwave-surround 0 -1 nil 2))
3992
3993 ;; Set some personal bindings
3994 ;; (In this case, makes `,' have the normal self-insert behavior.)
3995 (local-set-key "," 'self-insert-command)
3996 (local-set-key [f5] 'idlwave-shell-break-here)
3997 (local-set-key [f6] 'idlwave-shell-clear-current-bp)
3998
3999 ;; Create a newline, indenting the original and new line.
4000 ;; A similar function that does _not_ reindent the original
4001 ;; line is on "\C-j" (The default for emacs programming modes).
4002 (local-set-key "\n" 'idlwave-newline)
4003 ;; (local-set-key "\C-j" 'idlwave-newline) ; My preference.
4004
4005 ;; Some personal abbreviations
4006 (define-abbrev idlwave-mode-abbrev-table
4007 (concat idlwave-abbrev-start-char "wb") "widget_base()"
4008 (idlwave-keyword-abbrev 1))
4009 (define-abbrev idlwave-mode-abbrev-table
4010 (concat idlwave-abbrev-start-char "on") "obj_new()"
4011 (idlwave-keyword-abbrev 1))
4012 ))
4013
4014 ;;; Settings for IDLWAVE SHELL mode
4015
4016 (setq idlwave-shell-overlay-arrow "=>") ; default is ">"
4017 (setq idlwave-shell-use-dedicated-frame t) ; Make a dedicated frame
4018 (setq idlwave-shell-prompt-pattern "^WAVE> ") ; default is "^IDL> "
4019 (setq idlwave-shell-explicit-file-name "wave")
4020 (setq idlwave-shell-process-name "wave")
4021 (setq idlwave-shell-use-toolbar nil) ; No toolbar
4022
4023 ;; Most shell interaction settings can be done from the shell-mode-hook.
4024 (add-hook 'idlwave-shell-mode-hook
4025 (lambda ()
4026 ;; Set up some custom key and mouse examine commands
4027 (idlwave-shell-define-key-both [s-down-mouse-2]
4028 (idlwave-shell-mouse-examine
4029 "print, size(___,/DIMENSIONS)"))
4030 (idlwave-shell-define-key-both [f9] (idlwave-shell-examine
4031 "print, size(___,/DIMENSIONS)"))
4032 (idlwave-shell-define-key-both [f10] (idlwave-shell-examine
4033 "print,size(___,/TNAME)"))
4034 (idlwave-shell-define-key-both [f11] (idlwave-shell-examine
4035 "help,___,/STRUCTURE"))))
4036 @end example
4037
4038 @html
4039 <A NAME="WIN_MAC"></A>
4040 @end html
4041 @node Windows and MacOS, Troubleshooting, Configuration Examples, Top
4042 @appendix Windows and MacOS
4043 @cindex Windows
4044 @cindex MacOS
4045 @cindex MacOSX
4046
4047 IDLWAVE was developed on a UNIX system. However, thanks to the
4048 portability of Emacs, much of IDLWAVE does also work under different
4049 operating systems like Windows (with NTEmacs or NTXEmacs) or MacOS.
4050
4051 The only real problem is that there is no command-line version of IDL
4052 for Windows or MacOS(<=9) with which IDLWAVE can interact. As a
4053 result, the IDLWAVE Shell does not work and you have to rely on IDLDE
4054 to run and debug your programs. However, editing IDL source files
4055 with Emacs/IDLWAVE works with all bells and whistles, including
4056 routine info, completion and fast online help. Only a small amount of
4057 additional information must be specified in your @file{.emacs} file:
4058 the path names which, on a UNIX system, are automatically gathered by
4059 talking to the IDL program.
4060
4061 Here is an example of the additional configuration needed for a Windows
4062 system. I am assuming that IDLWAVE has been installed in
4063 @w{@samp{C:\Program Files\IDLWAVE}} and that IDL is installed in
4064 @w{@samp{C:\RSI\IDL62}}.
4065
4066 @lisp
4067 ;; location of the lisp files (only needed if IDLWAVE is not part of
4068 ;; your default X/Emacs installation)
4069 (setq load-path (cons "c:/program files/IDLWAVE" load-path))
4070
4071 ;; The location of the IDL library directories, both standard, and your own.
4072 ;; note that the initial "+" expands the path recursively
4073 (setq idlwave-library-path
4074 '("+c:/RSI/IDL55/lib/" "+c:/path/to/my/idllibs" ))
4075
4076 ;; location of the IDL system directory (try "print,!DIR")
4077 (setq idlwave-system-directory "c:/RSI/IDL62/")
4078
4079 @end lisp
4080
4081 @noindent Furthermore, Windows sometimes tries to outsmart you --- make
4082 sure you check the following things:
4083
4084 @itemize @bullet
4085 @item When you download the IDLWAVE distribution, make sure you save the
4086 file under the names @file{idlwave.tar.gz}.
4087 @item M-TAB switches among running programs --- use Esc-TAB
4088 instead.
4089 @item Other issues as yet unnamed...
4090 @end itemize
4091
4092 Windows users who'd like to make use of IDLWAVE's context-aware HTML
4093 help can skip the browser and use the HTMLHelp functionality directly.
4094 @xref{Help with HTML Documentation}.
4095
4096 @html
4097 <A NAME="TROUBLE"></A>
4098 @end html
4099 @node Troubleshooting, Index, Windows and MacOS, Top
4100 @appendix Troubleshooting
4101 @cindex Troubleshooting
4102
4103 Although IDLWAVE usually installs and works without difficulty, a few
4104 common problems and their solutions are documented below.
4105
4106 @enumerate
4107
4108 @item @strong{Whenever an IDL error occurs or a breakpoint is hit, I get
4109 errors or strange behavior when I try to type anything into some of my
4110 IDLWAVE buffers.}
4111
4112 This is a @emph{feature}, not an error. You're in @emph{Electric
4113 Debug Mode} (@pxref{Electric Debug Mode}). You should see
4114 @code{*Debugging*} in the mode-line. The buffer is read-only and all
4115 debugging and examination commands are available as single keystrokes;
4116 @kbd{C-?} lists these shortcuts. Use @kbd{q} to quit the mode, and
4117 customize the variable @code{idlwave-shell-automatic-electric-debug}
4118 if you prefer not to enter electric debug on breakpoints@dots{} but
4119 you really should try it before you disable it! You can also
4120 customize this variable to enter debug mode when errors are
4121 encountered.
4122
4123 @item @strong{I get errors like @samp{Searching for program: no such
4124 file or directory, idl} when attempting to start the IDL shell.}
4125
4126 IDLWAVE needs to know where IDL is in order to run it as a process.
4127 By default, it attempts to invoke it simply as @samp{idl}, which
4128 presumes such an executable is on your search path. You need to
4129 ensure @samp{idl} is on your @samp{$PATH}, or specify the full
4130 pathname to the idl program with the variable
4131 @code{idlwave-shell-explicit-file-name}. Note that you may need to
4132 set your shell search path in two places when running Emacs as an Aqua
4133 application with MacOSX; see the next topic.
4134
4135 @item @strong{IDLWAVE is disregarding my @samp{IDL_PATH} which I set
4136 under MacOSX}
4137
4138 If you run Emacs directly as an Aqua application, rather than from the
4139 console shell, the environment is set not from your usual shell
4140 configuration files (e.g. @file{.cshrc}), but from the file
4141 @file{~/.MacOSX/environment.plist}. Either include your path settings
4142 there, or start Emacs and IDLWAVE from the shell.
4143
4144 @item @strong{I get errors like @samp{Symbol's function is void:
4145 overlayp}}
4146
4147 You don't have the @samp{fsf-compat} package installed, which IDLWAVE
4148 needs to run under XEmacs. Install it, or find an XEmacs distribution
4149 which includes it by default.
4150
4151 @item @strong{I'm getting errors like @samp{Symbol's value as variable is void:
4152 cl-builtin-gethash} on completion or routine info.}
4153
4154 This error arises if you upgraded Emacs from 20.x to 21.x without
4155 re-installing IDLWAVE. Old Emacs and new Emacs are not byte-compatible
4156 in compiled lisp files. Presumably, you kept the original .elc files in
4157 place, and this is the source of the error. If you recompile (or just
4158 "make; make install") from source, it should resolve this problem.
4159 Another option is to recompile the @file{idlw*.el} files by hand using
4160 @kbd{M-x byte-compile-file}.
4161
4162 @item @strong{@kbd{M-@key{TAB}} doesn't complete words, it switches
4163 windows on my desktop.}
4164
4165 Your system is trapping @kbd{M-@key{TAB}} and using it for its own
4166 nefarious purposes: Emacs never sees the keystrokes. On many Unix
4167 systems, you can reconfigure your window manager to use another key
4168 sequence for switching among windows. Another option is to use the
4169 equivalent sequence @kbd{@key{ESC}-@key{TAB}}.
4170
4171 @item @strong{When stopping at breakpoints or errors, IDLWAVE does not
4172 seem to highlight the relevant line in the source.}
4173
4174 IDLWAVE scans for error and halt messages and highlights the stop
4175 location in the correct file. However, if you've changed the system
4176 variable @samp{!ERROR_STATE.MSG_PREFIX}, it is unable to parse these
4177 message correctly. Don't do that.
4178
4179 @item @strong{IDLWAVE doesn't work correctly when using ENVI.}
4180
4181 Though IDLWAVE was not written with ENVI in mind, it works just fine
4182 with it, as long as you update the prompt it's looking for (@samp{IDL>
4183 } by default). You can do this with the variable
4184 @code{idlwave-shell-prompt-pattern} (@pxref{Starting the Shell}), e.g.,
4185 in your @file{.emacs}:
4186
4187 @lisp
4188 (setq idlwave-shell-prompt-pattern "^\r? ?\\(ENVI\\|IDL\\)> ")
4189 @end lisp
4190
4191 @item @strong{Attempts to set breakpoints fail: no breakpoint is
4192 indicated in the IDLWAVE buffer.}
4193
4194 IDL changed its breakpoint reporting format starting with IDLv5.5. The
4195 first version of IDLWAVE to support the new format is IDLWAVE v4.10. If
4196 you have an older version and are using IDL >v5.5, you need to upgrade,
4197 and/or make sure your recent version of IDLWAVE is being found on the
4198 Emacs load-path (see the next entry). You can list the version being
4199 used with @kbd{C-h v idlwave-mode-version @key{RET}}.
4200
4201 @item @strong{I installed a new version of IDLWAVE, but the old
4202 version is still being used} or @strong{IDLWAVE works, but when I
4203 tried to install the optional modules @file{idlw-roprompt.el} or
4204 @file{idlw-complete-structtag}, I get errors like @samp{Cannot open
4205 load file}}.
4206
4207 The problem is that your Emacs is not finding the version of IDLWAVE you
4208 installed. Many Emacsen come with an older bundled copy of IDLWAVE
4209 (e.g. v4.7 for Emacs 21.x), which is likely what's being used instead.
4210 You need to make sure your Emacs @emph{load-path} contains the directory
4211 where IDLWAVE is installed (@file{/usr/local/share/emacs/site-lisp}, by
4212 default), @emph{before} Emacs' default search directories. You can
4213 accomplish this by putting the following in your @file{.emacs}:
4214
4215 @lisp
4216 (setq load-path (cons "/usr/local/share/emacs/site-lisp" load-path))
4217 @end lisp
4218
4219 @noindent You can check on your load-path value using @kbd{C-h v
4220 load-path @key{RET}}, and @kbd{C-h m} in an IDLWAVE buffer should show
4221 you the version Emacs is using.
4222
4223 @item @strong{IDLWAVE is screwing up the formatting of my @file{.idl} files.}
4224
4225 Actually, this isn't IDLWAVE at all, but @samp{idl-mode}, an unrelated
4226 programming mode for CORBA's Interface Definition Language (you should
4227 see @samp{(IDL)}, not @samp{(IDLWAVE)} in the mode-line). One
4228 solution: don't name your file @file{.idl}, but rather @file{.pro}.
4229 Another solution: make sure @file{.idl} files load IDLWAVE instead of
4230 @samp{idl-mode} by adding the following to your @file{.emacs}:
4231
4232 @lisp
4233 (setcdr (rassoc 'idl-mode auto-mode-alist) 'idlwave-mode)
4234 @end lisp
4235
4236 @item @strong{The routine info for my local routines is out of date!}
4237
4238 IDLWAVE collects routine info from various locations (@pxref{Routine
4239 Information Sources}). Routines in files visited in a buffer or
4240 compiled in the shell should be up to date. For other routines, the
4241 information is only as current as the most recent scan. If you have a
4242 rapidly changing set of routines, and you'd like the latest routine
4243 information to be available for it, one powerful technique is to make
4244 use of the library catalog tool, @samp{idlwave_catalog}. Simply add a
4245 line to your @samp{cron} file (@samp{crontab -e} will let you edit this
4246 on some systems), like this
4247
4248 @example
4249 45 3 * * 1-5 (cd /path/to/myidllib; /path/to/idlwave_catalog MyLib)
4250 @end example
4251
4252 @noindent where @samp{MyLib} is the name of your library. This will
4253 rescan all @file{.pro} files at or below @file{/path/to/myidllib} every
4254 week night at 3:45am. You can even scan site-wide libraries with this
4255 method, and the most recent information will be available to all users.
4256 Since the scanning is very fast, there is very little impact.
4257
4258 @item @strong{All the Greek-font characters in the HTML help are
4259 displayed as Latin characters!}
4260
4261 Unfortunately, the HTMLHelp files RSI provides attempt to switch to
4262 @samp{Symbol} font to display Greek characters, which is not really an
4263 permitted method for doing this in HTML. There is a "workaround" for
4264 some browsers: @xref{HTML Help Browser Tips}.
4265
4266 @item @strong{In the shell, my long commands are truncated at 256 characters!}
4267
4268 This actually happens when running IDL in an XTerm as well. There are
4269 a couple of work arounds: @code{define_key,/control,'^d'} (e.g. in
4270 your @file{$IDL_STARTUP} file) will disable the @samp{EOF} character
4271 and give you a 512 character limit. You won't be able to use
4272 @key{C-d} to quit the shell, however. Another possibility is
4273 @code{!EDIT_INPUT=0}, which gives you an @emph{infinite} limit (OK, a
4274 memory-bounded limit), but disables the processing of background
4275 widget events (those with @code{/NO_BLOCK} passed to @code{XManager}).
4276
4277 @item @strong{When I invoke IDL HTML help on a routine, the page which
4278 is loaded is one page off, e.g. for @code{CONVERT_COORD}, I get
4279 @code{CONTOUR}.}
4280
4281 You have a mismatch between your help index and the HTML help package
4282 you downloaded. You need to ensure you download a ``downgrade kit'' if
4283 you are using anything older than the latest HTML help package. A new
4284 help package apppears with each IDL release (assuming the documentation
4285 is updated).
4286 Starting with IDL 6.2, the HTML help and its catalog are
4287 distributed with IDL, and so should never be inconsistent.
4288
4289 @item @strong{I get errors such as @samp{void-variable
4290 browse-url-browser-function} or similar when attempting to load IDLWAVE
4291 under XEmacs.}
4292
4293 You don't have the @samp{browse-url} (or other required) XEmacs package.
4294 Unlike GNU Emacs, XEmacs distributes many packages separately from the
4295 main program. IDLWAVE is actually among these, but is not always the
4296 most up to date. When installing IDLWAVE as an XEmacs package, it
4297 should prompt you for required additional packages. When installing it
4298 from source, it won't and you'll get this error. The easiest solution
4299 is to install all the packages when you install XEmacs (the so-called
4300 @samp{sumo} bundle). The minimum set of XEmacs packages required by
4301 IDLWAVE is @samp{fsf-compat, xemacs-base, mail-lib}.
4302
4303 @end enumerate
4304
4305 @node Index, , Troubleshooting, Top
4306 @unnumbered Index
4307 @printindex cp
4308
4309 @bye
4310
4311 @ignore
4312 arch-tag: f1d73958-1423-4127-b8aa-f7b953d64492
4313 @end ignore