aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ.D. Smith2002-09-12 17:24:53 +0000
committerJ.D. Smith2002-09-12 17:24:53 +0000
commit76959b779646d9113e87335d0781837610ffd2d8 (patch)
tree0c7418dbfb6cc23c24a8f9fca09ae06dd4d56f37
parentdd6478be6ac27039a3710260e00f6db79c262aed (diff)
downloademacs-76959b779646d9113e87335d0781837610ffd2d8.tar.gz
emacs-76959b779646d9113e87335d0781837610ffd2d8.zip
Updated to IDLWAVE version 4.15. See idlwave.org.
-rw-r--r--lisp/progmodes/idlw-rinfo.el124
-rw-r--r--lisp/progmodes/idlw-shell.el751
-rw-r--r--lisp/progmodes/idlw-toolbar.el2
-rw-r--r--lisp/progmodes/idlwave.el553
-rw-r--r--man/idlwave.texi484
5 files changed, 1161 insertions, 753 deletions
diff --git a/lisp/progmodes/idlw-rinfo.el b/lisp/progmodes/idlw-rinfo.el
index cacafda2106..b44e0d0210e 100644
--- a/lisp/progmodes/idlw-rinfo.el
+++ b/lisp/progmodes/idlw-rinfo.el
@@ -4,7 +4,7 @@
4 4
5;; Author: Carsten Dominik <dominik@astro.uva.nl> 5;; Author: Carsten Dominik <dominik@astro.uva.nl>
6;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu> 6;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
7;; Version: 4.14 7;; Version: 4.15
8;; Keywords: languages 8;; Keywords: languages
9 9
10;; This file is part of GNU Emacs. 10;; This file is part of GNU Emacs.
@@ -31,7 +31,7 @@
31;; information is extracted automatically from the IDL documentation 31;; information is extracted automatically from the IDL documentation
32;; and by talking to IDL. 32;; and by talking to IDL.
33;; 33;;
34;; Created by get_rinfo on Wed May 22 16:40:34 2002 34;; Created by get_rinfo on Tue Sep 10 09:15:48 2002
35;; IDL version: 5.5 35;; IDL version: 5.5
36;; Number of files scanned: 6 36;; Number of files scanned: 6
37;; 943 syntax entries in file refguide.txt 37;; 943 syntax entries in file refguide.txt
@@ -41,9 +41,9 @@
41;; 45 syntax entries in file obsolete.txt 41;; 45 syntax entries in file obsolete.txt
42;; 38 syntax entries in file whatsnew55.txt 42;; 38 syntax entries in file whatsnew55.txt
43;; Number of routines found: 1324 43;; Number of routines found: 1324
44;; Number of keywords found: 5958 44;; Number of keywords found: 6129
45;; 45;;
46;; Fixed up documentation with file: ./help55fixup.txt 46;; Fixed up documentation with file: help55fixup.txt
47;; 93 total fix matches. 47;; 93 total fix matches.
48; 48;
49;; New versions of IDLWAVE, documentation, and more information 49;; New versions of IDLWAVE, documentation, and more information
@@ -62,7 +62,7 @@
62 ("BLAS_AXPY" pro nil (system) "%s, Y, A, X [, D1, Loc1 [, D2, Range]]" nil) 62 ("BLAS_AXPY" pro nil (system) "%s, Y, A, X [, D1, Loc1 [, D2, Range]]" nil)
63 ("BOX_CURSOR" pro nil (system) "%s, [ X0, Y0, NX, NY]" (("FIXED_SIZE") ("INIT") ("MESSAGE"))) 63 ("BOX_CURSOR" pro nil (system) "%s, [ X0, Y0, NX, NY]" (("FIXED_SIZE") ("INIT") ("MESSAGE")))
64 ("BREAKPOINT" pro nil (system) "%s [, File], Index" (("AFTER") ("CLEAR") ("CONDITION") ("DISABLE") ("ENABLE") ("ON_RECOMPILE") ("ONCE") ("SET"))) 64 ("BREAKPOINT" pro nil (system) "%s [, File], Index" (("AFTER") ("CLEAR") ("CONDITION") ("DISABLE") ("ENABLE") ("ON_RECOMPILE") ("ONCE") ("SET")))
65 ("BYTEORDER" pro nil (system) "%s, Variable1, ..., Variablen" (("DTOGFLOAT") ("DTOVAX") ("DTOXDR") ("FTOVAX") ("FTOXDR") ("GFLOATTOD") ("HTONL") ("HTONS") ("L64SWAP") ("LSWAP") ("NTOHL") ("NTOHS") ("SSWAP") ("SWAP_IF_BIG_ENDIAN") ("SWAP_IF_LITTLE_ENDIAN") ("VAXTOD") ("VAXTOF") ("XDRTOD") ("XDRTOF"))) 65 ("BYTEORDER" pro nil (system) "%s, Variable1, ..., Variablen" (("DTOGFLOAT") ("DTOVAX") ("DTOXDR") ("FTOVAX") ("FTOXDR") ("GFLOATTOD") ("HTONL") ("HTONS") ("L64SWAP") ("LSWAP") ("NTOHL") ("NTOHS") ("SSWAP") ("SWAP_IF_BIG_ENDIAN") ("SWAP_IF_LITTLE_ENDIAN") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD") ("VAXTOD") ("VAXTOF") ("XDRTOD") ("XDRTOF")))
66 ("CALDAT" pro nil (system) "%s, Julian, Month [, Day [, Year [, Hour [, Minute [, Second]]]]]" nil) 66 ("CALDAT" pro nil (system) "%s, Julian, Month [, Day [, Year [, Hour [, Minute [, Second]]]]]" nil)
67 ("CALENDAR" pro nil (system) "%s [[, Month] , Year]" nil) 67 ("CALENDAR" pro nil (system) "%s [[, Month] , Year]" nil)
68 ("CALL_METHOD" pro nil (system) "%s, Name, ObjRef, [, P1, ..., Pn]" nil) 68 ("CALL_METHOD" pro nil (system) "%s, Name, ObjRef, [, P1, ..., Pn]" nil)
@@ -372,7 +372,7 @@
372 ("TV" pro nil (system) "%s, Image [, Position] or TV, Image [, X, Y [, Channel]]" (("CENTIMETERS") ("CHANNEL") ("DATA") ("DEVICE") ("INCHES") ("NORMAL") ("ORDER") ("T3D") ("TRUE") ("WORDS") ("XSIZE") ("YSIZE") ("Z"))) 372 ("TV" pro nil (system) "%s, Image [, Position] or TV, Image [, X, Y [, Channel]]" (("CENTIMETERS") ("CHANNEL") ("DATA") ("DEVICE") ("INCHES") ("NORMAL") ("ORDER") ("T3D") ("TRUE") ("WORDS") ("XSIZE") ("YSIZE") ("Z")))
373 ("TVCRS" pro nil (system) "%s [, ON_OFF] or TVCRS [, X, Y]" (("CENTIMETERS") ("DATA") ("DEVICE") ("HIDE_CURSOR") ("INCHES") ("NORMAL") ("T3D") ("Z"))) 373 ("TVCRS" pro nil (system) "%s [, ON_OFF] or TVCRS [, X, Y]" (("CENTIMETERS") ("DATA") ("DEVICE") ("HIDE_CURSOR") ("INCHES") ("NORMAL") ("T3D") ("Z")))
374 ("TVLCT" pro nil (system) "%s, V1, V2, V3 [, Start]" (("GET") ("HLS") ("HSV"))) 374 ("TVLCT" pro nil (system) "%s, V1, V2, V3 [, Start]" (("GET") ("HLS") ("HSV")))
375 ("TVSCL" pro nil (system) "%s, Image [, Position] or TVSCL, Image [, X, Y [, Channel]]" (("CENTIMETERS") ("CHANNEL") ("DATA") ("DEVICE") ("INCHES") ("NAN") ("NORMAL") ("ORDER") ("T3D") ("TOP") ("TRUE") ("WORDS") ("XSIZE") ("YSIZE") ("Z"))) 375 ("TVSCL" pro nil (system) "%s, Image [, Position] or TVSCL, Image [, X, Y [, Channel]]" (("CENTIMETERS") ("CHANNEL") ("DATA") ("DEVICE") ("INCHES") ("NAN") ("NORMAL") ("ORDER") ("T3D") ("TOP") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD") ("TRUE") ("WORDS") ("XSIZE") ("YSIZE") ("Z")))
376 ("USERSYM" pro nil (system) "%s, X [, Y]" (("COLOR") ("FILL") ("THICK"))) 376 ("USERSYM" pro nil (system) "%s, X [, Y]" (("COLOR") ("FILL") ("THICK")))
377 ("VECTOR_FIELD" pro nil (system) "%s, Field, Outverts, Outconn" (("ANISOTROPY") ("SCALE") ("VERTICES"))) 377 ("VECTOR_FIELD" pro nil (system) "%s, Field, Outverts, Outconn" (("ANISOTROPY") ("SCALE") ("VERTICES")))
378 ("VEL" pro nil (system) "%s, U, V" (("LENGTH") ("NSTEPS") ("NVECS") ("TITLE") ("XMAX"))) 378 ("VEL" pro nil (system) "%s, U, V" (("LENGTH") ("NSTEPS") ("NVECS") ("TITLE") ("XMAX")))
@@ -425,18 +425,18 @@
425 ("ZOOM" pro nil (system) "%s" (("CONTINUOUS") ("FACT") ("INTERP") ("KEEP") ("NEW_WINDOW") ("XSIZE") ("YSIZE") ("ZOOM_WINDOW"))) 425 ("ZOOM" pro nil (system) "%s" (("CONTINUOUS") ("FACT") ("INTERP") ("KEEP") ("NEW_WINDOW") ("XSIZE") ("YSIZE") ("ZOOM_WINDOW")))
426 ("ZOOM_24" pro nil (system) "%s" (("FACT") ("RIGHT") ("XSIZE") ("YSIZE"))) 426 ("ZOOM_24" pro nil (system) "%s" (("FACT") ("RIGHT") ("XSIZE") ("YSIZE")))
427 ("A_CORRELATE" fun nil (system) "Result = %s(X, Lag)" (("COVARIANCE") ("DOUBLE"))) 427 ("A_CORRELATE" fun nil (system) "Result = %s(X, Lag)" (("COVARIANCE") ("DOUBLE")))
428 ("ABS" fun nil (system) "Result = %s(X)" nil) 428 ("ABS" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
429 ("ACOS" fun nil (system) "Result = %s(X)" nil) 429 ("ACOS" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
430 ("ADAPT_HIST_EQUAL" fun nil (system) "Result = %s (Image)" (("CLIP") ("FCN") ("NREGIONS") ("TOP"))) 430 ("ADAPT_HIST_EQUAL" fun nil (system) "Result = %s (Image)" (("CLIP") ("FCN") ("NREGIONS") ("TOP")))
431 ("ALOG" fun nil (system) "Result = %s(X)" nil) 431 ("ALOG" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
432 ("ALOG10" fun nil (system) "Result = %s(X)" nil) 432 ("ALOG10" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
433 ("AMOEBA" fun nil (system) "Result = %s( Ftol)" (("FUNCTION_NAME") ("FUNCTION_VALUE") ("NCALLS") ("NMAX") ("P0") ("SCALE") ("SIMPLEX"))) 433 ("AMOEBA" fun nil (system) "Result = %s( Ftol)" (("FUNCTION_NAME") ("FUNCTION_VALUE") ("NCALLS") ("NMAX") ("P0") ("SCALE") ("SIMPLEX")))
434 ("ARG_PRESENT" fun nil (system) "Result = %s(Variable)" nil) 434 ("ARG_PRESENT" fun nil (system) "Result = %s(Variable)" nil)
435 ("ARRAY_EQUAL" fun nil (system) "Result = %s( Op1 , Op2)" (("NO_TYPECONV"))) 435 ("ARRAY_EQUAL" fun nil (system) "Result = %s( Op1 , Op2)" (("NO_TYPECONV")))
436 ("ASCII_TEMPLATE" fun nil (system) "Result = %s( [Filename])" (("BROWSE_LINES") ("CANCEL") ("GROUP"))) 436 ("ASCII_TEMPLATE" fun nil (system) "Result = %s( [Filename])" (("BROWSE_LINES") ("CANCEL") ("GROUP")))
437 ("ASIN" fun nil (system) "Result = %s(X)" nil) 437 ("ASIN" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
438 ("ASSOC" fun nil (system) "Result = %s( Unit, Array_Structure [, Offset])" (("PACKED"))) 438 ("ASSOC" fun nil (system) "Result = %s( Unit, Array_Structure [, Offset])" (("PACKED")))
439 ("ATAN" fun nil (system) "Result = %s([Y,] X)" nil) 439 ("ATAN" fun nil (system) "Result = %s([Y,] X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
440 ("BESELI" fun nil (system) "Result = %s(X, N)" nil) 440 ("BESELI" fun nil (system) "Result = %s(X, N)" nil)
441 ("BESELJ" fun nil (system) "Result = %s(X, N)" nil) 441 ("BESELJ" fun nil (system) "Result = %s(X, N)" nil)
442 ("BESELK" fun nil (system) "Result = %s( X, N )" nil) 442 ("BESELK" fun nil (system) "Result = %s( X, N )" nil)
@@ -445,13 +445,13 @@
445 ("BILINEAR" fun nil (system) "Result = %s(P, IX, JY)" nil) 445 ("BILINEAR" fun nil (system) "Result = %s(P, IX, JY)" nil)
446 ("BIN_DATE" fun nil (system) "Result = %s(Ascii_Time)" nil) 446 ("BIN_DATE" fun nil (system) "Result = %s(Ascii_Time)" nil)
447 ("BINARY_TEMPLATE" fun nil (system) "Template = %s ( [Filename])" (("CANCEL") ("GROUP") ("N_ROWS") ("TEMPLATE"))) 447 ("BINARY_TEMPLATE" fun nil (system) "Template = %s ( [Filename])" (("CANCEL") ("GROUP") ("N_ROWS") ("TEMPLATE")))
448 ("BINDGEN" fun nil (system) "Result = %s(D1, ...,D8)" nil) 448 ("BINDGEN" fun nil (system) "Result = %s(D1, ...,D8)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
449 ("BINOMIAL" fun nil (system) "Result = %s(V, N, P)" (("DOUBLE") ("GAUSSIAN"))) 449 ("BINOMIAL" fun nil (system) "Result = %s(V, N, P)" (("DOUBLE") ("GAUSSIAN")))
450 ("BLK_CON" fun nil (system) "Result = %s( Filter, Signal)" (("B_LENGTH") ("DOUBLE"))) 450 ("BLK_CON" fun nil (system) "Result = %s( Filter, Signal)" (("B_LENGTH") ("DOUBLE")))
451 ("BROYDEN" fun nil (system) "Result = %s( X, Vecfunc)" (("CHECK") ("DOUBLE") ("EPS") ("ITMAX") ("STEPMAX") ("TOLF") ("TOLMIN") ("TOLX"))) 451 ("BROYDEN" fun nil (system) "Result = %s( X, Vecfunc)" (("CHECK") ("DOUBLE") ("EPS") ("ITMAX") ("STEPMAX") ("TOLF") ("TOLMIN") ("TOLX")))
452 ("BYTARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO"))) 452 ("BYTARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
453 ("BYTE" fun nil (system) "Result = %s( Expression[, Offset [, Dim1, ..., Dim8]] )" nil) 453 ("BYTE" fun nil (system) "Result = %s( Expression[, Offset [, Dim1, ..., Dim8]] )" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
454 ("BYTSCL" fun nil (system) "Result = %s( Array)" (("MAX") ("MIN") ("NAN") ("TOP"))) 454 ("BYTSCL" fun nil (system) "Result = %s( Array)" (("MAX") ("MIN") ("NAN") ("TOP") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
455 ("C_CORRELATE" fun nil (system) "Result = %s( X, Y, Lag)" (("COVARIANCE") ("DOUBLE"))) 455 ("C_CORRELATE" fun nil (system) "Result = %s( X, Y, Lag)" (("COVARIANCE") ("DOUBLE")))
456 ("CALL_EXTERNAL" fun nil (system) "Result = %s(Image, Entry [, P0, ..., PN-1])" (("ALL_VALUE") ("AUTOGLUE") ("B_VALUE") ("CC") ("CDECL") ("COMPILE_DIRECTORY") ("D_VALUE") ("DEFAULT") ("EXTRA_CFLAGS") ("EXTRA_LFLAGS") ("F_VALUE") ("I_VALUE") ("IGNORE_EXISTING_GLUE") ("L64_VALUE") ("LD") ("NOCLEANUP") ("PORTABLE") ("RETURN_TYPE") ("S_VALUE") ("SHOW_ALL_OUTPUT") ("UI_VALUE") ("UL64_VALUE") ("UL_VALUE") ("UNLOAD") ("VALUE") ("VAX_FLOAT") ("VERBOSE") ("WRITE_WRAPPER"))) 456 ("CALL_EXTERNAL" fun nil (system) "Result = %s(Image, Entry [, P0, ..., PN-1])" (("ALL_VALUE") ("AUTOGLUE") ("B_VALUE") ("CC") ("CDECL") ("COMPILE_DIRECTORY") ("D_VALUE") ("DEFAULT") ("EXTRA_CFLAGS") ("EXTRA_LFLAGS") ("F_VALUE") ("I_VALUE") ("IGNORE_EXISTING_GLUE") ("L64_VALUE") ("LD") ("NOCLEANUP") ("PORTABLE") ("RETURN_TYPE") ("S_VALUE") ("SHOW_ALL_OUTPUT") ("UI_VALUE") ("UL64_VALUE") ("UL_VALUE") ("UNLOAD") ("VALUE") ("VAX_FLOAT") ("VERBOSE") ("WRITE_WRAPPER")))
457 ("CALL_FUNCTION" fun nil (system) "Result = %s(Name [, P1, ..., Pn])" nil) 457 ("CALL_FUNCTION" fun nil (system) "Result = %s(Name [, P1, ..., Pn])" nil)
@@ -469,30 +469,30 @@
469 ("CDF_VARCREATE" fun nil (system) "Result = %s( Id, Name [, DimVary])" (("ALLOCATERECS") ("CDF_BYTE") ("CDF_CHAR") ("CDF_DOUBLE") ("CDF_EPOCH") ("CDF_FLOAT") ("CDF_INT1") ("CDF_INT2") ("CDF_INT4") ("CDF_REAL4") ("CDF_REAL8") ("CDF_UCHAR") ("CDF_UINT1") ("CDF_UINT2") ("CDF_UINT4") ("DIMENSIONS") ("NUMELEM") ("REC_NOVARY") ("REC_VARY") ("ZVARIABLE"))) 469 ("CDF_VARCREATE" fun nil (system) "Result = %s( Id, Name [, DimVary])" (("ALLOCATERECS") ("CDF_BYTE") ("CDF_CHAR") ("CDF_DOUBLE") ("CDF_EPOCH") ("CDF_FLOAT") ("CDF_INT1") ("CDF_INT2") ("CDF_INT4") ("CDF_REAL4") ("CDF_REAL8") ("CDF_UCHAR") ("CDF_UINT1") ("CDF_UINT2") ("CDF_UINT4") ("DIMENSIONS") ("NUMELEM") ("REC_NOVARY") ("REC_VARY") ("ZVARIABLE")))
470 ("CDF_VARINQ" fun nil (system) "Result = %s( Id, Variable)" (("ZVARIABLE"))) 470 ("CDF_VARINQ" fun nil (system) "Result = %s( Id, Variable)" (("ZVARIABLE")))
471 ("CDF_VARNUM" fun nil (system) "Result = %s( Id, VarName [, IsZVar] )" nil) 471 ("CDF_VARNUM" fun nil (system) "Result = %s( Id, VarName [, IsZVar] )" nil)
472 ("CEIL" fun nil (system) "Result = %s(X)" (("L64"))) 472 ("CEIL" fun nil (system) "Result = %s(X)" (("L64") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
473 ("CHEBYSHEV" fun nil (system) "Result = %s(D, N)" nil) 473 ("CHEBYSHEV" fun nil (system) "Result = %s(D, N)" nil)
474 ("CHECK_MATH" fun nil (system) "Result = %s()" (("MASK") ("NOCLEAR") ("PRINT"))) 474 ("CHECK_MATH" fun nil (system) "Result = %s()" (("MASK") ("NOCLEAR") ("PRINT")))
475 ("CHISQR_CVF" fun nil (system) "Result = %s(P, Df)" nil) 475 ("CHISQR_CVF" fun nil (system) "Result = %s(P, Df)" nil)
476 ("CHISQR_PDF" fun nil (system) "Result = %s(V, Df)" nil) 476 ("CHISQR_PDF" fun nil (system) "Result = %s(V, Df)" nil)
477 ("CHOLSOL" fun nil (system) "Result = %s( A, P, B)" (("DOUBLE"))) 477 ("CHOLSOL" fun nil (system) "Result = %s( A, P, B)" (("DOUBLE")))
478 ("CINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" nil) 478 ("CINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
479 ("CLUST_WTS" fun nil (system) "Result = %s( Array)" (("DOUBLE") ("N_CLUSTERS") ("N_ITERATIONS") ("VARIABLE_WTS"))) 479 ("CLUST_WTS" fun nil (system) "Result = %s( Array)" (("DOUBLE") ("N_CLUSTERS") ("N_ITERATIONS") ("VARIABLE_WTS")))
480 ("CLUSTER" fun nil (system) "Result = %s( Array, Weights)" (("DOUBLE") ("N_CLUSTERS"))) 480 ("CLUSTER" fun nil (system) "Result = %s( Array, Weights)" (("DOUBLE") ("N_CLUSTERS")))
481 ("COLOR_QUAN" fun nil (system) "Result = %s( Image_R, Image_G, Image_B, R, G, B) or Result = COLOR_QUAN( Image, Dim, R, G, B )" (("COLORS") ("CUBE") ("DITHER") ("ERROR") ("GET_TRANSLATION") ("MAP_ALL") ("TRANSLATION"))) 481 ("COLOR_QUAN" fun nil (system) "Result = %s( Image_R, Image_G, Image_B, R, G, B) or Result = COLOR_QUAN( Image, Dim, R, G, B )" (("COLORS") ("CUBE") ("DITHER") ("ERROR") ("GET_TRANSLATION") ("MAP_ALL") ("TRANSLATION")))
482 ("COLORMAP_APPLICABLE" fun nil (system) "Result = %s( redrawRequired )" nil) 482 ("COLORMAP_APPLICABLE" fun nil (system) "Result = %s( redrawRequired )" nil)
483 ("COMFIT" fun nil (system) "Result = %s( X, Y, A)" (("EXPONENTIAL") ("GEOMETRIC") ("GOMPERTZ") ("HYPERBOLIC") ("LOGISTIC") ("LOGSQUARE") ("SIGMA") ("WEIGHTS") ("YFIT"))) 483 ("COMFIT" fun nil (system) "Result = %s( X, Y, A)" (("EXPONENTIAL") ("GEOMETRIC") ("GOMPERTZ") ("HYPERBOLIC") ("LOGISTIC") ("LOGSQUARE") ("SIGMA") ("WEIGHTS") ("YFIT")))
484 ("COMPLEX" fun nil (system) "Result = %s( Real [, Imaginary] ) or Result = COMPLEX(Expression, Offset, Dim1 [, ..., Dim8])" (("DOUBLE"))) 484 ("COMPLEX" fun nil (system) "Result = %s( Real [, Imaginary] ) or Result = COMPLEX(Expression, Offset, Dim1 [, ..., Dim8])" (("DOUBLE") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
485 ("COMPLEXARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO"))) 485 ("COMPLEXARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
486 ("COMPLEXROUND" fun nil (system) "Result = %s(Input)" nil) 486 ("COMPLEXROUND" fun nil (system) "Result = %s(Input)" nil)
487 ("COMPUTE_MESH_NORMALS" fun nil (system) "Result = %s( fVerts[, iConn] )" nil) 487 ("COMPUTE_MESH_NORMALS" fun nil (system) "Result = %s( fVerts[, iConn] )" nil)
488 ("COND" fun nil (system) "Result = %s( A)" (("DOUBLE") ("LNORM"))) 488 ("COND" fun nil (system) "Result = %s( A)" (("DOUBLE") ("LNORM")))
489 ("CONGRID" fun nil (system) "Result = %s( Array, X, Y, Z)" (("CENTER") ("CUBIC") ("INTERP") ("MINUS_ONE"))) 489 ("CONGRID" fun nil (system) "Result = %s( Array, X, Y, Z)" (("CENTER") ("CUBIC") ("INTERP") ("MINUS_ONE")))
490 ("CONJ" fun nil (system) "Result = %s(X)" nil) 490 ("CONJ" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
491 ("CONVERT_COORD" fun nil (system) "Result = %s( X [, Y [, Z]])" (("DATA") ("DEVICE") ("DOUBLE") ("NORMAL") ("T3D") ("TO_DATA") ("TO_DEVICE") ("TO_NORMAL"))) 491 ("CONVERT_COORD" fun nil (system) "Result = %s( X [, Y [, Z]])" (("DATA") ("DEVICE") ("DOUBLE") ("NORMAL") ("T3D") ("TO_DATA") ("TO_DEVICE") ("TO_NORMAL")))
492 ("CONVOL" fun nil (system) "Result = %s( Array, Kernel [, Scale_Factor])" (("CENTER") ("EDGE_TRUNCATE") ("EDGE_WRAP") ("MISSING") ("NAN"))) 492 ("CONVOL" fun nil (system) "Result = %s( Array, Kernel [, Scale_Factor])" (("CENTER") ("EDGE_TRUNCATE") ("EDGE_WRAP") ("MISSING") ("NAN") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
493 ("COORD2TO3" fun nil (system) "Result = %s( Mx, My, Dim, D0 [, PTI] )" nil) 493 ("COORD2TO3" fun nil (system) "Result = %s( Mx, My, Dim, D0 [, PTI] )" nil)
494 ("CORRELATE" fun nil (system) "Result = %s( X [, Y])" (("COVARIANCE") ("DOUBLE"))) 494 ("CORRELATE" fun nil (system) "Result = %s( X [, Y])" (("COVARIANCE") ("DOUBLE")))
495 ("COS" fun nil (system) "Result = %s(X)" nil) 495 ("COS" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
496 ("COSH" fun nil (system) "Result = %s(X)" nil) 496 ("COSH" fun nil (system) "Result = %s(X)" nil)
497 ("CRAMER" fun nil (system) "Result = %s( A, B)" (("DOUBLE") ("ZERO"))) 497 ("CRAMER" fun nil (system) "Result = %s( A, B)" (("DOUBLE") ("ZERO")))
498 ("CREATE_STRUCT" fun nil (system) "Result = %s( [Tag1, Value1, ..., Tagn, Valuen] ) or Result = CREATE_STRUCT()" (("NAME"))) 498 ("CREATE_STRUCT" fun nil (system) "Result = %s( [Tag1, Value1, ..., Tagn, Valuen] ) or Result = CREATE_STRUCT()" (("NAME")))
@@ -521,8 +521,8 @@
521 ("CW_TMPL" fun nil (system) "Result = %s( Parent)" (("UNAME") ("UVALUE"))) 521 ("CW_TMPL" fun nil (system) "Result = %s( Parent)" (("UNAME") ("UVALUE")))
522 ("CW_ZOOM" fun nil (system) "Result = %s( Parent)" (("FRAME") ("MAX") ("MIN") ("RETAIN") ("SAMPLE") ("SCALE") ("TRACK") ("UNAME") ("UVALUE") ("X_SCROLL_SIZE") ("X_ZSIZE") ("XSIZE") ("Y_SCROLL_SIZE") ("Y_ZSIZE") ("YSIZE"))) 522 ("CW_ZOOM" fun nil (system) "Result = %s( Parent)" (("FRAME") ("MAX") ("MIN") ("RETAIN") ("SAMPLE") ("SCALE") ("TRACK") ("UNAME") ("UVALUE") ("X_SCROLL_SIZE") ("X_ZSIZE") ("XSIZE") ("Y_SCROLL_SIZE") ("Y_ZSIZE") ("YSIZE")))
523 ("DBLARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO"))) 523 ("DBLARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
524 ("DCINDGEN" fun nil (system) "Result = %s( D1, ..., D8 )" nil) 524 ("DCINDGEN" fun nil (system) "Result = %s( D1, ..., D8 )" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
525 ("DCOMPLEX" fun nil (system) "Result = %s( Real [, Imaginary] ) or Result = DCOMPLEX( Expression, Offset, Dim1 [, ..., Dim8] )" nil) 525 ("DCOMPLEX" fun nil (system) "Result = %s( Real [, Imaginary] ) or Result = DCOMPLEX( Expression, Offset, Dim1 [, ..., Dim8] )" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
526 ("DCOMPLEXARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO"))) 526 ("DCOMPLEXARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
527 ("DEFROI" fun nil (system) "Result = %s( Sx, Sy [, Xverts, Yverts])" (("NOFILL") ("NOREGION") ("RESTORE") ("X0") ("Y0") ("ZOOM"))) 527 ("DEFROI" fun nil (system) "Result = %s( Sx, Sy [, Xverts, Yverts])" (("NOFILL") ("NOREGION") ("RESTORE") ("X0") ("Y0") ("ZOOM")))
528 ("DEMO_MODE" fun nil (system) "Result = %s()" nil) 528 ("DEMO_MODE" fun nil (system) "Result = %s()" nil)
@@ -537,9 +537,9 @@
537 ("DIALOG_WRITE_IMAGE" fun nil (system) "Result = %s ( Image [, R, G, B])" (("DIALOG_PARENT") ("FILE") ("FIX_TYPE") ("NOWRITE") ("OPTIONS") ("PATH") ("TITLE") ("TYPE") ("WARN_EXIST"))) 537 ("DIALOG_WRITE_IMAGE" fun nil (system) "Result = %s ( Image [, R, G, B])" (("DIALOG_PARENT") ("FILE") ("FIX_TYPE") ("NOWRITE") ("OPTIONS") ("PATH") ("TITLE") ("TYPE") ("WARN_EXIST")))
538 ("DIGITAL_FILTER" fun nil (system) "Result = %s( Flow, Fhigh, A, Nterms )" nil) 538 ("DIGITAL_FILTER" fun nil (system) "Result = %s( Flow, Fhigh, A, Nterms )" nil)
539 ("DILATE" fun nil (system) "Result = %s( Image, Structure [, X0 [, Y0 [, Z0]]])" (("BACKGROUND") ("CONSTRAINED") ("GRAY") ("PRESERVE_TYPE") ("UINT") ("ULONG") ("VALUES"))) 539 ("DILATE" fun nil (system) "Result = %s( Image, Structure [, X0 [, Y0 [, Z0]]])" (("BACKGROUND") ("CONSTRAINED") ("GRAY") ("PRESERVE_TYPE") ("UINT") ("ULONG") ("VALUES")))
540 ("DINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" nil) 540 ("DINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
541 ("DIST" fun nil (system) "Result = %s(N [, M])" nil) 541 ("DIST" fun nil (system) "Result = %s(N [, M])" nil)
542 ("DOUBLE" fun nil (system) "Result = %s(Expression[, Offset [, Dim1, ..., Dimn]])" nil) 542 ("DOUBLE" fun nil (system) "Result = %s(Expression[, Offset [, Dim1, ..., Dimn]])" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
543 ("EIGENQL" fun nil (system) "Result = %s( A)" (("ABSOLUTE") ("ASCENDING") ("DOUBLE") ("EIGENVECTORS") ("OVERWRITE") ("RESIDUAL"))) 543 ("EIGENQL" fun nil (system) "Result = %s( A)" (("ABSOLUTE") ("ASCENDING") ("DOUBLE") ("EIGENVECTORS") ("OVERWRITE") ("RESIDUAL")))
544 ("EIGENVEC" fun nil (system) "Result = %s( A, Eval)" (("DOUBLE") ("ITMAX") ("RESIDUAL"))) 544 ("EIGENVEC" fun nil (system) "Result = %s( A, Eval)" (("DOUBLE") ("ITMAX") ("RESIDUAL")))
545 ("ELMHES" fun nil (system) "Result = %s( A)" (("COLUMN") ("DOUBLE") ("NO_BALANCE"))) 545 ("ELMHES" fun nil (system) "Result = %s( A)" (("COLUMN") ("DOUBLE") ("NO_BALANCE")))
@@ -677,17 +677,17 @@
677 ("ERFC" fun nil (system) "Result = %s(X)" nil) 677 ("ERFC" fun nil (system) "Result = %s(X)" nil)
678 ("ERFCX" fun nil (system) "Result = %s(X)" nil) 678 ("ERFCX" fun nil (system) "Result = %s(X)" nil)
679 ("ERODE" fun nil (system) "Result = %s( Image, Structure [, X0 [, Y0 [, Z0]]])" (("GRAY") ("PRESERVE_TYPE") ("UINT") ("ULONG") ("VALUES"))) 679 ("ERODE" fun nil (system) "Result = %s( Image, Structure [, X0 [, Y0 [, Z0]]])" (("GRAY") ("PRESERVE_TYPE") ("UINT") ("ULONG") ("VALUES")))
680 ("ERRORF" fun nil (system) "Result = %s(X)" nil) 680 ("ERRORF" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
681 ("EXECUTE" fun nil (system) "Result = %s(String [, QuietCompile])" nil) 681 ("EXECUTE" fun nil (system) "Result = %s(String [, QuietCompile])" nil)
682 ("EXP" fun nil (system) "Result = %s(Expression)" nil) 682 ("EXP" fun nil (system) "Result = %s(Expression)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
683 ("EXPAND_PATH" fun nil (system) "Result = %s( String)" (("ALL_DIRS") ("ARRAY") ("COUNT") ("DLM") ("HELP"))) 683 ("EXPAND_PATH" fun nil (system) "Result = %s( String)" (("ALL_DIRS") ("ARRAY") ("COUNT") ("DLM") ("HELP")))
684 ("EXPINT" fun nil (system) "Result = %s( N, X)" (("DOUBLE") ("EPS") ("ITMAX"))) 684 ("EXPINT" fun nil (system) "Result = %s( N, X)" (("DOUBLE") ("EPS") ("ITMAX") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
685 ("EXTRAC" fun nil (system) "Result = %s( Array, C1, C2, ..., Cn, S1, S2, ..., Sn )" nil) 685 ("EXTRAC" fun nil (system) "Result = %s( Array, C1, C2, ..., Cn, S1, S2, ..., Sn )" nil)
686 ("EXTRACT_SLICE" fun nil (system) "Result = %s( Vol, Xsize, Ysize, Xcenter, Ycenter, Zcenter, Xrot, Yrot, Zrot)" (("ANISOTROPY") ("CUBIC") ("OUT_VAL") ("RADIANS") ("SAMPLE") ("VERTICES"))) 686 ("EXTRACT_SLICE" fun nil (system) "Result = %s( Vol, Xsize, Ysize, Xcenter, Ycenter, Zcenter, Xrot, Yrot, Zrot)" (("ANISOTROPY") ("CUBIC") ("OUT_VAL") ("RADIANS") ("SAMPLE") ("VERTICES")))
687 ("F_CVF" fun nil (system) "Result = %s(P, Dfn, Dfd)" nil) 687 ("F_CVF" fun nil (system) "Result = %s(P, Dfn, Dfd)" nil)
688 ("F_PDF" fun nil (system) "Result = %s(V, Dfn, Dfd)" nil) 688 ("F_PDF" fun nil (system) "Result = %s(V, Dfn, Dfd)" nil)
689 ("FACTORIAL" fun nil (system) "Result = %s( N)" (("STIRLING") ("UL64"))) 689 ("FACTORIAL" fun nil (system) "Result = %s( N)" (("STIRLING") ("UL64")))
690 ("FFT" fun nil (system) "Result = %s( Array [, Direction])" (("DIMENSION") ("DOUBLE") ("INVERSE") ("OVERWRITE"))) 690 ("FFT" fun nil (system) "Result = %s( Array [, Direction])" (("DIMENSION") ("DOUBLE") ("INVERSE") ("OVERWRITE") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
691 ("FILE_EXPAND_PATH" fun nil (system) "Result = %s (Path)" nil) 691 ("FILE_EXPAND_PATH" fun nil (system) "Result = %s (Path)" nil)
692 ("FILE_INFO" fun nil (system) "Result = %s(Path)" (("NOEXPAND_PATH"))) 692 ("FILE_INFO" fun nil (system) "Result = %s(Path)" (("NOEXPAND_PATH")))
693 ("FILE_SEARCH" fun nil (system) "Result = %s(Path_Specification) or for recursive searching, Result = FILE_SEARCH(Dir_Specification, Recur_Pattern)" (("COUNT") ("EXPAND_ENVIRONMENT") ("EXPAND_TILDE") ("FOLD_CASE") ("FULLY_QUALIFY_PATH") ("ISSUE_ACCESS_ERROR") ("MARK_DIRECTORY") ("MATCH_ALL_INITIAL_DOT") ("MATCH_INITIAL_DOT") ("NOSORT") ("QUOTE") ("TEST_BLOCK_SPECIAL") ("TEST_CHARACTER_SPECIAL") ("TEST_DANGLING_SYMLINK") ("TEST_DIRECTORY") ("TEST_EXECUTABLE") ("TEST_GROUP") ("TEST_NAMED_PIPE") ("TEST_READ") ("TEST_REGULAR") ("TEST_SETGID") ("TEST_SETUID") ("TEST_SOCKET") ("TEST_STICKY_BIT") ("TEST_SYMLINK") ("TEST_USER") ("TEST_WRITE") ("TEST_ZERO_LENGTH"))) 693 ("FILE_SEARCH" fun nil (system) "Result = %s(Path_Specification) or for recursive searching, Result = FILE_SEARCH(Dir_Specification, Recur_Pattern)" (("COUNT") ("EXPAND_ENVIRONMENT") ("EXPAND_TILDE") ("FOLD_CASE") ("FULLY_QUALIFY_PATH") ("ISSUE_ACCESS_ERROR") ("MARK_DIRECTORY") ("MATCH_ALL_INITIAL_DOT") ("MATCH_INITIAL_DOT") ("NOSORT") ("QUOTE") ("TEST_BLOCK_SPECIAL") ("TEST_CHARACTER_SPECIAL") ("TEST_DANGLING_SYMLINK") ("TEST_DIRECTORY") ("TEST_EXECUTABLE") ("TEST_GROUP") ("TEST_NAMED_PIPE") ("TEST_READ") ("TEST_REGULAR") ("TEST_SETGID") ("TEST_SETUID") ("TEST_SOCKET") ("TEST_STICKY_BIT") ("TEST_SYMLINK") ("TEST_USER") ("TEST_WRITE") ("TEST_ZERO_LENGTH")))
@@ -695,11 +695,11 @@
695 ("FILE_WHICH" fun nil (system) "Result = %s( [Path, ] File)" (("INCLUDE_CURRENT_DIR"))) 695 ("FILE_WHICH" fun nil (system) "Result = %s( [Path, ] File)" (("INCLUDE_CURRENT_DIR")))
696 ("FILEPATH" fun nil (system) "Result = %s( Filename)" (("ROOT_DIR") ("SUBDIRECTORY") ("TERMINAL") ("TMP"))) 696 ("FILEPATH" fun nil (system) "Result = %s( Filename)" (("ROOT_DIR") ("SUBDIRECTORY") ("TERMINAL") ("TMP")))
697 ("FINDFILE" fun nil (system) "Result = %s( File_Specification)" (("COUNT"))) 697 ("FINDFILE" fun nil (system) "Result = %s( File_Specification)" (("COUNT")))
698 ("FINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" nil) 698 ("FINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
699 ("FINITE" fun nil (system) "Result = %s( X)" (("INFINITY") ("NAN") ("SIGN"))) 699 ("FINITE" fun nil (system) "Result = %s( X)" (("INFINITY") ("NAN") ("SIGN") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
700 ("FIX" fun nil (system) "Result = %s( Expression [, Offset [, Dim1, ..., Dim8]])" (("PRINT") ("TYPE"))) 700 ("FIX" fun nil (system) "Result = %s( Expression [, Offset [, Dim1, ..., Dim8]])" (("PRINT") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD") ("TYPE")))
701 ("FLOAT" fun nil (system) "Result = %s( Expression [, Offset [, Dim1, ..., Dim8]] )" nil) 701 ("FLOAT" fun nil (system) "Result = %s( Expression [, Offset [, Dim1, ..., Dim8]] )" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
702 ("FLOOR" fun nil (system) "Result = %s(X)" (("L64"))) 702 ("FLOOR" fun nil (system) "Result = %s(X)" (("L64") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
703 ("FLTARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO"))) 703 ("FLTARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
704 ("FORMAT_AXIS_VALUES" fun nil (system) "Result = %s( Values )" nil) 704 ("FORMAT_AXIS_VALUES" fun nil (system) "Result = %s( Values )" nil)
705 ("FSTAT" fun nil (system) "Result = %s(Unit)" nil) 705 ("FSTAT" fun nil (system) "Result = %s(Unit)" nil)
@@ -707,7 +707,7 @@
707 ("FV_TEST" fun nil (system) "Result = %s(X, Y)" nil) 707 ("FV_TEST" fun nil (system) "Result = %s(X, Y)" nil)
708 ("FX_ROOT" fun nil (system) "Result = %s(X, Func)" (("DOUBLE") ("ITMAX") ("STOP") ("TOL"))) 708 ("FX_ROOT" fun nil (system) "Result = %s(X, Func)" (("DOUBLE") ("ITMAX") ("STOP") ("TOL")))
709 ("FZ_ROOTS" fun nil (system) "Result = %s(C)" (("DOUBLE") ("EPS") ("NO_POLISH"))) 709 ("FZ_ROOTS" fun nil (system) "Result = %s(C)" (("DOUBLE") ("EPS") ("NO_POLISH")))
710 ("GAMMA" fun nil (system) "Result = %s(X)" nil) 710 ("GAMMA" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
711 ("GAUSS2DFIT" fun nil (system) "Result = %s( Z, A [, X, Y])" (("NEGATIVE") ("TILT"))) 711 ("GAUSS2DFIT" fun nil (system) "Result = %s( Z, A [, X, Y])" (("NEGATIVE") ("TILT")))
712 ("GAUSS_CVF" fun nil (system) "Result = %s(P)" nil) 712 ("GAUSS_CVF" fun nil (system) "Result = %s(P)" nil)
713 ("GAUSS_PDF" fun nil (system) "Result = %s(V)" nil) 713 ("GAUSS_PDF" fun nil (system) "Result = %s(V)" nil)
@@ -819,23 +819,23 @@
819 ("IBETA" fun nil (system) "Result = %s( A, B, X)" (("DOUBLE") ("EPS") ("ITER") ("ITMAX"))) 819 ("IBETA" fun nil (system) "Result = %s( A, B, X)" (("DOUBLE") ("EPS") ("ITER") ("ITMAX")))
820 ("IDENTITY" fun nil (system) "Result = %s( N)" (("DOUBLE"))) 820 ("IDENTITY" fun nil (system) "Result = %s( N)" (("DOUBLE")))
821 ("IGAMMA" fun nil (system) "Result = %s( A, X)" (("DOUBLE") ("EPS") ("ITER") ("ITMAX") ("METHOD"))) 821 ("IGAMMA" fun nil (system) "Result = %s( A, X)" (("DOUBLE") ("EPS") ("ITER") ("ITMAX") ("METHOD")))
822 ("IMAGINARY" fun nil (system) "Result = %s(Complex_Expression)" nil) 822 ("IMAGINARY" fun nil (system) "Result = %s(Complex_Expression)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
823 ("INDGEN" fun nil (system) "Result = %s(D1, ..., D8)" (("BYTE") ("COMPLEX") ("DCOMPLEX") ("DOUBLE") ("FLOAT") ("L64") ("LONG") ("STRING") ("TYPE") ("UINT") ("UL64") ("ULONG"))) 823 ("INDGEN" fun nil (system) "Result = %s(D1, ..., D8)" (("BYTE") ("COMPLEX") ("DCOMPLEX") ("DOUBLE") ("FLOAT") ("L64") ("LONG") ("STRING") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD") ("TYPE") ("UINT") ("UL64") ("ULONG")))
824 ("INT_2D" fun nil (system) "Result = %s( Fxy, AB_Limits, PQ_Limits, Pts)" (("DOUBLE") ("ORDER"))) 824 ("INT_2D" fun nil (system) "Result = %s( Fxy, AB_Limits, PQ_Limits, Pts)" (("DOUBLE") ("ORDER")))
825 ("INT_3D" fun nil (system) "Result = %s( Fxyz, AB_Limits, PQ_Limits, UV_Limits, Pts)" (("DOUBLE"))) 825 ("INT_3D" fun nil (system) "Result = %s( Fxyz, AB_Limits, PQ_Limits, UV_Limits, Pts)" (("DOUBLE")))
826 ("INT_TABULATED" fun nil (system) "Result = %s( X, F)" (("DOUBLE") ("SORT"))) 826 ("INT_TABULATED" fun nil (system) "Result = %s( X, F)" (("DOUBLE") ("SORT")))
827 ("INTARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO"))) 827 ("INTARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
828 ("INTERPOL" fun nil (system) "Result = %s( V, N) or Result = INTERPOL( V, X, U)" (("LSQUADRATIC") ("QUADRATIC") ("SPLINE"))) 828 ("INTERPOL" fun nil (system) "Result = %s( V, N) or Result = INTERPOL( V, X, U)" (("LSQUADRATIC") ("QUADRATIC") ("SPLINE")))
829 ("INTERPOLATE" fun nil (system) "Result = %s( P, X [, Y [, Z]])" (("CUBIC") ("GRID") ("MISSING"))) 829 ("INTERPOLATE" fun nil (system) "Result = %s( P, X [, Y [, Z]])" (("CUBIC") ("GRID") ("MISSING") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
830 ("INVERT" fun nil (system) "Result = %s( Array [, Status])" (("DOUBLE"))) 830 ("INVERT" fun nil (system) "Result = %s( Array [, Status])" (("DOUBLE")))
831 ("IOCTL" fun nil (system) "Result = %s( File_Unit [, Request, Arg])" (("BY_VALUE") ("MT_OFFLINE") ("MT_REWIND") ("MT_SKIP_FILE") ("MT_SKIP_RECORD") ("MT_WEOF") ("SUPPRESS_ERROR"))) 831 ("IOCTL" fun nil (system) "Result = %s( File_Unit [, Request, Arg])" (("BY_VALUE") ("MT_OFFLINE") ("MT_REWIND") ("MT_SKIP_FILE") ("MT_SKIP_RECORD") ("MT_WEOF") ("SUPPRESS_ERROR")))
832 ("ISHFT" fun nil (system) "Result = %s(P1, P2)" nil) 832 ("ISHFT" fun nil (system) "Result = %s(P1, P2)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
833 ("JULDAY" fun nil (system) "Result = %s(Month, Day, Year, Hour, Minute, Second)" nil) 833 ("JULDAY" fun nil (system) "Result = %s(Month, Day, Year, Hour, Minute, Second)" nil)
834 ("KEYWORD_SET" fun nil (system) "Result = %s(Expression)" nil) 834 ("KEYWORD_SET" fun nil (system) "Result = %s(Expression)" nil)
835 ("KRIG2D" fun nil (system) "Result = %s( Z [, X, Y])" (("BOUNDS") ("EXPONENTIAL") ("GS") ("NX") ("NY") ("REGULAR") ("SPHERICAL") ("XGRID") ("XVALUES") ("YGRID") ("YVALUES"))) 835 ("KRIG2D" fun nil (system) "Result = %s( Z [, X, Y])" (("BOUNDS") ("EXPONENTIAL") ("GS") ("NX") ("NY") ("REGULAR") ("SPHERICAL") ("XGRID") ("XVALUES") ("YGRID") ("YVALUES")))
836 ("KURTOSIS" fun nil (system) "Result = %s(X)" (("DOUBLE") ("NAN"))) 836 ("KURTOSIS" fun nil (system) "Result = %s(X)" (("DOUBLE") ("NAN")))
837 ("KW_TEST" fun nil (system) "Result = %s( X)" (("DF") ("MISSING"))) 837 ("KW_TEST" fun nil (system) "Result = %s( X)" (("DF") ("MISSING")))
838 ("L64INDGEN" fun nil (system) "Result = %s(D1, ..., D8)" nil) 838 ("L64INDGEN" fun nil (system) "Result = %s(D1, ..., D8)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
839 ("LABEL_DATE" fun nil (system) "Result = %s()" (("AM_PM") ("DATE_FORMAT") ("DAYS_OF_WEEK") ("MONTHS") ("OFFSET") ("ROUND_UP") ("XTICKFORMAT"))) 839 ("LABEL_DATE" fun nil (system) "Result = %s()" (("AM_PM") ("DATE_FORMAT") ("DAYS_OF_WEEK") ("MONTHS") ("OFFSET") ("ROUND_UP") ("XTICKFORMAT")))
840 ("LABEL_REGION" fun nil (system) "Result = %s( Data)" (("ALL_NEIGHBORS") ("ULONG"))) 840 ("LABEL_REGION" fun nil (system) "Result = %s( Data)" (("ALL_NEIGHBORS") ("ULONG")))
841 ("LADFIT" fun nil (system) "Result = %s( X, Y)" (("ABSDEV") ("DOUBLE"))) 841 ("LADFIT" fun nil (system) "Result = %s( X, Y)" (("ABSDEV") ("DOUBLE")))
@@ -843,19 +843,19 @@
843 ("LEEFILT" fun nil (system) "Result = %s( A [, N [, Sig]])" (("DOUBLE") ("EXACT"))) 843 ("LEEFILT" fun nil (system) "Result = %s( A [, N [, Sig]])" (("DOUBLE") ("EXACT")))
844 ("LEGENDRE" fun nil (system) "Result = %s( X, L [, M])" (("DOUBLE"))) 844 ("LEGENDRE" fun nil (system) "Result = %s( X, L [, M])" (("DOUBLE")))
845 ("LINBCG" fun nil (system) "Result = %s( A, B, X)" (("DOUBLE") ("ITER") ("ITMAX") ("ITOL") ("TOL"))) 845 ("LINBCG" fun nil (system) "Result = %s( A, B, X)" (("DOUBLE") ("ITER") ("ITMAX") ("ITOL") ("TOL")))
846 ("LINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" nil) 846 ("LINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
847 ("LINFIT" fun nil (system) "Result = %s( X, Y)" (("CHISQ") ("COVAR") ("DOUBLE") ("MEASURE_ERRORS") ("PROB") ("SIGMA") ("YFIT"))) 847 ("LINFIT" fun nil (system) "Result = %s( X, Y)" (("CHISQ") ("COVAR") ("DOUBLE") ("MEASURE_ERRORS") ("PROB") ("SIGMA") ("YFIT")))
848 ("LIVE_STYLE" fun nil (system) "Style = %s ({ 'contour' | 'image' | 'plot' | 'surface'})" (("BASE_STYLE") ("COLORBAR_PROPERTIES") ("ERROR") ("GRAPHIC_PROPERTIES") ("GROUP") ("LEGEND_PROPERTIES") ("NAME") ("SAVE") ("TEMPLATE_FILE") ("VISUALIZATION_PROPERTIES") ("XAXIS_PROPERTIES") ("YAXIS_PROPERTIES") ("ZAXIS_PROPERTIES"))) 848 ("LIVE_STYLE" fun nil (system) "Style = %s ({ 'contour' | 'image' | 'plot' | 'surface'})" (("BASE_STYLE") ("COLORBAR_PROPERTIES") ("ERROR") ("GRAPHIC_PROPERTIES") ("GROUP") ("LEGEND_PROPERTIES") ("NAME") ("SAVE") ("TEMPLATE_FILE") ("VISUALIZATION_PROPERTIES") ("XAXIS_PROPERTIES") ("YAXIS_PROPERTIES") ("ZAXIS_PROPERTIES")))
849 ("LL_ARC_DISTANCE" fun nil (system) "Result = %s( Lon_lat0, Arc_Dist, Az)" (("DEGREES"))) 849 ("LL_ARC_DISTANCE" fun nil (system) "Result = %s( Lon_lat0, Arc_Dist, Az)" (("DEGREES")))
850 ("LMFIT" fun nil (system) "Result = %s( X, Y, A)" (("ALPHA") ("CHISQ") ("CONVERGENCE") ("COVAR") ("DOUBLE") ("FITA") ("FUNCTION_NAME") ("ITER") ("ITMAX") ("ITMIN") ("MEASURE_ERRORS") ("SIGMA") ("TOL"))) 850 ("LMFIT" fun nil (system) "Result = %s( X, Y, A)" (("ALPHA") ("CHISQ") ("CONVERGENCE") ("COVAR") ("DOUBLE") ("FITA") ("FUNCTION_NAME") ("ITER") ("ITMAX") ("ITMIN") ("MEASURE_ERRORS") ("SIGMA") ("TOL")))
851 ("LMGR" fun nil (system) "Result = %s()" (("CLIENTSERVER") ("DEMO") ("EMBEDDED") ("EXPIRE_DATE") ("FORCE_DEMO") ("INSTALL_NUM") ("LMHOSTID") ("RUNTIME") ("SITE_NOTICE") ("STUDENT") ("TRIAL"))) 851 ("LMGR" fun nil (system) "Result = %s()" (("CLIENTSERVER") ("DEMO") ("EMBEDDED") ("EXPIRE_DATE") ("FORCE_DEMO") ("INSTALL_NUM") ("LMHOSTID") ("RUNTIME") ("SITE_NOTICE") ("STUDENT") ("TRIAL")))
852 ("LNGAMMA" fun nil (system) "Result = %s(X)" nil) 852 ("LNGAMMA" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
853 ("LNP_TEST" fun nil (system) "Result = %s( X, Y)" (("DOUBLE") ("HIFAC") ("JMAX") ("OFAC") ("WK1") ("WK2"))) 853 ("LNP_TEST" fun nil (system) "Result = %s( X, Y)" (("DOUBLE") ("HIFAC") ("JMAX") ("OFAC") ("WK1") ("WK2")))
854 ("LOCALE_GET" fun nil (system) "Result = %s( )" nil) 854 ("LOCALE_GET" fun nil (system) "Result = %s( )" nil)
855 ("LON64ARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO"))) 855 ("LON64ARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
856 ("LONARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO"))) 856 ("LONARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
857 ("LONG" fun nil (system) "Result = %s( Expression[, Offset [, Dim1, ..., Dim8]] )" nil) 857 ("LONG" fun nil (system) "Result = %s( Expression[, Offset [, Dim1, ..., Dim8]] )" nil)
858 ("LONG64" fun nil (system) "Result = %s( Expression[, Offset [, D1, ..., D8]] )" nil) 858 ("LONG64" fun nil (system) "Result = %s( Expression[, Offset [, D1, ..., D8]] )" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
859 ("LSODE" fun nil (system) "Result = %s( Y, X, H, Derivs[, Status])" (("ATOL") ("RTOL"))) 859 ("LSODE" fun nil (system) "Result = %s( Y, X, H, Derivs[, Status])" (("ATOL") ("RTOL")))
860 ("LU_COMPLEX" fun nil (system) "Result = %s( A, B)" (("DOUBLE") ("INVERSE") ("SPARSE"))) 860 ("LU_COMPLEX" fun nil (system) "Result = %s( A, B)" (("DOUBLE") ("INVERSE") ("SPARSE")))
861 ("LUMPROVE" fun nil (system) "Result = %s( A, Alud, Index, B, X)" (("COLUMN") ("DOUBLE"))) 861 ("LUMPROVE" fun nil (system) "Result = %s( A, Alud, Index, B, X)" (("COLUMN") ("DOUBLE")))
@@ -867,7 +867,7 @@
867 ("MAP_IMAGE" fun nil (system) "Result = %s( Image [, Startx, Starty [, Xsize, Ysize]])" (("BILINEAR") ("COMPRESS") ("LATMAX") ("LATMIN") ("LONMAX") ("LONMIN") ("MAX_VALUE") ("MIN_VALUE") ("MISSING") ("SCALE"))) 867 ("MAP_IMAGE" fun nil (system) "Result = %s( Image [, Startx, Starty [, Xsize, Ysize]])" (("BILINEAR") ("COMPRESS") ("LATMAX") ("LATMIN") ("LONMAX") ("LONMIN") ("MAX_VALUE") ("MIN_VALUE") ("MISSING") ("SCALE")))
868 ("MAP_PATCH" fun nil (system) "Result = %s( Image_Orig [, Lons, Lats])" (("LAT0") ("LAT1") ("LON0") ("LON1") ("MAX_VALUE") ("MISSING") ("TRIANGULATE") ("XSIZE") ("XSTART") ("YSIZE") ("YSTART"))) 868 ("MAP_PATCH" fun nil (system) "Result = %s( Image_Orig [, Lons, Lats])" (("LAT0") ("LAT1") ("LON0") ("LON1") ("MAX_VALUE") ("MISSING") ("TRIANGULATE") ("XSIZE") ("XSTART") ("YSIZE") ("YSTART")))
869 ("MATRIX_MULTIPLY" fun nil (system) "Result = %s( A, B)" (("ATRANSPOSE") ("BTRANSPOSE"))) 869 ("MATRIX_MULTIPLY" fun nil (system) "Result = %s( A, B)" (("ATRANSPOSE") ("BTRANSPOSE")))
870 ("MAX" fun nil (system) "Result = %s( Array [, Max_Subscript])" (("DIMENSION") ("MIN") ("NAN") ("SUBSCRIPT_MIN"))) 870 ("MAX" fun nil (system) "Result = %s( Array [, Max_Subscript])" (("DIMENSION") ("MIN") ("NAN") ("SUBSCRIPT_MIN") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
871 ("MD_TEST" fun nil (system) "Result = %s( X)" (("ABOVE") ("BELOW") ("MDC"))) 871 ("MD_TEST" fun nil (system) "Result = %s( X)" (("ABOVE") ("BELOW") ("MDC")))
872 ("MEAN" fun nil (system) "Result = %s( X)" (("DOUBLE") ("NAN"))) 872 ("MEAN" fun nil (system) "Result = %s( X)" (("DOUBLE") ("NAN")))
873 ("MEANABSDEV" fun nil (system) "Result = %s( X)" (("DOUBLE") ("MEDIAN") ("NAN"))) 873 ("MEANABSDEV" fun nil (system) "Result = %s( X)" (("DOUBLE") ("MEDIAN") ("NAN")))
@@ -882,7 +882,7 @@
882 ("MESH_SURFACEAREA" fun nil (system) "Result = %s ( Verts, Conn)" (("AUXDATA") ("MOMENT"))) 882 ("MESH_SURFACEAREA" fun nil (system) "Result = %s ( Verts, Conn)" (("AUXDATA") ("MOMENT")))
883 ("MESH_VALIDATE" fun nil (system) "Result = %s ( Verts, Conn)" (("COMBINE_VERTICES") ("PACK_VERTICES") ("REMOVE_NAN") ("TOLERANCE"))) 883 ("MESH_VALIDATE" fun nil (system) "Result = %s ( Verts, Conn)" (("COMBINE_VERTICES") ("PACK_VERTICES") ("REMOVE_NAN") ("TOLERANCE")))
884 ("MESH_VOLUME" fun nil (system) "Result = %s ( Verts, Conn)" (("SIGNED"))) 884 ("MESH_VOLUME" fun nil (system) "Result = %s ( Verts, Conn)" (("SIGNED")))
885 ("MIN" fun nil (system) "Result = %s( Array [, Min_Subscript])" (("DIMENSION") ("MAX") ("NAN") ("SUBSCRIPT_MAX"))) 885 ("MIN" fun nil (system) "Result = %s( Array [, Min_Subscript])" (("DIMENSION") ("MAX") ("NAN") ("SUBSCRIPT_MAX") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
886 ("MIN_CURVE_SURF" fun nil (system) "Result = %s(Z [, X, Y])" (("BOUNDS") ("CONST") ("DOUBLE") ("GS") ("NX") ("NY") ("REGULAR") ("SPHERE") ("TPS") ("XGRID") ("XOUT") ("XPOUT") ("XVALUES") ("YGRID") ("YOUT") ("YPOUT") ("YVALUES"))) 886 ("MIN_CURVE_SURF" fun nil (system) "Result = %s(Z [, X, Y])" (("BOUNDS") ("CONST") ("DOUBLE") ("GS") ("NX") ("NY") ("REGULAR") ("SPHERE") ("TPS") ("XGRID") ("XOUT") ("XPOUT") ("XVALUES") ("YGRID") ("YOUT") ("YPOUT") ("YVALUES")))
887 ("MOMENT" fun nil (system) "Result = %s( X)" (("DOUBLE") ("MDEV") ("NAN") ("SDEV"))) 887 ("MOMENT" fun nil (system) "Result = %s( X)" (("DOUBLE") ("MDEV") ("NAN") ("SDEV")))
888 ("MORPH_CLOSE" fun nil (system) "Result = %s (Image, Structure)" (("GRAY") ("PRESERVE_TYPE") ("UINT") ("ULONG") ("VALUES"))) 888 ("MORPH_CLOSE" fun nil (system) "Result = %s (Image, Structure)" (("GRAY") ("PRESERVE_TYPE") ("UINT") ("ULONG") ("VALUES")))
@@ -922,7 +922,7 @@
922 ("PNT_LINE" fun nil (system) "Result = %s( P0, L0, L1 [, Pl])" (("INTERVAL"))) 922 ("PNT_LINE" fun nil (system) "Result = %s( P0, L0, L1 [, Pl])" (("INTERVAL")))
923 ("POLAR_SURFACE" fun nil (system) "Result = %s( Z, R, Theta)" (("BOUNDS") ("GRID") ("MISSING") ("QUINTIC") ("SPACING"))) 923 ("POLAR_SURFACE" fun nil (system) "Result = %s( Z, R, Theta)" (("BOUNDS") ("GRID") ("MISSING") ("QUINTIC") ("SPACING")))
924 ("POLY" fun nil (system) "Result = %s(X, C)" nil) 924 ("POLY" fun nil (system) "Result = %s(X, C)" nil)
925 ("POLY_2D" fun nil (system) "Result = %s( Array, P, Q [, Interp [, Dimx, Dimy]])" (("CUBIC") ("MISSING"))) 925 ("POLY_2D" fun nil (system) "Result = %s( Array, P, Q [, Interp [, Dimx, Dimy]])" (("CUBIC") ("MISSING") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
926 ("POLY_AREA" fun nil (system) "Result = %s( X, Y)" (("DOUBLE") ("SIGNED"))) 926 ("POLY_AREA" fun nil (system) "Result = %s( X, Y)" (("DOUBLE") ("SIGNED")))
927 ("POLY_FIT" fun nil (system) "Result = %s( X, Y, Degree)" (("CHISQ") ("COVAR") ("DOUBLE") ("MEASURE_ERRORS") ("SIGMA") ("STATUS") ("YBAND") ("YERROR") ("YFIT"))) 927 ("POLY_FIT" fun nil (system) "Result = %s( X, Y, Degree)" (("CHISQ") ("COVAR") ("DOUBLE") ("MEASURE_ERRORS") ("SIGMA") ("STATUS") ("YBAND") ("YERROR") ("YFIT")))
928 ("POLYFILLV" fun nil (system) "Result = %s( X, Y, Sx, Sy [, Run_Length] )" nil) 928 ("POLYFILLV" fun nil (system) "Result = %s( X, Y, Sx, Sy [, Run_Length] )" nil)
@@ -974,13 +974,13 @@
974 ("REFORM" fun nil (system) "Result = %s( Array, D1, ..., D8)" (("OVERWRITE"))) 974 ("REFORM" fun nil (system) "Result = %s( Array, D1, ..., D8)" (("OVERWRITE")))
975 ("REGION_GROW" fun nil (system) "Result = %s(Array, ROIPixels)" (("ALL_NEIGHBORS") ("STDDEV_MULTIPLIER") ("THRESHOLD"))) 975 ("REGION_GROW" fun nil (system) "Result = %s(Array, ROIPixels)" (("ALL_NEIGHBORS") ("STDDEV_MULTIPLIER") ("THRESHOLD")))
976 ("REGRESS" fun nil (system) "Result = %s( X, Y)" (("CHISQ") ("CONST") ("CORRELATION") ("DOUBLE") ("FTEST") ("MCORRELATION") ("MEASURE_ERRORS") ("SIGMA") ("STATUS") ("YFIT"))) 976 ("REGRESS" fun nil (system) "Result = %s( X, Y)" (("CHISQ") ("CONST") ("CORRELATION") ("DOUBLE") ("FTEST") ("MCORRELATION") ("MEASURE_ERRORS") ("SIGMA") ("STATUS") ("YFIT")))
977 ("REPLICATE" fun nil (system) "Result = %s( Value, D1 [, ..., D8] )" nil) 977 ("REPLICATE" fun nil (system) "Result = %s( Value, D1 [, ..., D8] )" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
978 ("REVERSE" fun nil (system) "Result = %s( Array [, Subscript_Index])" (("OVERWRITE"))) 978 ("REVERSE" fun nil (system) "Result = %s( Array [, Subscript_Index])" (("OVERWRITE")))
979 ("RK4" fun nil (system) "Result = %s( Y, Dydx, X, H, Derivs)" (("DOUBLE"))) 979 ("RK4" fun nil (system) "Result = %s( Y, Dydx, X, H, Derivs)" (("DOUBLE")))
980 ("ROBERTS" fun nil (system) "Result = %s(Image)" nil) 980 ("ROBERTS" fun nil (system) "Result = %s(Image)" nil)
981 ("ROT" fun nil (system) "Result = %s( A, Angle, [Mag, X0, Y0])" (("CUBIC") ("INTERP") ("MISSING") ("PIVOT"))) 981 ("ROT" fun nil (system) "Result = %s( A, Angle, [Mag, X0, Y0])" (("CUBIC") ("INTERP") ("MISSING") ("PIVOT")))
982 ("ROTATE" fun nil (system) "Result = %s(Array, Direction)" nil) 982 ("ROTATE" fun nil (system) "Result = %s(Array, Direction)" nil)
983 ("ROUND" fun nil (system) "Result = %s(X)" (("L64"))) 983 ("ROUND" fun nil (system) "Result = %s(X)" (("L64") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
984 ("ROUTINE_INFO" fun nil (system) "Result = %s( [Routine])" (("DISABLED") ("ENABLED") ("FUNCTIONS") ("PARAMETERS") ("SOURCE") ("SYSTEM") ("UNRESOLVED") ("VARIABLES"))) 984 ("ROUTINE_INFO" fun nil (system) "Result = %s( [Routine])" (("DISABLED") ("ENABLED") ("FUNCTIONS") ("PARAMETERS") ("SOURCE") ("SYSTEM") ("UNRESOLVED") ("VARIABLES")))
985 ("RS_TEST" fun nil (system) "Result = %s( X, Y)" (("UX") ("UY"))) 985 ("RS_TEST" fun nil (system) "Result = %s( X, Y)" (("UX") ("UY")))
986 ("RSTRPOS" fun nil (system) "Result = %s( Expression, Search_String [, Pos] )" nil) 986 ("RSTRPOS" fun nil (system) "Result = %s( Expression, Search_String [, Pos] )" nil)
@@ -991,9 +991,9 @@
991 ("SFIT" fun nil (system) "Result = %s( Data, Degree)" (("KX"))) 991 ("SFIT" fun nil (system) "Result = %s( Data, Degree)" (("KX")))
992 ("SHIFT" fun nil (system) "Result = %s(Array, S1, ..., Sn)" nil) 992 ("SHIFT" fun nil (system) "Result = %s(Array, S1, ..., Sn)" nil)
993 ("SIMPLEX" fun nil (system) "Result = %s( Zequation, Constraints, M1, M2, M3 [, Tableau [, Izrov [, Iposv]]])" (("DOUBLE") ("EPS") ("STATUS"))) 993 ("SIMPLEX" fun nil (system) "Result = %s( Zequation, Constraints, M1, M2, M3 [, Tableau [, Izrov [, Iposv]]])" (("DOUBLE") ("EPS") ("STATUS")))
994 ("SIN" fun nil (system) "Result = %s(X)" nil) 994 ("SIN" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
995 ("SINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" nil) 995 ("SINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" nil)
996 ("SINH" fun nil (system) "Result = %s(X)" nil) 996 ("SINH" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
997 ("SIZE" fun nil (system) "Result = %s( Expression)" (("DIMENSIONS") ("FILE_LUN") ("L64") ("N_DIMENSIONS") ("N_ELEMENTS") ("STRUCTURE") ("TNAME") ("TYPE"))) 997 ("SIZE" fun nil (system) "Result = %s( Expression)" (("DIMENSIONS") ("FILE_LUN") ("L64") ("N_DIMENSIONS") ("N_ELEMENTS") ("STRUCTURE") ("TNAME") ("TYPE")))
998 ("SKEWNESS" fun nil (system) "Result = %s( X)" (("DOUBLE") ("NAN"))) 998 ("SKEWNESS" fun nil (system) "Result = %s( X)" (("DOUBLE") ("NAN")))
999 ("SMOOTH" fun nil (system) "Result = %s( Array, Width)" (("EDGE_TRUNCATE") ("MISSING") ("NAN"))) 999 ("SMOOTH" fun nil (system) "Result = %s( Array, Width)" (("EDGE_TRUNCATE") ("MISSING") ("NAN")))
@@ -1008,7 +1008,7 @@
1008 ("SPRSAX" fun nil (system) "Result = %s( A, X)" (("DOUBLE"))) 1008 ("SPRSAX" fun nil (system) "Result = %s( A, X)" (("DOUBLE")))
1009 ("SPRSIN" fun nil (system) "Result = %s( A)" (("COLUMN") ("DOUBLE") ("THRESHOLD"))) 1009 ("SPRSIN" fun nil (system) "Result = %s( A)" (("COLUMN") ("DOUBLE") ("THRESHOLD")))
1010 ("SPRSTP" fun nil (system) "Result = %s(A)" nil) 1010 ("SPRSTP" fun nil (system) "Result = %s(A)" nil)
1011 ("SQRT" fun nil (system) "Result = %s(X)" nil) 1011 ("SQRT" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
1012 ("STANDARDIZE" fun nil (system) "Result = %s( A)" (("DOUBLE"))) 1012 ("STANDARDIZE" fun nil (system) "Result = %s( A)" (("DOUBLE")))
1013 ("STDDEV" fun nil (system) "Result = %s( X)" (("DOUBLE") ("NAN"))) 1013 ("STDDEV" fun nil (system) "Result = %s( X)" (("DOUBLE") ("NAN")))
1014 ("STR_SEP" fun nil (system) "Result = %s( Str, Separator)" (("ESC") ("REMOVE_ALL") ("TRIM"))) 1014 ("STR_SEP" fun nil (system) "Result = %s( Str, Separator)" (("ESC") ("REMOVE_ALL") ("TRIM")))
@@ -1034,8 +1034,8 @@
1034 ("T_CVF" fun nil (system) "Result = %s(P, Df)" nil) 1034 ("T_CVF" fun nil (system) "Result = %s(P, Df)" nil)
1035 ("T_PDF" fun nil (system) "Result = %s(V, Df)" nil) 1035 ("T_PDF" fun nil (system) "Result = %s(V, Df)" nil)
1036 ("TAG_NAMES" fun nil (system) "Result = %s( Expression)" (("STRUCTURE_NAME"))) 1036 ("TAG_NAMES" fun nil (system) "Result = %s( Expression)" (("STRUCTURE_NAME")))
1037 ("TAN" fun nil (system) "Result = %s(X)" nil) 1037 ("TAN" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
1038 ("TANH" fun nil (system) "Result = %s(X)" nil) 1038 ("TANH" fun nil (system) "Result = %s(X)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
1039 ("TEMPORARY" fun nil (system) "Result = %s(Variable)" nil) 1039 ("TEMPORARY" fun nil (system) "Result = %s(Variable)" nil)
1040 ("TETRA_CLIP" fun nil (system) "Result = %s ( Plane, Vertsin, Connin, Vertsout, Connout)" (("AUXDATA_IN") ("AUXDATA_OUT") ("CUT_VERTS"))) 1040 ("TETRA_CLIP" fun nil (system) "Result = %s ( Plane, Vertsin, Connin, Vertsout, Connout)" (("AUXDATA_IN") ("AUXDATA_OUT") ("CUT_VERTS")))
1041 ("TETRA_SURFACE" fun nil (system) "Result = %s (Verts, Connin)" nil) 1041 ("TETRA_SURFACE" fun nil (system) "Result = %s (Verts, Connin)" nil)
@@ -1044,7 +1044,7 @@
1044 ("TIFF_READ" fun nil (system) "Result = %s(File [, R, G, B])" nil) 1044 ("TIFF_READ" fun nil (system) "Result = %s(File [, R, G, B])" nil)
1045 ("TIMEGEN" fun nil (system) "Result = %s( [D1,...,D8])" (("DAYS") ("FINAL") ("HOURS") ("MINUTES") ("MONTHS") ("SECONDS") ("START") ("STEP_SIZE") ("UNITS") ("YEAR"))) 1045 ("TIMEGEN" fun nil (system) "Result = %s( [D1,...,D8])" (("DAYS") ("FINAL") ("HOURS") ("MINUTES") ("MONTHS") ("SECONDS") ("START") ("STEP_SIZE") ("UNITS") ("YEAR")))
1046 ("TM_TEST" fun nil (system) "Result = %s( X, Y)" (("PAIRED") ("UNEQUAL"))) 1046 ("TM_TEST" fun nil (system) "Result = %s( X, Y)" (("PAIRED") ("UNEQUAL")))
1047 ("TOTAL" fun nil (system) "Result = %s( Array [, Dimension])" (("CUMULATIVE") ("DOUBLE") ("NAN"))) 1047 ("TOTAL" fun nil (system) "Result = %s( Array [, Dimension])" (("CUMULATIVE") ("DOUBLE") ("NAN") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
1048 ("TRACE" fun nil (system) "Result = %s( A)" (("DOUBLE"))) 1048 ("TRACE" fun nil (system) "Result = %s( A)" (("DOUBLE")))
1049 ("TRANSPOSE" fun nil (system) "Result = %s( Array [, P] )" nil) 1049 ("TRANSPOSE" fun nil (system) "Result = %s( Array [, P] )" nil)
1050 ("TRI_SURF" fun nil (system) "Result = %s( Z [, X, Y])" (("BOUNDS") ("EXTRAPOLATE") ("GS") ("MISSING") ("NX") ("NY") ("REGULAR") ("XGRID") ("XVALUES") ("YGRID") ("YVALUES"))) 1050 ("TRI_SURF" fun nil (system) "Result = %s( Z [, X, Y])" (("BOUNDS") ("EXTRAPOLATE") ("GS") ("MISSING") ("NX") ("NY") ("REGULAR") ("XGRID") ("XVALUES") ("YGRID") ("YVALUES")))
@@ -1056,25 +1056,25 @@
1056 ("TS_FCAST" fun nil (system) "Result = %s( X, P, Nvalues)" (("BACKCAST") ("DOUBLE"))) 1056 ("TS_FCAST" fun nil (system) "Result = %s( X, P, Nvalues)" (("BACKCAST") ("DOUBLE")))
1057 ("TS_SMOOTH" fun nil (system) "Result = %s( X, Nvalues)" (("BACKWARD") ("DOUBLE") ("FORWARD") ("ORDER"))) 1057 ("TS_SMOOTH" fun nil (system) "Result = %s( X, Nvalues)" (("BACKWARD") ("DOUBLE") ("FORWARD") ("ORDER")))
1058 ("TVRD" fun nil (system) "Result = %s( [X0 [, Y0 [, Nx [, Ny [, Channel]]]]])" (("CHANNEL") ("ORDER") ("TRUE") ("WORDS"))) 1058 ("TVRD" fun nil (system) "Result = %s( [X0 [, Y0 [, Nx [, Ny [, Channel]]]]])" (("CHANNEL") ("ORDER") ("TRUE") ("WORDS")))
1059 ("UINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" nil) 1059 ("UINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
1060 ("UINT" fun nil (system) "Result = %s( Expression[, Offset [, Dim1, ..., Dim8]] )" nil) 1060 ("UINT" fun nil (system) "Result = %s( Expression[, Offset [, Dim1, ..., Dim8]] )" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
1061 ("UINTARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO"))) 1061 ("UINTARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
1062 ("UL64INDGEN" fun nil (system) "Result = %s(D1, ..., D8)" nil) 1062 ("UL64INDGEN" fun nil (system) "Result = %s(D1, ..., D8)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
1063 ("ULINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" nil) 1063 ("ULINDGEN" fun nil (system) "Result = %s(D1, ..., D8)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
1064 ("ULON64ARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO"))) 1064 ("ULON64ARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
1065 ("ULONARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO"))) 1065 ("ULONARR" fun nil (system) "Result = %s( D1, ..., D8)" (("NOZERO")))
1066 ("ULONG" fun nil (system) "Result = %s( Expression[, Offset [, Dim1, ..., Dim8]] )" nil) 1066 ("ULONG" fun nil (system) "Result = %s( Expression[, Offset [, Dim1, ..., Dim8]] )" nil)
1067 ("ULONG64" fun nil (system) "Result = %s( Expression[, Offset [, Dim1, ..., Dim8]] )" nil) 1067 ("ULONG64" fun nil (system) "Result = %s( Expression[, Offset [, Dim1, ..., Dim8]] )" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
1068 ("UNIQ" fun nil (system) "Result = %s( Array [, Index] )" nil) 1068 ("UNIQ" fun nil (system) "Result = %s( Array [, Index] )" nil)
1069 ("VALUE_LOCATE" fun nil (system) "Result = %s ( Vector, Value)" (("L64"))) 1069 ("VALUE_LOCATE" fun nil (system) "Result = %s ( Vector, Value)" (("L64")))
1070 ("VARIANCE" fun nil (system) "Result = %s( X)" (("DOUBLE") ("NAN"))) 1070 ("VARIANCE" fun nil (system) "Result = %s( X)" (("DOUBLE") ("NAN")))
1071 ("VAX_FLOAT" fun nil (system) "Result = %s( [Default])" (("FILE_UNIT"))) 1071 ("VAX_FLOAT" fun nil (system) "Result = %s( [Default])" (("FILE_UNIT")))
1072 ("VERT_T3D" fun nil (system) "Result = %s( Vertex_List)" (("MATRIX") ("NO_COPY") ("NO_DIVIDE") ("SAVE_DIVIDE"))) 1072 ("VERT_T3D" fun nil (system) "Result = %s( Vertex_List)" (("MATRIX") ("NO_COPY") ("NO_DIVIDE") ("SAVE_DIVIDE")))
1073 ("VOIGT" fun nil (system) "Result = %s(A, U)" nil) 1073 ("VOIGT" fun nil (system) "Result = %s(A, U)" (("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
1074 ("VOXEL_PROJ" fun nil (system) "Result = %s( V [, RGBO])" (("BACKGROUND") ("CUTTING_PLANE") ("INTERPOLATE") ("MAXIMUM_INTENSITY") ("STEP") ("XSIZE") ("YSIZE") ("ZBUFFER") ("ZPIXELS"))) 1074 ("VOXEL_PROJ" fun nil (system) "Result = %s( V [, RGBO])" (("BACKGROUND") ("CUTTING_PLANE") ("INTERPOLATE") ("MAXIMUM_INTENSITY") ("STEP") ("XSIZE") ("YSIZE") ("ZBUFFER") ("ZPIXELS")))
1075 ("WARP_TRI" fun nil (system) "Result = %s( Xo, Yo, Xi, Yi, Image)" (("EXTRAPOLATE") ("OUTPUT_SIZE") ("QUINTIC") ("TPS"))) 1075 ("WARP_TRI" fun nil (system) "Result = %s( Xo, Yo, Xi, Yi, Image)" (("EXTRAPOLATE") ("OUTPUT_SIZE") ("QUINTIC") ("TPS")))
1076 ("WATERSHED" fun nil (system) "Result = %s ( Image)" (("CONNECTIVITY"))) 1076 ("WATERSHED" fun nil (system) "Result = %s ( Image)" (("CONNECTIVITY")))
1077 ("WHERE" fun nil (system) "Result = %s( Array_Expression [, Count])" (("COMPLEMENT") ("L64") ("NCOMPLEMENT"))) 1077 ("WHERE" fun nil (system) "Result = %s( Array_Expression [, Count])" (("COMPLEMENT") ("L64") ("NCOMPLEMENT") ("TPOOL_MAX_ELTS") ("TPOOL_MIN_ELTS") ("TPOOL_NOTHREAD")))
1078 ("WIDGET_ACTIVEX" fun nil (system) "Result = %s( Parent, COM_ID)" (("ALIGN_BOTTOM") ("ALIGN_CENTER") ("ALIGN_LEFT") ("ALIGN_RIGHT") ("ALIGN_TOP") ("EVENT_FUNC") ("EVENT_PRO") ("FUNC_GET_VALUE") ("ID_TYPE") ("KILL_NOTIFY") ("NO_COPY") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("SCR_XSIZE") ("SCR_YSIZE") ("SENSITIVE") ("UNAME") ("UNITS") ("UVALUE") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE"))) 1078 ("WIDGET_ACTIVEX" fun nil (system) "Result = %s( Parent, COM_ID)" (("ALIGN_BOTTOM") ("ALIGN_CENTER") ("ALIGN_LEFT") ("ALIGN_RIGHT") ("ALIGN_TOP") ("EVENT_FUNC") ("EVENT_PRO") ("FUNC_GET_VALUE") ("ID_TYPE") ("KILL_NOTIFY") ("NO_COPY") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("SCR_XSIZE") ("SCR_YSIZE") ("SENSITIVE") ("UNAME") ("UNITS") ("UVALUE") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
1079 ("WIDGET_BASE" fun nil (system) "Result = %s( [Parent])" (("ALIGN_BOTTOM") ("ALIGN_CENTER") ("ALIGN_LEFT") ("ALIGN_RIGHT") ("ALIGN_TOP") ("APP_MBAR") ("BASE_ALIGN_BOTTOM") ("BASE_ALIGN_CENTER") ("BASE_ALIGN_LEFT") ("BASE_ALIGN_RIGHT") ("BASE_ALIGN_TOP") ("COLUMN") ("CONTEXT_MENU") ("DISPLAY_NAME") ("EVENT_FUNC") ("EVENT_PRO") ("EXCLUSIVE") ("FLOATING") ("FRAME") ("FUNC_GET_VALUE") ("GRID_LAYOUT") ("GROUP_LEADER") ("KBRD_FOCUS_EVENTS") ("KILL_NOTIFY") ("MAP") ("MBAR") ("MODAL") ("NO_COPY") ("NONEXCLUSIVE") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("RNAME_MBAR") ("ROW") ("SCR_XSIZE") ("SCR_YSIZE") ("SCROLL") ("SENSITIVE") ("SPACE") ("TITLE") ("TLB_FRAME_ATTR") ("TLB_KILL_REQUEST_EVENTS") ("TLB_SIZE_EVENTS") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("X_SCROLL_SIZE") ("XOFFSET") ("XPAD") ("XSIZE") ("Y_SCROLL_SIZE") ("YOFFSET") ("YPAD") ("YSIZE"))) 1079 ("WIDGET_BASE" fun nil (system) "Result = %s( [Parent])" (("ALIGN_BOTTOM") ("ALIGN_CENTER") ("ALIGN_LEFT") ("ALIGN_RIGHT") ("ALIGN_TOP") ("APP_MBAR") ("BASE_ALIGN_BOTTOM") ("BASE_ALIGN_CENTER") ("BASE_ALIGN_LEFT") ("BASE_ALIGN_RIGHT") ("BASE_ALIGN_TOP") ("COLUMN") ("CONTEXT_MENU") ("DISPLAY_NAME") ("EVENT_FUNC") ("EVENT_PRO") ("EXCLUSIVE") ("FLOATING") ("FRAME") ("FUNC_GET_VALUE") ("GRID_LAYOUT") ("GROUP_LEADER") ("KBRD_FOCUS_EVENTS") ("KILL_NOTIFY") ("MAP") ("MBAR") ("MODAL") ("NO_COPY") ("NONEXCLUSIVE") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("RNAME_MBAR") ("ROW") ("SCR_XSIZE") ("SCR_YSIZE") ("SCROLL") ("SENSITIVE") ("SPACE") ("TITLE") ("TLB_FRAME_ATTR") ("TLB_KILL_REQUEST_EVENTS") ("TLB_SIZE_EVENTS") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("X_SCROLL_SIZE") ("XOFFSET") ("XPAD") ("XSIZE") ("Y_SCROLL_SIZE") ("YOFFSET") ("YPAD") ("YSIZE")))
1080 ("WIDGET_BUTTON" fun nil (system) "Result = %s( Parent)" (("ALIGN_CENTER") ("ALIGN_LEFT") ("ALIGN_RIGHT") ("BITMAP") ("DYNAMIC_RESIZE") ("EVENT_FUNC") ("EVENT_PRO") ("FONT") ("FRAME") ("FUNC_GET_VALUE") ("GROUP_LEADER") ("HELP") ("KILL_NOTIFY") ("MENU") ("NO_COPY") ("NO_RELEASE") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("SCR_XSIZE") ("SCR_YSIZE") ("SENSITIVE") ("SEPARATOR") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("X_BITMAP_EXTRA") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE"))) 1080 ("WIDGET_BUTTON" fun nil (system) "Result = %s( Parent)" (("ALIGN_CENTER") ("ALIGN_LEFT") ("ALIGN_RIGHT") ("BITMAP") ("DYNAMIC_RESIZE") ("EVENT_FUNC") ("EVENT_PRO") ("FONT") ("FRAME") ("FUNC_GET_VALUE") ("GROUP_LEADER") ("HELP") ("KILL_NOTIFY") ("MENU") ("NO_COPY") ("NO_RELEASE") ("NOTIFY_REALIZE") ("PRO_SET_VALUE") ("RESOURCE_NAME") ("SCR_XSIZE") ("SCR_YSIZE") ("SENSITIVE") ("SEPARATOR") ("TRACKING_EVENTS") ("UNAME") ("UNITS") ("UVALUE") ("VALUE") ("X_BITMAP_EXTRA") ("XOFFSET") ("XSIZE") ("YOFFSET") ("YSIZE")))
@@ -1380,7 +1380,7 @@
1380 ("Init" fun "TrackBall" (system) "Result = Obj -> [%s::]%s( Center, Radius ) ('TrackBall', Center, Radius)" (("AXIS") ("CONSTRAIN") ("MOUSE"))) 1380 ("Init" fun "TrackBall" (system) "Result = Obj -> [%s::]%s( Center, Radius ) ('TrackBall', Center, Radius)" (("AXIS") ("CONSTRAIN") ("MOUSE")))
1381 ("Update" fun "TrackBall" (system) "Result = Obj -> [%s::]%s( sEvent)" (("MOUSE") ("TRANSFORM") ("TRANSLATE"))) 1381 ("Update" fun "TrackBall" (system) "Result = Obj -> [%s::]%s( sEvent)" (("MOUSE") ("TRANSFORM") ("TRANSLATE")))
1382 ) 1382 )
1383 "1324 builtin routines with 5958 keywords for IDL version 5.5.") 1383 "1324 builtin routines with 6129 keywords for IDL version 5.5.")
1384 1384
1385(setq idlwave-system-variables-alist 1385(setq idlwave-system-variables-alist
1386 '( 1386 '(
diff --git a/lisp/progmodes/idlw-shell.el b/lisp/progmodes/idlw-shell.el
index f360f690b5c..af7e4e551ac 100644
--- a/lisp/progmodes/idlw-shell.el
+++ b/lisp/progmodes/idlw-shell.el
@@ -1,11 +1,11 @@
1;; idlw-shell.el --- run IDL as an inferior process of Emacs. 1;; idlw-shell.el --- run IDL as an inferior process of Emacs.
2;; Copyright (c) 1999, 2000, 2001 Free Software Foundation 2;; Copyright (c) 1999, 2000, 2001,2002 Free Software Foundation
3 3
4;; Author: Carsten Dominik <dominik@astro.uva.nl> 4;; Author: Carsten Dominik <dominik@astro.uva.nl>
5;; Chris Chase <chase@att.com> 5;; Chris Chase <chase@att.com>
6;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu> 6;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
7;; Version: 4.14 7;; Version: 4.15
8;; Date: $Date: 2002/07/18 18:58:07 $ 8;; Date: $Date: 2002/09/12 16:35:18 $
9;; Keywords: processes 9;; Keywords: processes
10 10
11;; This file is part of GNU Emacs. 11;; This file is part of GNU Emacs.
@@ -72,12 +72,6 @@
72;; KNOWN PROBLEMS 72;; KNOWN PROBLEMS
73;; ============== 73;; ==============
74;; 74;;
75;; I don't plan on implementing directory tracking by watching the IDL
76;; commands entered at the prompt, since too often an IDL procedure
77;; will change the current directory. If you want the idl process
78;; buffer to match the IDL current working just execute `M-x
79;; idlwave-shell-resync-dirs' (bound to "\C-c\C-d\C-w" by default.)
80;;
81;; Under XEmacs the Debug menu in the shell does not display the 75;; Under XEmacs the Debug menu in the shell does not display the
82;; keybindings in the prefix map. There bindings are available anyway - so 76;; keybindings in the prefix map. There bindings are available anyway - so
83;; it is a bug in XEmacs. 77;; it is a bug in XEmacs.
@@ -117,6 +111,7 @@
117 111
118;;; Customizations: idlwave-shell group 112;;; Customizations: idlwave-shell group
119 113
114;; General/Misc. customizations
120(defgroup idlwave-shell-general-setup nil 115(defgroup idlwave-shell-general-setup nil
121 "General setup of the Shell interaction for IDLWAVE/Shell." 116 "General setup of the Shell interaction for IDLWAVE/Shell."
122 :prefix "idlwave-shell" 117 :prefix "idlwave-shell"
@@ -141,29 +136,6 @@ process output is made by surrounding this name with `*'s."
141 136
142;; (defcustom idlwave-shell-automatic-start...) See idlwave.el 137;; (defcustom idlwave-shell-automatic-start...) See idlwave.el
143 138
144(defcustom idlwave-shell-initial-commands "!more=0"
145 "Initial commands, separated by newlines, to send to IDL.
146This string is sent to the IDL process by `idlwave-shell-mode' which is
147invoked by `idlwave-shell'."
148 :group 'idlwave-shell-general-setup
149 :type 'string)
150
151(defcustom idlwave-shell-save-command-history t
152 "Non-nil means preserve command history between sessions.
153The file `idlwave-shell-command-history-file' is used to save and restore
154the history."
155 :group 'idlwave-shell-general-setup
156 :type 'boolean)
157
158(defcustom idlwave-shell-command-history-file "~/.idlwhist"
159 "The file in which the command history of the idlwave shell is saved.
160In order to change the size of the history, see the variable
161`comint-input-ring-size'.
162The history is only saved if the variable `idlwave-shell-save-command-history'
163is non-nil."
164 :group 'idlwave-shell-general-setup
165 :type 'file)
166
167(defcustom idlwave-shell-use-dedicated-frame nil 139(defcustom idlwave-shell-use-dedicated-frame nil
168 "*Non-nil means, IDLWAVE should use a special frame to display shell buffer." 140 "*Non-nil means, IDLWAVE should use a special frame to display shell buffer."
169 :group 'idlwave-shell-general-setup 141 :group 'idlwave-shell-general-setup
@@ -198,19 +170,6 @@ t Arrows force the cursor back to the current command line and
198 (const :tag "in command line only" cmdline))) 170 (const :tag "in command line only" cmdline)))
199 171
200;; FIXME: add comint-input-ring-size? 172;; FIXME: add comint-input-ring-size?
201(defcustom idlwave-shell-comint-settings
202 '((comint-scroll-to-bottom-on-input . t)
203 (comint-scroll-to-bottom-on-output . nil)
204 (comint-scroll-show-maximum-output . t)
205 )
206 "Alist of special settings for the comint variables in the IDLWAVE Shell.
207Each entry is a cons cell with the name of a variable and a value.
208The function `idlwave-shell-mode' will make local variables out of each entry.
209Changes to this variable will only be active when the shell buffer is
210newly created."
211 :group 'idlwave-shell-general-setup
212 :type '(repeat
213 (cons variable sexp)))
214 173
215(defcustom idlwave-shell-use-toolbar t 174(defcustom idlwave-shell-use-toolbar t
216 "*Non-nil means, use the debugging toolbar in all IDL related buffers. 175 "*Non-nil means, use the debugging toolbar in all IDL related buffers.
@@ -268,7 +227,7 @@ to set this option to nil."
268 :group 'idlwave-shell-general-setup 227 :group 'idlwave-shell-general-setup
269 :type 'boolean) 228 :type 'boolean)
270 229
271(defcustom idlwave-shell-file-name-chars "~/A-Za-z0-9+@:_.$#%={}\\-" 230(defcustom idlwave-shell-file-name-chars "~/A-Za-z0-9+:_.$#%={}\\-"
272 "The characters allowed in file names, as a string. 231 "The characters allowed in file names, as a string.
273Used for file name completion. Must not contain `'', `,' and `\"' 232Used for file name completion. Must not contain `'', `,' and `\"'
274because these are used as separators by IDL." 233because these are used as separators by IDL."
@@ -280,8 +239,58 @@ because these are used as separators by IDL."
280 :group 'idlwave-shell-general-setup 239 :group 'idlwave-shell-general-setup
281 :type 'hook) 240 :type 'hook)
282 241
283(defvar idlwave-shell-print-expression-function nil 242(defcustom idlwave-shell-graphics-window-size '(500 400)
284 "*OBSOLETE VARIABLE, is no longer used.") 243 "Size of IDL graphics windows popped up by special IDLWAVE command.
244The command is `C-c C-d C-f' and accepts as a prefix the window nr.
245A command like `WINDOW,N,xsize=XX,ysize=YY' is sent to IDL."
246 :group 'idlwave-shell-general-setup
247 :type '(list
248 (integer :tag "x size")
249 (integer :tag "y size")))
250
251;; Commands Sent to Shell... etc.
252(defgroup idlwave-shell-command-setup nil
253 "Setup for command parameters of the Shell interaction for IDLWAVE."
254 :prefix "idlwave-shell"
255 :group 'idlwave)
256
257(defcustom idlwave-shell-initial-commands "!more=0"
258 "Initial commands, separated by newlines, to send to IDL.
259This string is sent to the IDL process by `idlwave-shell-mode' which is
260invoked by `idlwave-shell'."
261 :group 'idlwave-shell-command-setup
262 :type 'string)
263
264(defcustom idlwave-shell-save-command-history t
265 "Non-nil means preserve command history between sessions.
266The file `idlwave-shell-command-history-file' is used to save and restore
267the history."
268 :group 'idlwave-shell-command-setup
269 :type 'boolean)
270
271(defcustom idlwave-shell-command-history-file "~/.idlwhist"
272 "The file in which the command history of the idlwave shell is saved.
273In order to change the size of the history, see the variable
274`comint-input-ring-size'.
275The history is only saved if the variable `idlwave-shell-save-command-history'
276is non-nil."
277 :group 'idlwave-shell-command-setup
278 :type 'file)
279
280(defcustom idlwave-shell-show-commands
281 '(run misc breakpoint)
282 "*A list of command types to show output from in the shell.
283Possibilities are 'run, 'debug, 'breakpoint, and 'misc . Unlisted
284types are not displayed in the shell. The single type 'everything
285causes all the copious shell traffic to be displayed."
286 :group 'idlwave-shell-command-setup
287 :type '(choice
288 (const everything)
289 (set :tag "Checklist" :greedy t
290 (const :tag "All .run and .compile commands" run)
291 (const :tag "All breakpoint commands" breakpoint)
292 (const :tag "All debug and stepping commands" debug)
293 (const :tag "Return, close, etc. commands" misc))))
285 294
286(defcustom idlwave-shell-examine-alist 295(defcustom idlwave-shell-examine-alist
287 '(("Print" . "print,___") 296 '(("Print" . "print,___")
@@ -299,24 +308,46 @@ The keys are used in the selection popup created by
299`idlwave-shell-examine-select', and the corresponding value is sent as 308`idlwave-shell-examine-select', and the corresponding value is sent as
300a command to the shell, with special sequence `___' replaced by the 309a command to the shell, with special sequence `___' replaced by the
301expression being examined." 310expression being examined."
302 :group 'idlwave-shell-general-setup 311 :group 'idlwave-shell-command-setup
303 :type '(repeat 312 :type '(repeat
304 (cons 313 (cons
305 (string :tag "Label ") 314 (string :tag "Label ")
306 (string :tag "Command")))) 315 (string :tag "Command"))))
307 316
317(defvar idlwave-shell-print-expression-function nil
318 "*OBSOLETE VARIABLE, is no longer used.")
319
308(defcustom idlwave-shell-separate-examine-output t 320(defcustom idlwave-shell-separate-examine-output t
309 "*Non-nil mean, put output of examine commands in their own buffer." 321 "*Non-nil mean, put output of examine commands in their own buffer."
310 :group 'idlwave-shell-general-setup 322 :group 'idlwave-shell-command-setup
311 :type 'boolean) 323 :type 'boolean)
312 324
325(defcustom idlwave-shell-comint-settings
326 '((comint-scroll-to-bottom-on-input . t)
327 (comint-scroll-to-bottom-on-output . t)
328 (comint-scroll-show-maximum-output . nil))
329
330 "Alist of special settings for the comint variables in the IDLWAVE Shell.
331Each entry is a cons cell with the name of a variable and a value.
332The function `idlwave-shell-mode' will make local variables out of each entry.
333Changes to this variable will only be active when the shell buffer is
334newly created."
335 :group 'idlwave-shell-command-setup
336 :type '(repeat
337 (cons variable sexp)))
338
339(defcustom idlwave-shell-query-for-class t
340 "*Non-nil means query the shell for object class on object completions."
341 :group 'idlwave-shell-command-setup
342 :type 'boolean)
343
313(defcustom idlwave-shell-use-input-mode-magic nil 344(defcustom idlwave-shell-use-input-mode-magic nil
314 "*Non-nil means, IDLWAVE should check for input mode spells in output. 345 "*Non-nil means, IDLWAVE should check for input mode spells in output.
315The spells are strings printed by your IDL program and matched 346The spells are strings printed by your IDL program and matched
316by the regular expressions in `idlwave-shell-input-mode-spells'. 347by the regular expressions in `idlwave-shell-input-mode-spells'.
317When these expressions match, IDLWAVE switches to character input mode and 348When these expressions match, IDLWAVE switches to character input mode and
318back, respectively. See `idlwave-shell-input-mode-spells' for details." 349back, respectively. See `idlwave-shell-input-mode-spells' for details."
319 :group 'idlwave-shell-general-setup 350 :group 'idlwave-shell-command-setup
320 :type 'boolean) 351 :type 'boolean)
321 352
322(defcustom idlwave-shell-input-mode-spells 353(defcustom idlwave-shell-input-mode-spells
@@ -372,23 +403,14 @@ pro idlwave_char_input,on=on,off=off
372 else print,'<onechar>' 403 else print,'<onechar>'
373 endif 404 endif
374end" 405end"
375 :group 'idlwave-shell-general-setup 406 :group 'idlwave-shell-command-setup
376 :type '(list 407 :type '(list
377 (regexp :tag "One-char regexp") 408 (regexp :tag "One-char regexp")
378 (regexp :tag "Char-mode regexp") 409 (regexp :tag "Char-mode regexp")
379 (regexp :tag "Line-mode regexp"))) 410 (regexp :tag "Line-mode regexp")))
380 411
381(defcustom idlwave-shell-graphics-window-size '(500 400)
382 "Size of IDL graphics windows popped up by special IDLWAVE command.
383The command is `C-c C-d C-f' and accepts as a prefix the window nr.
384A command like `WINDOW,N,xsize=XX,ysize=YY' is sent to IDL."
385 :group 'idlwave-shell-general-setup
386 :type '(list
387 (integer :tag "x size")
388 (integer :tag "y size")))
389
390;;; Breakpoint Overlays etc
391 412
413;; Breakpoint Overlays etc
392(defgroup idlwave-shell-highlighting-and-faces nil 414(defgroup idlwave-shell-highlighting-and-faces nil
393 "Highlighting and Faces used by the IDLWAVE Shell mode." 415 "Highlighting and Faces used by the IDLWAVE Shell mode."
394 :prefix "idlwave-shell" 416 :prefix "idlwave-shell"
@@ -540,12 +562,10 @@ idlwave-shell-temp-rinfo-save-file is set (respectively)."
540This is used to speed up the reloading of the routine info procedure 562This is used to speed up the reloading of the routine info procedure
541before use by the shell.") 563before use by the shell.")
542 564
543(defvar idlwave-shell-dirstack-query "printd" 565(defvar idlwave-shell-dirstack-query "cd,current=___cur & print,___cur"
544 "Command used by `idlwave-shell-resync-dirs' to query IDL for 566 "Command used by `idlwave-shell-resync-dirs' to query IDL for
545the directory stack.") 567the directory stack.")
546 568
547(defvar idlwave-shell-wd-is-synched nil)
548
549(defvar idlwave-shell-path-query "__pa=expand_path(!path,/array)&for i=0,n_elements(__pa)-1 do print,'PATH:<'+__pa[i]+'>'&print,'SYSDIR:<'+!dir+'>'" 569(defvar idlwave-shell-path-query "__pa=expand_path(!path,/array)&for i=0,n_elements(__pa)-1 do print,'PATH:<'+__pa[i]+'>'&print,'SYSDIR:<'+!dir+'>'"
550 "The command which gets !PATH and !DIR infor from the shell.") 570 "The command which gets !PATH and !DIR infor from the shell.")
551 571
@@ -661,6 +681,9 @@ with `*'s."
661(defvar idlwave-shell-ready nil 681(defvar idlwave-shell-ready nil
662 "If non-nil can send next command to IDL process.") 682 "If non-nil can send next command to IDL process.")
663 683
684(defvar idlwave-shell-wait-for-output nil
685 "Whether to wait for output to accumulate.")
686
664;;; The following are the types of messages we attempt to catch to 687;;; The following are the types of messages we attempt to catch to
665;;; resync our idea of where IDL execution currently is. 688;;; resync our idea of where IDL execution currently is.
666;;; 689;;;
@@ -833,11 +856,17 @@ IDL has currently stepped.")
833 (idlwave-shell-display-line nil) 856 (idlwave-shell-display-line nil)
834 (setq idlwave-shell-calling-stack-index 0) 857 (setq idlwave-shell-calling-stack-index 0)
835 858
859 (when idlwave-shell-query-for-class
860 (add-to-list (make-local-variable 'idlwave-determine-class-special)
861 'idlwave-shell-get-object-class)
862 (setq idlwave-store-inquired-class t))
863
836 ;; Make sure comint-last-input-end does not go to beginning of 864 ;; Make sure comint-last-input-end does not go to beginning of
837 ;; buffer (in case there were other processes already in this buffer). 865 ;; buffer (in case there were other processes already in this buffer).
838 (set-marker comint-last-input-end (point)) 866 (set-marker comint-last-input-end (point))
839 (setq idlwave-idlwave_routine_info-compiled nil) 867 (setq idlwave-idlwave_routine_info-compiled nil)
840 (setq idlwave-shell-ready nil) 868 (setq idlwave-shell-ready nil)
869 (setq idlwave-shell-wait-for-output nil)
841 (setq idlwave-shell-bp-alist nil) 870 (setq idlwave-shell-bp-alist nil)
842 (idlwave-shell-update-bp-overlays) ; Throw away old overlays 871 (idlwave-shell-update-bp-overlays) ; Throw away old overlays
843 (setq idlwave-shell-sources-alist nil) 872 (setq idlwave-shell-sources-alist nil)
@@ -1016,24 +1045,38 @@ See also the variable `idlwave-shell-prompt-pattern'.
1016 (idlwave-shell arg) 1045 (idlwave-shell arg)
1017 (select-window window))) 1046 (select-window window)))
1018 1047
1048(defun idlwave-shell-hide-p (type)
1049 "Whether to hide this type of command.
1050Return either nil or 'hide."
1051 (if (listp idlwave-shell-show-commands)
1052 (if (not (memq type idlwave-shell-show-commands)) 'hide)))
1053
1019(defun idlwave-shell-send-command (&optional cmd pcmd hide preempt) 1054(defun idlwave-shell-send-command (&optional cmd pcmd hide preempt)
1020 "Send a command to IDL process. 1055 "Send a command to IDL process.
1021 1056
1022\(CMD PCMD HIDE\) are placed at the end of `idlwave-shell-pending-commands'. 1057\(CMD PCMD HIDE\) are placed at the end of
1023If IDL is ready the first command, CMD, in 1058` idlwave-shell-pending-commands'. If IDL is ready the first command,
1024`idlwave-shell-pending-commands' is sent to the IDL process. If optional 1059CMD, in `idlwave-shell-pending-commands' is sent to the IDL process.
1025second argument PCMD is non-nil it will be placed on 1060If optional second argument PCMD is non-nil it will be placed on
1026`idlwave-shell-post-command-hook' when CMD is executed. If the optional 1061`idlwave-shell-post-command-hook' when CMD is executed. If the
1027third argument HIDE is non-nil, then hide output from CMD. 1062optional third argument HIDE is non-nil, then hide output from CMD.
1028If optional fourth argument PREEMPT is non-nil CMD is put at front of 1063If optional fourth argument PREEMPT is non-nil CMD is put at front of
1029`idlwave-shell-pending-commands'. 1064`idlwave-shell-pending-commands'. If PREEMPT is 'wait, wait for all
1030 1065output to complete and the next prompt to arrive before returning
1031IDL is considered ready if the prompt is present 1066\(useful if you need an answer now\). IDL is considered ready if the
1032and if `idlwave-shell-ready' is non-nil." 1067prompt is present and if `idlwave-shell-ready' is non-nil."
1033 1068
1034 ;(setq hide nil) ; FIXME: turn this on for debugging only 1069; (setq hide nil) ; FIXME: turn this on for debugging only
1035; (message "SENDING %s|||%s" cmd pcmd) ;?????????????????????? 1070; (if (null cmd)
1036 (let (buf proc) 1071; (progn
1072; (message "SENDING Pending commands: %s"
1073; (prin1-to-string idlwave-shell-pending-commands)))
1074; (message "SENDING %s|||%s" cmd pcmd))
1075 (if (and (symbolp idlwave-shell-show-commands)
1076 (eq idlwave-shell-show-commands 'everything))
1077 (setq hide nil))
1078 (let ((save-buffer (current-buffer))
1079 buf proc)
1037 ;; Get or make the buffer and its process 1080 ;; Get or make the buffer and its process
1038 (if (or (not (setq buf (get-buffer (idlwave-shell-buffer)))) 1081 (if (or (not (setq buf (get-buffer (idlwave-shell-buffer))))
1039 (not (setq proc (get-buffer-process buf)))) 1082 (not (setq proc (get-buffer-process buf))))
@@ -1047,51 +1090,53 @@ and if `idlwave-shell-ready' is non-nil."
1047 (not (setq proc (get-buffer-process buf)))) 1090 (not (setq proc (get-buffer-process buf))))
1048 ;; Still nothing 1091 ;; Still nothing
1049 (error "Problem with autostarting IDL shell")))) 1092 (error "Problem with autostarting IDL shell"))))
1050 1093 (when (or cmd idlwave-shell-pending-commands)
1051 (save-excursion
1052 (set-buffer buf) 1094 (set-buffer buf)
1053 (goto-char (process-mark proc))
1054 ;; To make this easy, always push CMD onto pending commands 1095 ;; To make this easy, always push CMD onto pending commands
1055 (if cmd 1096 (if cmd
1056 (setq idlwave-shell-pending-commands 1097 (setq idlwave-shell-pending-commands
1057 (if preempt 1098 (if preempt
1058 ;; Put at front. 1099 ;; Put at front.
1059 (append (list (list cmd pcmd hide)) 1100 (append (list (list cmd pcmd hide))
1060 idlwave-shell-pending-commands) 1101 idlwave-shell-pending-commands)
1061 ;; Put at end. 1102 ;; Put at end.
1062 (append idlwave-shell-pending-commands 1103 (append idlwave-shell-pending-commands
1063 (list (list cmd pcmd hide)))))) 1104 (list (list cmd pcmd hide))))))
1064 ;; Check if IDL ready 1105 ;; Check if IDL ready
1065 (if (and idlwave-shell-ready 1106 (let ((save-point (point-marker)))
1066 ;; Check for IDL prompt 1107 (goto-char (process-mark proc))
1067 (save-excursion 1108 (if (and idlwave-shell-ready
1068 (forward-line 0) 1109 ;; Check for IDL prompt
1069 ;; (beginning-of-line) ; Changed for Emacs 21 1110 (prog2
1070 (looking-at idlwave-shell-prompt-pattern))) 1111 (forward-line 0)
1071 ;; IDL ready for command 1112 ;; (beginning-of-line) ; Changed for Emacs 21
1072 (if idlwave-shell-pending-commands 1113 (looking-at idlwave-shell-prompt-pattern)
1073 ;; execute command 1114 (goto-char (process-mark proc))))
1074 (let* ((lcmd (car idlwave-shell-pending-commands)) 1115 ;; IDL ready for command, execute it
1075 (cmd (car lcmd)) 1116 (let* ((lcmd (car idlwave-shell-pending-commands))
1076 (pcmd (nth 1 lcmd)) 1117 (cmd (car lcmd))
1077 (hide (nth 2 lcmd))) 1118 (pcmd (nth 1 lcmd))
1078 ;; If this is an executive command, reset the stack pointer 1119 (hide (nth 2 lcmd)))
1079 (if (eq (string-to-char cmd) ?.) 1120 ;; If this is an executive command, reset the stack pointer
1080 (setq idlwave-shell-calling-stack-index 0)) 1121 (if (eq (string-to-char cmd) ?.)
1081 ;; Set post-command 1122 (setq idlwave-shell-calling-stack-index 0))
1082 (setq idlwave-shell-post-command-hook pcmd) 1123 ;; Set post-command
1083 ;; Output hiding 1124 (setq idlwave-shell-post-command-hook pcmd)
1084;;; Debug code 1125 ;; Output hiding
1085;;; (setq idlwave-shell-hide-output nil) 1126 (setq idlwave-shell-hide-output hide)
1086 (setq idlwave-shell-hide-output hide) 1127 ;; Pop command
1087 ;; Pop command 1128 (setq idlwave-shell-pending-commands
1088 (setq idlwave-shell-pending-commands 1129 (cdr idlwave-shell-pending-commands))
1089 (cdr idlwave-shell-pending-commands)) 1130 ;; Send command for execution
1090 ;; Send command for execution 1131 (set-marker comint-last-input-start (point))
1091 (set-marker comint-last-input-start (point)) 1132 (set-marker comint-last-input-end (point))
1092 (set-marker comint-last-input-end (point)) 1133 (comint-simple-send proc cmd)
1093 (comint-simple-send proc cmd) 1134 (setq idlwave-shell-ready nil)
1094 (setq idlwave-shell-ready nil))))))) 1135 (when (equal preempt 'wait) ; Get all the output at once
1136 (setq idlwave-shell-wait-for-output t)
1137 (accept-process-output proc))))
1138 (goto-char save-point))
1139 (set-buffer save-buffer))))
1095 1140
1096(defun idlwave-shell-send-char (c &optional no-error) 1141(defun idlwave-shell-send-char (c &optional no-error)
1097 "Send one character to the shell, without a newline." 1142 "Send one character to the shell, without a newline."
@@ -1172,38 +1217,36 @@ when the IDL prompt gets displayed again after the current IDL command."
1172 (and (eq idlwave-shell-char-mode-active 'exit) 1217 (and (eq idlwave-shell-char-mode-active 'exit)
1173 (throw 'exit "Single char loop exited")))))))) 1218 (throw 'exit "Single char loop exited"))))))))
1174 1219
1175(defun idlwave-shell-up-or-history (&optional arg) 1220(defun idlwave-shell-move-or-history (up &optional arg)
1176 "When in last line of process buffer, do `comint-previous-input'. 1221 "When in last line of process buffer, do `comint-previous-input'.
1177Otherwise just do `previous-line'." 1222Otherwise just move the line. Move down unless UP is non-nil."
1223 (let* ((proc-pos (marker-position
1224 (process-mark (get-buffer-process (current-buffer)))))
1225 (arg (or arg 1))
1226 (arg (if up arg (- arg))))
1227 (if (eq t idlwave-shell-arrows-do-history) (goto-char proc-pos))
1228 (if (and idlwave-shell-arrows-do-history
1229 (>= (1+ (save-excursion (end-of-line) (point))) proc-pos))
1230 (progn
1231 (goto-char proc-pos)
1232 (and (not (eolp)) (kill-line nil))
1233 (comint-previous-input arg))
1234 (previous-line arg))))
1235
1236(defun idlwave-shell-up-or-history (&optional arg)
1237"When in last line of process buffer, move to previous input.
1238 Otherwise just go up one line."
1178 (interactive "p") 1239 (interactive "p")
1179 (if (eq t idlwave-shell-arrows-do-history) (goto-char (point-max))) 1240 (idlwave-shell-move-or-history t arg))
1180 (if (and idlwave-shell-arrows-do-history
1181 (>= (1+ (save-excursion (end-of-line) (point)))
1182 (marker-position
1183 (process-mark (get-buffer-process (current-buffer))))))
1184 (progn
1185 (and (not (eolp)) (kill-line nil))
1186 (comint-previous-input arg))
1187 (previous-line arg)))
1188 1241
1189(defun idlwave-shell-down-or-history (&optional arg) 1242(defun idlwave-shell-down-or-history (&optional arg)
1190 "When in last line of process buffer, do `comint-next-input'. 1243"When in last line of process buffer, move to next input.
1191 Otherwise just do `next-line'." 1244 Otherwise just go down one line."
1192 (interactive "p") 1245 (interactive "p")
1193 (if (eq t idlwave-shell-arrows-do-history) (goto-char (point-max))) 1246 (idlwave-shell-move-or-history nil arg))
1194 (if (and idlwave-shell-arrows-do-history
1195 (>= (1+ (save-excursion (end-of-line) (point)))
1196 (marker-position
1197 (process-mark (get-buffer-process (current-buffer))))))
1198 (progn
1199 (and (not (eolp)) (kill-line nil))
1200 (comint-next-input arg))
1201 (next-line arg)))
1202
1203;; There was a report that a newer version of comint.el changed the
1204;; name of comint-filter to comint-output-filter. Unfortunately, we
1205;; have yet to upgrade.
1206 1247
1248;; Newer versions of comint.el changed the name of comint-filter to
1249;; comint-output-filter.
1207(defun idlwave-shell-comint-filter (process string) nil) 1250(defun idlwave-shell-comint-filter (process string) nil)
1208(if (fboundp 'comint-output-filter) 1251(if (fboundp 'comint-output-filter)
1209 (fset 'idlwave-shell-comint-filter (symbol-function 'comint-output-filter)) 1252 (fset 'idlwave-shell-comint-filter (symbol-function 'comint-output-filter))
@@ -1223,7 +1266,6 @@ and then calls `idlwave-shell-send-command' for any pending commands."
1223 ;; We no longer do the cleanup here - this is done by the process sentinel 1266 ;; We no longer do the cleanup here - this is done by the process sentinel
1224 (when (eq (process-status idlwave-shell-process-name) 'run) 1267 (when (eq (process-status idlwave-shell-process-name) 'run)
1225 ;; OK, process is still running, so we can use it. 1268 ;; OK, process is still running, so we can use it.
1226 (setq idlwave-shell-wd-is-synched nil) ;; something might have changed cwd
1227 (let ((data (match-data)) p) 1269 (let ((data (match-data)) p)
1228 (unwind-protect 1270 (unwind-protect
1229 (progn 1271 (progn
@@ -1252,7 +1294,7 @@ and then calls `idlwave-shell-send-command' for any pending commands."
1252 (get-buffer-create idlwave-shell-hidden-output-buffer)) 1294 (get-buffer-create idlwave-shell-hidden-output-buffer))
1253 (goto-char (point-max)) 1295 (goto-char (point-max))
1254 (insert string)) 1296 (insert string))
1255 (idlwave-shell-comint-filter proc string)) 1297 (idlwave-shell-comint-filter proc string))
1256 ;; Watch for magic - need to accumulate the current line 1298 ;; Watch for magic - need to accumulate the current line
1257 ;; since it may not be sent all at once. 1299 ;; since it may not be sent all at once.
1258 (if (string-match "\n" string) 1300 (if (string-match "\n" string)
@@ -1266,46 +1308,44 @@ and then calls `idlwave-shell-send-command' for any pending commands."
1266 (match-end 0))))) 1308 (match-end 0)))))
1267 (setq idlwave-shell-accumulation 1309 (setq idlwave-shell-accumulation
1268 (concat idlwave-shell-accumulation string))) 1310 (concat idlwave-shell-accumulation string)))
1269 1311
1270 1312
1271;;; Test/Debug code 1313;;; Test/Debug code
1272; (save-excursion (set-buffer 1314; (save-excursion (set-buffer
1273; (get-buffer-create "*idlwave-shell-output*")) 1315; (get-buffer-create "*idlwave-shell-output*"))
1274; (goto-char (point-max)) 1316; (goto-char (point-max))
1275; (insert "\nSTRING===>\n" string "\n<====\n")) 1317; (insert "\nSTRING===>\n" string "\n<====\n"))
1276 1318
1277 ;; Check for prompt in current accumulating line 1319 ;; Check for prompt in current accumulating output
1278 (if (setq idlwave-shell-ready 1320 (if (setq idlwave-shell-ready
1279 (string-match idlwave-shell-prompt-pattern 1321 (string-match idlwave-shell-prompt-pattern
1280 idlwave-shell-accumulation)) 1322 idlwave-shell-accumulation))
1281 (progn 1323 (progn
1282 (if idlwave-shell-hide-output 1324 (if idlwave-shell-hide-output
1283 (save-excursion 1325 (save-excursion
1284 (set-buffer idlwave-shell-hidden-output-buffer) 1326 (set-buffer idlwave-shell-hidden-output-buffer)
1285; (goto-char (point-min)) 1327 (goto-char (point-max))
1286; (re-search-forward idlwave-shell-prompt-pattern nil t) 1328 (re-search-backward idlwave-shell-prompt-pattern nil t)
1287 (goto-char (point-max))
1288 (re-search-backward idlwave-shell-prompt-pattern nil t)
1289 (goto-char (match-end 0)) 1329 (goto-char (match-end 0))
1290 (setq idlwave-shell-command-output 1330 (setq idlwave-shell-command-output
1291 (buffer-substring (point-min) (point))) 1331 (buffer-substring (point-min) (point)))
1292;; Test/Debug 1332
1333;;; Test/Debug
1293; (save-excursion (set-buffer 1334; (save-excursion (set-buffer
1294; (get-buffer-create "*idlwave-shell-output*")) 1335; (get-buffer-create "*idlwave-shell-output*"))
1295; (goto-char (point-max)) 1336; (goto-char (point-max))
1296; (insert "\nOUPUT===>\n" idlwave-shell-command-output "\n<===\n")) 1337; (insert "\nOUPUT===>\n" idlwave-shell-command-output "\n<===\n"))
1297 1338
1298 (delete-region (point-min) (point))) 1339 (delete-region (point-min) (point)))
1299 (setq idlwave-shell-command-output 1340 (setq idlwave-shell-command-output
1300 (save-excursion 1341 (with-current-buffer (process-buffer proc)
1301 (set-buffer 1342 (buffer-substring
1302 (process-buffer proc)) 1343 (save-excursion
1303 (buffer-substring 1344 (goto-char (process-mark proc))
1304 (progn 1345 (beginning-of-line nil)
1305 (goto-char (process-mark proc)) 1346 (point))
1306 (beginning-of-line nil) 1347 comint-last-input-end))))
1307 (point)) 1348
1308 comint-last-input-end))))
1309 ;; Scan for state and do post command - bracket them 1349 ;; Scan for state and do post command - bracket them
1310 ;; with idlwave-shell-ready=nil since they 1350 ;; with idlwave-shell-ready=nil since they
1311 ;; may call idlwave-shell-send-command. 1351 ;; may call idlwave-shell-send-command.
@@ -1321,10 +1361,19 @@ and then calls `idlwave-shell-send-command' for any pending commands."
1321 (setq idlwave-shell-accumulation nil 1361 (setq idlwave-shell-accumulation nil
1322 idlwave-shell-command-output nil 1362 idlwave-shell-command-output nil
1323 idlwave-shell-post-command-hook nil 1363 idlwave-shell-post-command-hook nil
1324 idlwave-shell-hide-output nil)) 1364 idlwave-shell-hide-output nil
1365 idlwave-shell-wait-for-output nil))
1325 ;; Done with post command. Do pending command if 1366 ;; Done with post command. Do pending command if
1326 ;; any. 1367 ;; any.
1327 (idlwave-shell-send-command)))) 1368 (idlwave-shell-send-command))
1369 ;; We didn't get the prompt yet... maybe accept more output
1370 (when idlwave-shell-wait-for-output
1371;;; Test/Debug code
1372; (save-excursion (set-buffer
1373; (get-buffer-create "*idlwave-shell-output*"))
1374; (goto-char (point-max))
1375; (insert "\n<=== WAITING ON OUTPUT ==>\n"))
1376 (accept-process-output proc nil 100))))
1328 (store-match-data data))))) 1377 (store-match-data data)))))
1329 1378
1330(defun idlwave-shell-sentinel (process event) 1379(defun idlwave-shell-sentinel (process event)
@@ -1367,75 +1416,63 @@ messages. We ignore error messages otherwise.
1367For breakpoint messages process any attached count or command 1416For breakpoint messages process any attached count or command
1368parameters. 1417parameters.
1369Update the windows if a message is found." 1418Update the windows if a message is found."
1370 (let (update) 1419 (cond
1371 (cond 1420 ;; Make sure we have output
1372 ;; Make sure we have output 1421 ((not idlwave-shell-command-output))
1373 ((not idlwave-shell-command-output)) 1422
1374 1423 ;; First Priority: Syntax and other errors
1375 ;; Various types of HALT messages. 1424 ((or
1376 ((string-match idlwave-shell-halt-messages-re 1425 (string-match idlwave-shell-syntax-error idlwave-shell-command-output)
1377 idlwave-shell-command-output) 1426 (string-match idlwave-shell-other-error idlwave-shell-command-output))
1378 ;; Grab the file and line state info. 1427 (save-excursion
1379 (setq idlwave-shell-calling-stack-index 0) 1428 (set-buffer
1380 (setq idlwave-shell-halt-frame 1429 (get-buffer-create idlwave-shell-error-buffer))
1381 (idlwave-shell-parse-line 1430 (erase-buffer)
1382 (substring idlwave-shell-command-output (match-end 0))) 1431 (insert idlwave-shell-command-output)
1383 update t)) 1432 (goto-char (point-min))
1384 1433 (setq idlwave-shell-error-last (point)))
1385 ;; Handle breakpoints separately 1434 (idlwave-shell-goto-next-error))
1386 ((string-match idlwave-shell-break-message 1435
1387 idlwave-shell-command-output) 1436 ;; Second Priority: Various types of HALT messages.
1388 (setq idlwave-shell-calling-stack-index 0) 1437 ((string-match idlwave-shell-halt-messages-re
1389 (setq idlwave-shell-halt-frame 1438 idlwave-shell-command-output)
1390 (idlwave-shell-parse-line 1439 ;; Grab the file and line state info.
1391 (substring idlwave-shell-command-output (match-end 0))) 1440 (setq idlwave-shell-calling-stack-index 0)
1392 update t) 1441 (setq idlwave-shell-halt-frame
1393 ;; We used to to counting hits on breakpoints 1442 (idlwave-shell-parse-line
1394 ;; this is no longer supported since IDL breakpoints 1443 (substring idlwave-shell-command-output (match-end 0))))
1395 ;; have learned counting. 1444 (idlwave-shell-display-line (idlwave-shell-pc-frame)))
1396 ;; Do breakpoint command processing 1445
1397 (let ((bp (assoc 1446 ;; Last Priority: Breakpoints
1398 (list 1447 ((string-match idlwave-shell-break-message
1399 (nth 0 idlwave-shell-halt-frame) 1448 idlwave-shell-command-output)
1400 (nth 1 idlwave-shell-halt-frame)) 1449 (setq idlwave-shell-calling-stack-index 0)
1401 idlwave-shell-bp-alist))) 1450 (setq idlwave-shell-halt-frame
1402 (if bp 1451 (idlwave-shell-parse-line
1403 (let ((cmd (idlwave-shell-bp-get bp 'cmd))) 1452 (substring idlwave-shell-command-output (match-end 0))))
1404 (if cmd 1453 ;; We used to count hits on breakpoints
1405 ;; Execute command 1454 ;; this is no longer supported since IDL breakpoints
1406 (if (listp cmd) 1455 ;; have learned counting.
1407 (eval cmd) 1456 ;; Do breakpoint command processing
1408 (funcall cmd)))) 1457 (let ((bp (assoc
1409 ;; A breakpoint that we did not know about - perhaps it was 1458 (list
1410 ;; set by the user or IDL isn't reporting breakpoints like 1459 (nth 0 idlwave-shell-halt-frame)
1411 ;; we expect. Lets update our list. 1460 (nth 1 idlwave-shell-halt-frame))
1412 (idlwave-shell-bp-query))))) 1461 idlwave-shell-bp-alist)))
1413 1462 (if bp
1414 ;; Handle compilation errors in addition to the above 1463 (let ((cmd (idlwave-shell-bp-get bp 'cmd)))
1415 (if (and idlwave-shell-command-output 1464 (if cmd
1416 (or (string-match 1465 ;; Execute command
1417 idlwave-shell-syntax-error idlwave-shell-command-output) 1466 (if (listp cmd) (eval cmd) (funcall cmd))))
1418 (string-match 1467 ;; A breakpoint that we did not know about - perhaps it was
1419 idlwave-shell-other-error idlwave-shell-command-output))) 1468 ;; set by the user or IDL isn't reporting breakpoints like
1420 (progn 1469 ;; we expect. Lets update our list.
1421 (save-excursion 1470 (idlwave-shell-bp-query)))
1422 (set-buffer 1471 (idlwave-shell-display-line (idlwave-shell-pc-frame)))))
1423 (get-buffer-create idlwave-shell-error-buffer))
1424 (erase-buffer)
1425 (insert idlwave-shell-command-output)
1426 (goto-char (point-min))
1427 (setq idlwave-shell-error-last (point)))
1428 (idlwave-shell-goto-next-error)))
1429
1430 ;; Do update
1431 (when update
1432 (idlwave-shell-display-line (idlwave-shell-pc-frame)))))
1433
1434 1472
1435(defvar idlwave-shell-error-buffer " *idlwave-shell-errors*" 1473(defvar idlwave-shell-error-buffer " *idlwave-shell-errors*"
1436 "Buffer containing syntax errors from IDL compilations.") 1474 "Buffer containing syntax errors from IDL compilations.")
1437 1475
1438
1439;; FIXME: the following two variables do not currently allow line breaks 1476;; FIXME: the following two variables do not currently allow line breaks
1440;; in module and file names. I am not sure if it will be necessary to 1477;; in module and file names. I am not sure if it will be necessary to
1441;; change this. Currently it seems to work the way it is. 1478;; change this. Currently it seems to work the way it is.
@@ -1498,7 +1535,8 @@ plus garbage match an existing regular file. This is hopefully very
1498unlikely." 1535unlikely."
1499 1536
1500 (let (number procedure file) 1537 (let (number procedure file)
1501 (when (string-match idlwave-shell-file-line-message string) 1538 (when (and (not (string-match ":\\s-*\\$MAIN" string))
1539 (string-match idlwave-shell-file-line-message string))
1502 (setq procedure (match-string 1 string) 1540 (setq procedure (match-string 1 string)
1503 number (match-string 3 string) 1541 number (match-string 3 string)
1504 file (match-string 5 string)) 1542 file (match-string 5 string))
@@ -1554,7 +1592,7 @@ file name."
1554 idlwave-shell-command-line-to-execute nil 1592 idlwave-shell-command-line-to-execute nil
1555 idlwave-shell-bp-alist nil 1593 idlwave-shell-bp-alist nil
1556 idlwave-shell-calling-stack-index 0 1594 idlwave-shell-calling-stack-index 0
1557 idlwave-idlwave_routine_info-compiled nil) 1595 idlwave-idlwave_routine_info-compile nil)
1558 (idlwave-shell-delete-temp-files) 1596 (idlwave-shell-delete-temp-files)
1559 (idlwave-shell-display-line nil) 1597 (idlwave-shell-display-line nil)
1560 (idlwave-shell-update-bp-overlays) ; kill old overlays 1598 (idlwave-shell-update-bp-overlays) ; kill old overlays
@@ -1585,27 +1623,28 @@ The size is given by `idlwave-shell-graphics-window-size'."
1585 (let ((n (if n (prefix-numeric-value n) 0))) 1623 (let ((n (if n (prefix-numeric-value n) 0)))
1586 (idlwave-shell-send-command 1624 (idlwave-shell-send-command
1587 (apply 'format "window,%d,xs=%d,ys=%d" 1625 (apply 'format "window,%d,xs=%d,ys=%d"
1588 n idlwave-shell-graphics-window-size)))) 1626 n idlwave-shell-graphics-window-size)
1627 nil (idlwave-shell-hide-p 'misc))))
1589 1628
1590(defun idlwave-shell-resync-dirs () 1629(defun idlwave-shell-resync-dirs ()
1591 "Resync the buffer's idea of the current directory stack. 1630 "Resync the buffer's idea of the current directory.
1592This command queries IDL with the command bound to 1631This command queries IDL with the command bound to
1593`idlwave-shell-dirstack-query' (default \"printd\"), reads the 1632`idlwave-shell-dirstack-query', reads the output for the new
1594output for the new directory stack." 1633directory."
1595 (interactive) 1634 (interactive)
1596 (idlwave-shell-send-command idlwave-shell-dirstack-query 1635 (idlwave-shell-send-command idlwave-shell-dirstack-query
1597 'idlwave-shell-filter-directory 1636 'idlwave-shell-filter-directory
1598 'hide)) 1637 'hide 'wait))
1599 1638
1600(defun idlwave-shell-retall (&optional arg) 1639(defun idlwave-shell-retall (&optional arg)
1601 "Return from the entire calling stack." 1640 "Return from the entire calling stack."
1602 (interactive "P") 1641 (interactive "P")
1603 (idlwave-shell-send-command "retall")) 1642 (idlwave-shell-send-command "retall" nil (idlwave-shell-hide-p 'misc)))
1604 1643
1605(defun idlwave-shell-closeall (&optional arg) 1644(defun idlwave-shell-closeall (&optional arg)
1606 "Close all open files." 1645 "Close all open files."
1607 (interactive "P") 1646 (interactive "P")
1608 (idlwave-shell-send-command "close,/all")) 1647 (idlwave-shell-send-command "close,/all" nil (idlwave-shell-hide-p 'misc)))
1609 1648
1610(defun idlwave-shell-quit (&optional arg) 1649(defun idlwave-shell-quit (&optional arg)
1611 "Exit the idl process after confirmation. 1650 "Exit the idl process after confirmation.
@@ -1619,7 +1658,7 @@ With prefix ARG, exit without confirmation."
1619 (error nil))))) 1658 (error nil)))))
1620 1659
1621(defun idlwave-shell-reset (&optional hidden) 1660(defun idlwave-shell-reset (&optional hidden)
1622 "Reset IDL. Return to main level and destroy the leaftover variables. 1661 "Reset IDL. Return to main level and destroy the leftover variables.
1623This issues the following commands: 1662This issues the following commands:
1624RETALL 1663RETALL
1625WIDGET_CONTROL,/RESET 1664WIDGET_CONTROL,/RESET
@@ -1752,20 +1791,62 @@ HEAP_GC, /VERBOSE"
1752Change the default directory for the process buffer to concur." 1791Change the default directory for the process buffer to concur."
1753 (save-excursion 1792 (save-excursion
1754 (set-buffer (idlwave-shell-buffer)) 1793 (set-buffer (idlwave-shell-buffer))
1755 (if (string-match "Current Directory: *\\(\\S-*\\) *$" 1794 (if (string-match ",___cur[\n\r]\\(\\S-*\\) *[\n\r]"
1756 idlwave-shell-command-output) 1795 idlwave-shell-command-output)
1757 (let ((dir (substring idlwave-shell-command-output 1796 (let ((dir (substring idlwave-shell-command-output
1758 (match-beginning 1) (match-end 1)))) 1797 (match-beginning 1) (match-end 1))))
1759 (message "Setting Emacs wd to %s" dir) 1798; (message "Setting Emacs working dir to %s" dir)
1760 (setq idlwave-shell-default-directory dir) 1799 (setq idlwave-shell-default-directory dir)
1761 (setq default-directory (file-name-as-directory dir)))))) 1800 (setq default-directory (file-name-as-directory dir))))))
1762 1801
1802(defvar idlwave-shell-get-object-class nil)
1803(defun idlwave-shell-get-object-class (apos)
1804 "Query the shell for the class of the object before point."
1805 (let ((bos (save-excursion (idlwave-start-of-substatement 'pre) (point)))
1806 (bol (save-excursion (forward-line 0) (point)))
1807 expression)
1808 (save-excursion
1809 (goto-char apos)
1810 (setq expression (buffer-substring
1811 (catch 'exit
1812 (while t
1813 (if (not (re-search-backward
1814 "[^][.A-Za-z0-9_() ]" bos t))
1815 (throw 'exit bos)) ;ran into bos
1816 (if (not (idlwave-is-pointer-dereference bol))
1817 (throw 'exit (1+ (point))))))
1818 apos)))
1819 (when (not (string= expression ""))
1820 (setq idlwave-shell-get-object-class nil)
1821 (idlwave-shell-send-command
1822 (concat "print,obj_class(" expression ")")
1823 'idlwave-shell-parse-object-class
1824 'hide 'wait)
1825 ;; If we don't know anything about the class, update shell routines
1826 (if (and idlwave-shell-get-object-class
1827 (not (assoc-ignore-case idlwave-shell-get-object-class
1828 (idlwave-class-alist))))
1829 (idlwave-shell-maybe-update-routine-info))
1830 idlwave-shell-get-object-class)))
1831
1832(defun idlwave-shell-parse-object-class ()
1833 "Parse the output of the obj_class command."
1834 (let ((match "print,obj_class([^\n\r]+[\n\r ]+"))
1835 (if (and
1836 (not (string-match (concat match match "\\s-*^[\n\r]+"
1837 "% Syntax error")
1838 idlwave-shell-command-output))
1839 (string-match (concat match "\\([A-Za-z_0-9]+\\)")
1840 idlwave-shell-command-output))
1841 (setq idlwave-shell-get-object-class
1842 (match-string 1 idlwave-shell-command-output)))))
1843
1844
1763(defun idlwave-shell-complete (&optional arg) 1845(defun idlwave-shell-complete (&optional arg)
1764 "Do completion in the idlwave-shell buffer. 1846 "Do completion in the idlwave-shell buffer.
1765Calls `idlwave-shell-complete-filename' after some executive commands or 1847Calls `idlwave-shell-complete-filename' after some executive commands or
1766in strings. Otherwise, calls `idlwave-complete' to complete modules and 1848in strings. Otherwise, calls `idlwave-complete' to complete modules and
1767keywords." 1849keywords."
1768;;FIXME: batch files?
1769 (interactive "P") 1850 (interactive "P")
1770 (let (cmd) 1851 (let (cmd)
1771 (cond 1852 (cond
@@ -1776,13 +1857,17 @@ keywords."
1776 ".COM" ".COMP" ".COMPI" ".COMPIL" ".COMPILE")) 1857 ".COM" ".COMP" ".COMPI" ".COMPIL" ".COMPILE"))
1777 ;; This command expects file names 1858 ;; This command expects file names
1778 (idlwave-shell-complete-filename))) 1859 (idlwave-shell-complete-filename)))
1860
1861 ((idlwave-shell-batch-command)
1862 (idlwave-shell-complete-filename))
1863
1779 ((and (idlwave-shell-filename-string) 1864 ((and (idlwave-shell-filename-string)
1780 (save-excursion 1865 (save-excursion
1781 (beginning-of-line) 1866 (beginning-of-line)
1782 (let ((case-fold-search t)) 1867 (let ((case-fold-search t))
1783 (not (looking-at ".*obj_new")))) 1868 (not (looking-at ".*obj_new")))))
1784 ;; In a string, could be a file name to here 1869 (idlwave-shell-complete-filename))
1785 (idlwave-shell-complete-filename))) 1870
1786 (t 1871 (t
1787 ;; Default completion of modules and keywords 1872 ;; Default completion of modules and keywords
1788 (idlwave-complete arg))))) 1873 (idlwave-complete arg)))))
@@ -1790,36 +1875,17 @@ keywords."
1790(defun idlwave-shell-complete-filename (&optional arg) 1875(defun idlwave-shell-complete-filename (&optional arg)
1791 "Complete a file name at point if after a file name. 1876 "Complete a file name at point if after a file name.
1792We assume that we are after a file name when completing one of the 1877We assume that we are after a file name when completing one of the
1793args of an executive .run, .rnew or .compile. Also, in a string 1878args of an executive .run, .rnew or .compile."
1794constant we complete file names. Otherwise return nil, so that 1879 ;; CWD might have changed, resync, to set default directory
1795other completion functions can do their work." 1880 (idlwave-shell-resync-dirs)
1796 ;; Comint does something funny with the default directory, 1881 (let ((comint-file-name-chars idlwave-shell-file-name-chars))
1797 ;; so we set it here from out safe own variable 1882 (comint-dynamic-complete-as-filename)))
1798 (setq default-directory
1799 (file-name-as-directory idlwave-shell-default-directory))
1800 (if (not idlwave-shell-wd-is-synched)
1801 ;; Some IDL stuff has been executed since last update, so we need to
1802 ;; do it again.
1803 (idlwave-shell-send-command
1804 idlwave-shell-dirstack-query
1805 `(progn
1806 (idlwave-shell-filter-directory)
1807 (setq idlwave-shell-wd-is-synched t)
1808 (switch-to-buffer (idlwave-shell-buffer))
1809 (goto-char ,(point)) ;; This is necesary on Emacs, don't know why
1810 ;; after the update, we immediately redo the completion, so the
1811 ;; user will hardly notice we did the update.
1812 (idlwave-shell-complete-filename))
1813 'hide)
1814 (let* ((comint-file-name-chars idlwave-shell-file-name-chars)
1815 (completion-ignore-case (default-value 'completion-ignore-case)))
1816 (comint-dynamic-complete-filename))))
1817 1883
1818(defun idlwave-shell-executive-command () 1884(defun idlwave-shell-executive-command ()
1819 "Return the name of the current executive command, if any." 1885 "Return the name of the current executive command, if any."
1820 (save-excursion 1886 (save-excursion
1821 (idlwave-beginning-of-statement) 1887 (idlwave-beginning-of-statement)
1822 (if (looking-at "[ \t]*\\([.][^ \t\n\r]*\\)") 1888 (if (looking-at "[ \t]*\\([.][^ \t\n\r]+\\)")
1823 (match-string 1)))) 1889 (match-string 1))))
1824 1890
1825(defun idlwave-shell-filename-string () 1891(defun idlwave-shell-filename-string ()
@@ -1831,6 +1897,15 @@ other completion functions can do their work."
1831 ;; Check of the next char is a string delimiter 1897 ;; Check of the next char is a string delimiter
1832 (memq (preceding-char) '(?\' ?\"))))) 1898 (memq (preceding-char) '(?\' ?\")))))
1833 1899
1900(defun idlwave-shell-batch-command ()
1901 "Returns t if we're in a batch command statement like @foo"
1902 (let ((limit (save-excursion (beginning-of-line) (point))))
1903 (save-excursion
1904 ;; Skip backwards over filename
1905 (skip-chars-backward idlwave-shell-file-name-chars limit)
1906 (skip-chars-backward " \t" limit)
1907 (and (eq (preceding-char) ?@) (not (idlwave-in-quote))))))
1908
1834;;; 1909;;;
1835;;; This section contains code for debugging IDL programs. -------------------- 1910;;; This section contains code for debugging IDL programs. --------------------
1836;;; 1911;;;
@@ -2008,7 +2083,8 @@ If FRAME is nil then remove overlay."
2008 (or (not arg) (< arg 1) 2083 (or (not arg) (< arg 1)
2009 (setq arg 1)) 2084 (setq arg 1))
2010 (idlwave-shell-send-command 2085 (idlwave-shell-send-command
2011 (concat ".s " (if (integerp arg) (int-to-string arg) arg)))) 2086 (concat ".s " (if (integerp arg) (int-to-string arg) arg))
2087 nil (idlwave-shell-hide-p 'debug)))
2012 2088
2013(defun idlwave-shell-stepover (arg) 2089(defun idlwave-shell-stepover (arg)
2014 "Stepover one source line. 2090 "Stepover one source line.
@@ -2018,9 +2094,10 @@ Uses IDL's stepover executive command which does not enter called functions."
2018 (or (not arg) (< arg 1) 2094 (or (not arg) (< arg 1)
2019 (setq arg 1)) 2095 (setq arg 1))
2020 (idlwave-shell-send-command 2096 (idlwave-shell-send-command
2021 (concat ".so " (if (integerp arg) (int-to-string arg) arg)))) 2097 (concat ".so " (if (integerp arg) (int-to-string arg) arg))
2098 nil (idlwave-shell-hide-p 'debug)))
2022 2099
2023(defun idlwave-shell-break-here (&optional count cmd) 2100(defun idlwave-shell-break-here (&optional count cmd condition)
2024 "Set breakpoint at current line. 2101 "Set breakpoint at current line.
2025 2102
2026If Count is nil then an ordinary breakpoint is set. We treat a count 2103If Count is nil then an ordinary breakpoint is set. We treat a count
@@ -2032,12 +2109,14 @@ Optional argument CMD is a list or function to evaluate upon reaching
2032the breakpoint." 2109the breakpoint."
2033 2110
2034 (interactive "P") 2111 (interactive "P")
2035 (if (listp count) 2112 (when (listp count)
2036 (setq count nil)) 2113 (if (equal (car count) 4)
2114 (setq condition (read-string "Break Condition: ")))
2115 (setq count nil))
2037 (idlwave-shell-set-bp 2116 (idlwave-shell-set-bp
2038 ;; Create breakpoint 2117 ;; Create breakpoint
2039 (idlwave-shell-bp (idlwave-shell-current-frame) 2118 (idlwave-shell-bp (idlwave-shell-current-frame)
2040 (list count cmd) 2119 (list count cmd condition)
2041 (idlwave-shell-current-module)))) 2120 (idlwave-shell-current-module))))
2042 2121
2043(defun idlwave-shell-set-bp-check (bp) 2122(defun idlwave-shell-set-bp-check (bp)
@@ -2061,7 +2140,8 @@ the problem with not being able to set the breakpoint."
2061 ;; Clean up before retrying 2140 ;; Clean up before retrying
2062 (idlwave-shell-command-failure) 2141 (idlwave-shell-command-failure)
2063 (idlwave-shell-send-command 2142 (idlwave-shell-send-command
2064 (concat ".run " (idlwave-shell-bp-get bp 'file)) nil nil) 2143 (concat ".run " (idlwave-shell-bp-get bp 'file)) nil
2144 (idlwave-shell-hide-p 'run))
2065 ;; Try setting breakpoint again 2145 ;; Try setting breakpoint again
2066 (idlwave-shell-set-bp bp)) 2146 (idlwave-shell-set-bp bp))
2067 (beep) 2147 (beep)
@@ -2084,22 +2164,26 @@ breakpoint can not be set."
2084(defun idlwave-shell-cont () 2164(defun idlwave-shell-cont ()
2085 "Continue executing." 2165 "Continue executing."
2086 (interactive) 2166 (interactive)
2087 (idlwave-shell-send-command ".c" '(idlwave-shell-redisplay 'hide))) 2167 (idlwave-shell-send-command ".c" '(idlwave-shell-redisplay 'hide)
2168 (idlwave-shell-hide-p 'debug)))
2088 2169
2089(defun idlwave-shell-go () 2170(defun idlwave-shell-go ()
2090 "Run .GO. This starts the main program of the last compiled file." 2171 "Run .GO. This starts the main program of the last compiled file."
2091 (interactive) 2172 (interactive)
2092 (idlwave-shell-send-command ".go" '(idlwave-shell-redisplay 'hide))) 2173 (idlwave-shell-send-command ".go" '(idlwave-shell-redisplay 'hide)
2174 (idlwave-shell-hide-p 'debug)))
2093 2175
2094(defun idlwave-shell-return () 2176(defun idlwave-shell-return ()
2095 "Run .RETURN (continue to next return, but stay in subprogram)." 2177 "Run .RETURN (continue to next return, but stay in subprogram)."
2096 (interactive) 2178 (interactive)
2097 (idlwave-shell-send-command ".return" '(idlwave-shell-redisplay 'hide))) 2179 (idlwave-shell-send-command ".return" '(idlwave-shell-redisplay 'hide)
2180 (idlwave-shell-hide-p 'debug)))
2098 2181
2099(defun idlwave-shell-skip () 2182(defun idlwave-shell-skip ()
2100 "Run .SKIP (skip one line, then step)." 2183 "Run .SKIP (skip one line, then step)."
2101 (interactive) 2184 (interactive)
2102 (idlwave-shell-send-command ".skip" '(idlwave-shell-redisplay 'hide))) 2185 (idlwave-shell-send-command ".skip" '(idlwave-shell-redisplay 'hide)
2186 (idlwave-shell-hide-p 'debug)))
2103 2187
2104(defun idlwave-shell-clear-bp (bp) 2188(defun idlwave-shell-clear-bp (bp)
2105 "Clear breakpoint BP. 2189 "Clear breakpoint BP.
@@ -2109,7 +2193,8 @@ Clears in IDL and in `idlwave-shell-bp-alist'."
2109 (progn 2193 (progn
2110 (idlwave-shell-send-command 2194 (idlwave-shell-send-command
2111 (concat "breakpoint,/clear," 2195 (concat "breakpoint,/clear,"
2112 (if (integerp index) (int-to-string index) index))) 2196 (if (integerp index) (int-to-string index) index))
2197 nil (idlwave-shell-hide-p 'breakpoint))
2113 (idlwave-shell-bp-query))))) 2198 (idlwave-shell-bp-query)))))
2114 2199
2115(defun idlwave-shell-current-frame () 2200(defun idlwave-shell-current-frame ()
@@ -2155,11 +2240,25 @@ at a breakpoint."
2155 (beep) 2240 (beep)
2156 (message "Cannot identify breakpoint for this line")))))) 2241 (message "Cannot identify breakpoint for this line"))))))
2157 2242
2243(defun idlwave-shell-disable-all-bp (&optional enable)
2244 "Disable all breakpoints we know about.
2245If ENABLE is non-nil, enable them instead."
2246 (let ((bpl idlwave-shell-bp-alist))
2247 (while bpl
2248 (idlwave-shell-send-command
2249 (concat "breakpoint,"
2250 (if enable "/enable," "/disable," )
2251 (idlwave-shell-bp-get (car bpl)))
2252 nil (idlwave-shell-hide-p 'breakpoint))
2253 (setq bpl (cdr bpl)))))
2254
2158(defun idlwave-shell-to-here () 2255(defun idlwave-shell-to-here ()
2159 "Set a breakpoint with count 1 then continue." 2256 "Set a breakpoint with count 1 then continue."
2160 (interactive) 2257 (interactive)
2258 (idlwave-shell-disable-all-bp)
2161 (idlwave-shell-break-here 1) 2259 (idlwave-shell-break-here 1)
2162 (idlwave-shell-cont)) 2260 (idlwave-shell-cont)
2261 (idlwave-shell-disable-all-bp 'enable))
2163 2262
2164(defun idlwave-shell-break-in (&optional module) 2263(defun idlwave-shell-break-in (&optional module)
2165 "Look for a module name near point and set a break point for it. 2264 "Look for a module name near point and set a break point for it.
@@ -2244,7 +2343,7 @@ Sets a breakpoint with count 1 at end of block, then continues."
2244 "Attempt to run until this procedure exits. 2343 "Attempt to run until this procedure exits.
2245Runs to the last statement and then steps 1 statement. Use the .out command." 2344Runs to the last statement and then steps 1 statement. Use the .out command."
2246 (interactive) 2345 (interactive)
2247 (idlwave-shell-send-command (concat ".o"))) 2346 (idlwave-shell-send-command ".o" nil (idlwave-shell-hide-p 'debug)))
2248 2347
2249(defun idlwave-shell-help-expression (arg) 2348(defun idlwave-shell-help-expression (arg)
2250 "Print help on current expression. See `idlwave-shell-print'." 2349 "Print help on current expression. See `idlwave-shell-print'."
@@ -2336,7 +2435,7 @@ idlw-shell-examine-alist from which to select the help command text."
2336 (arg 2435 (arg
2337 (setq expr (read-string "Expression: "))) 2436 (setq expr (read-string "Expression: ")))
2338 (t 2437 (t
2339 (idlwave-with-special-syntax1 2438 (idlwave-with-special-syntax
2340 ;; Move to beginning of current or previous expression 2439 ;; Move to beginning of current or previous expression
2341 (if (looking-at "\\<\\|(") 2440 (if (looking-at "\\<\\|(")
2342 ;; At beginning of expression, don't move backwards unless 2441 ;; At beginning of expression, don't move backwards unless
@@ -2683,7 +2782,8 @@ If there is a prefix argument, display IDL process."
2683 (idlwave-look-at "\\<end\\>"))) 2782 (idlwave-look-at "\\<end\\>")))
2684 (insert "\nend\n")) 2783 (insert "\nend\n"))
2685 (save-buffer 0))) 2784 (save-buffer 0)))
2686 (idlwave-shell-send-command (concat ".run " idlwave-shell-temp-pro-file)) 2785 (idlwave-shell-send-command (concat ".run " idlwave-shell-temp-pro-file)
2786 nil (idlwave-shell-hide-p 'run))
2687 (if n 2787 (if n
2688 (idlwave-display-buffer (idlwave-shell-buffer) 2788 (idlwave-display-buffer (idlwave-shell-buffer)
2689 nil (idlwave-shell-shell-frame)))) 2789 nil (idlwave-shell-shell-frame))))
@@ -2715,8 +2815,27 @@ Does not work for a region with multiline blocks - use
2715 (error nil)))) 2815 (error nil))))
2716 2816
2717(defun idlwave-display-buffer (buf not-this-window-p &optional frame) 2817(defun idlwave-display-buffer (buf not-this-window-p &optional frame)
2718 (if (not (frame-live-p frame)) (setq frame nil)) 2818 (if (featurep 'xemacs)
2719 (display-buffer buf not-this-window-p frame)) 2819 ;; The XEmacs version enforces the frame
2820 (display-buffer buf not-this-window-p frame)
2821 ;; For Emacs, we need to force the frame ourselves.
2822 (let ((this-frame (selected-frame)))
2823 (if (frame-live-p frame)
2824 (select-frame frame))
2825 (if (eq this-frame (selected-frame))
2826 ;; same frame: use display buffer, to make sure the current
2827 ;; window stays.
2828 (display-buffer buf)
2829 ;; different frame
2830 (if (one-window-p)
2831 ;; only window: switch
2832 (progn
2833 (switch-to-buffer buf)
2834 (selected-window)) ; must return the window.
2835 ;; several windows - use display-buffer
2836 (display-buffer buf not-this-window-p))))))
2837; (if (not (frame-live-p frame)) (setq frame nil))
2838; (display-buffer buf not-this-window-p frame))
2720 2839
2721(defvar idlwave-shell-bp-buffer " *idlwave-shell-bp*" 2840(defvar idlwave-shell-bp-buffer " *idlwave-shell-bp*"
2722 "Scratch buffer for parsing IDL breakpoint lists and other stuff.") 2841 "Scratch buffer for parsing IDL breakpoint lists and other stuff.")
@@ -2744,6 +2863,7 @@ Defaults to 'index."
2744 ((eq item 'data) (cdr (cdr bp))) 2863 ((eq item 'data) (cdr (cdr bp)))
2745 ((eq item 'count) (nth 0 (cdr (cdr bp)))) 2864 ((eq item 'count) (nth 0 (cdr (cdr bp))))
2746 ((eq item 'cmd) (nth 1 (cdr (cdr bp)))) 2865 ((eq item 'cmd) (nth 1 (cdr (cdr bp))))
2866 ((eq item 'condition) (nth 2 (cdr (cdr bp))))
2747 ;; IDL breakpoint info 2867 ;; IDL breakpoint info
2748 ((eq item 'module) (nth 1 (car (cdr bp)))) 2868 ((eq item 'module) (nth 1 (car (cdr bp))))
2749 ;; index - default 2869 ;; index - default
@@ -2762,7 +2882,7 @@ from previous breakpoint list."
2762 ;; Searching the breakpoints 2882 ;; Searching the breakpoints
2763 ;; In IDL 5.5, the breakpoint reporting format changed. 2883 ;; In IDL 5.5, the breakpoint reporting format changed.
2764 (bp-re54 "^[ \t]*\\([0-9]+\\)[ \t]+\\(\\S-+\\)?[ \t]+\\([0-9]+\\)[ \t]+\\(\\S-+\\)") 2884 (bp-re54 "^[ \t]*\\([0-9]+\\)[ \t]+\\(\\S-+\\)?[ \t]+\\([0-9]+\\)[ \t]+\\(\\S-+\\)")
2765 (bp-re55 "^\\s-*\\([0-9]+\\)\\s-+\\([0-9]+\\)\\s-+\\(Uncompiled\\|Func=\\|Pro=\\)\\(\\S-+\\)?\\s-+\\(\\S-+\\)") 2885 (bp-re55 "^\\s-*\\([0-9]+\\)\\s-+\\([0-9]+\\)\\s-+\\(Uncompiled\\|Func=\\|Pro=\\)\\([a-zA-Z][a-zA-Z0-9$_:]*\\)\\(,[^\n]*\n\\)?\\s-+\\(\\S-+\\)")
2766 file line index module 2886 file line index module
2767 bp-re indmap) 2887 bp-re indmap)
2768 (setq idlwave-shell-bp-alist (list nil)) 2888 (setq idlwave-shell-bp-alist (list nil))
@@ -2774,7 +2894,7 @@ from previous breakpoint list."
2774 (if (re-search-forward 2894 (if (re-search-forward
2775 "^\\s-*Index\\s-*Line\\s-*Attributes\\s-*File" nil t) 2895 "^\\s-*Index\\s-*Line\\s-*Attributes\\s-*File" nil t)
2776 (setq bp-re bp-re55 ; versions >= 5.5 2896 (setq bp-re bp-re55 ; versions >= 5.5
2777 indmap '(1 4 2 5)))) 2897 indmap '(1 4 2 6))))
2778 ;; There seems to be a breakpoint listing here. 2898 ;; There seems to be a breakpoint listing here.
2779 ;; Parse breakpoint lines. 2899 ;; Parse breakpoint lines.
2780 ;; Breakpoints have the form 2900 ;; Breakpoints have the form
@@ -2844,8 +2964,8 @@ Otherwise return the filename in bp."
2844The breakpoint will be placed at the beginning of the statement on the 2964The breakpoint will be placed at the beginning of the statement on the
2845line specified by BP or at the next IDL statement if that line is not 2965line specified by BP or at the next IDL statement if that line is not
2846a statement. 2966a statement.
2847Determines IDL's internal representation for the breakpoint, which may 2967Determines IDL's internal representation for the breakpoint which may
2848have occurred at a different line than used with the breakpoint 2968have occured at a different line then used with the breakpoint
2849command." 2969command."
2850 2970
2851 ;; Get and save the old breakpoints 2971 ;; Get and save the old breakpoints
@@ -2878,6 +2998,9 @@ only after reaching the statement count times."
2878 ",/once") 2998 ",/once")
2879 ((> arg 1) 2999 ((> arg 1)
2880 (format ",after=%d" arg)))) 3000 (format ",after=%d" arg))))
3001 (condition (idlwave-shell-bp-get bp 'condition))
3002 (key (concat key
3003 (if condition (concat ",CONDITION=\"" condition "\""))))
2881 (line (idlwave-shell-bp-get bp 'line))) 3004 (line (idlwave-shell-bp-get bp 'line)))
2882 (idlwave-shell-send-command 3005 (idlwave-shell-send-command
2883 (concat "breakpoint,'" 3006 (concat "breakpoint,'"
@@ -2888,8 +3011,8 @@ only after reaching the statement count times."
2888 `(progn 3011 `(progn
2889 (if (idlwave-shell-set-bp-check (quote ,bp)) 3012 (if (idlwave-shell-set-bp-check (quote ,bp))
2890 (idlwave-shell-set-bp3 (quote ,bp)))) 3013 (idlwave-shell-set-bp3 (quote ,bp))))
2891 ;; do not hide output 3014 ;; hide output?
2892 nil 3015 (idlwave-shell-hide-p 'breakpoint)
2893 'preempt))) 3016 'preempt)))
2894 3017
2895(defun idlwave-shell-set-bp3 (bp) 3018(defun idlwave-shell-set-bp3 (bp)
@@ -3075,21 +3198,21 @@ handled by this command."
3075 (t (error "Unknown action %s" action))) 3198 (t (error "Unknown action %s" action)))
3076 idlwave-shell-last-save-and-action-file) 3199 idlwave-shell-last-save-and-action-file)
3077 'idlwave-shell-maybe-update-routine-info 3200 'idlwave-shell-maybe-update-routine-info
3078 nil) 3201 (idlwave-shell-hide-p 'run))
3079 (idlwave-shell-bp-query)) 3202 (idlwave-shell-bp-query))
3080 (let ((msg (format "No such file %s" 3203 (let ((msg (format "No such file %s"
3081 idlwave-shell-last-save-and-action-file))) 3204 idlwave-shell-last-save-and-action-file)))
3082 (setq idlwave-shell-last-save-and-action-file nil) 3205 (setq idlwave-shell-last-save-and-action-file nil)
3083 (error msg)))) 3206 (error msg))))
3084 3207
3085(defun idlwave-shell-maybe-update-routine-info () 3208(defun idlwave-shell-maybe-update-routine-info (&optional wait)
3086 "Update the routine info if the shell is not stopped at an error." 3209 "Update the routine info if the shell is not stopped at an error."
3087 (if (and (not idlwave-shell-is-stopped) 3210 (if (and (not idlwave-shell-is-stopped)
3088 (or (eq t idlwave-auto-routine-info-updates) 3211 (or (eq t idlwave-auto-routine-info-updates)
3089 (memq 'compile-buffer idlwave-auto-routine-info-updates)) 3212 (memq 'compile-buffer idlwave-auto-routine-info-updates))
3090 idlwave-query-shell-for-routine-info 3213 idlwave-query-shell-for-routine-info
3091 idlwave-routines) 3214 idlwave-routines)
3092 (idlwave-shell-update-routine-info t))) 3215 (idlwave-shell-update-routine-info t nil 'wait)))
3093 3216
3094(defvar idlwave-shell-sources-query "help,/source,/full" 3217(defvar idlwave-shell-sources-query "help,/source,/full"
3095 "IDL command to obtain source files for compiled procedures.") 3218 "IDL command to obtain source files for compiled procedures.")
@@ -3161,7 +3284,6 @@ list elements of the form:
3161 )))) 3284 ))))
3162 (cdr al)))) 3285 (cdr al))))
3163 3286
3164
3165(defun idlwave-shell-clear-all-bp () 3287(defun idlwave-shell-clear-all-bp ()
3166 "Remove all breakpoints in IDL." 3288 "Remove all breakpoints in IDL."
3167 (interactive) 3289 (interactive)
@@ -3235,7 +3357,9 @@ Otherwise, just expand the file name."
3235(define-key idlwave-shell-mode-map "\M-\t" 'idlwave-shell-complete) 3357(define-key idlwave-shell-mode-map "\M-\t" 'idlwave-shell-complete)
3236(define-key idlwave-shell-mode-map "\C-c\C-s" 'idlwave-shell) 3358(define-key idlwave-shell-mode-map "\C-c\C-s" 'idlwave-shell)
3237(define-key idlwave-shell-mode-map "\C-c?" 'idlwave-routine-info) 3359(define-key idlwave-shell-mode-map "\C-c?" 'idlwave-routine-info)
3360(define-key idlwave-shell-mode-map "\C-g" 'idlwave-keyboard-quit)
3238(define-key idlwave-shell-mode-map "\M-?" 'idlwave-context-help) 3361(define-key idlwave-shell-mode-map "\M-?" 'idlwave-context-help)
3362(define-key idlwave-shell-mode-map [(control meta ?\?)] 'idlwave-online-help)
3239(define-key idlwave-shell-mode-map "\C-c\C-i" 'idlwave-update-routine-info) 3363(define-key idlwave-shell-mode-map "\C-c\C-i" 'idlwave-update-routine-info)
3240(define-key idlwave-shell-mode-map "\C-c\C-y" 'idlwave-shell-char-mode-loop) 3364(define-key idlwave-shell-mode-map "\C-c\C-y" 'idlwave-shell-char-mode-loop)
3241(define-key idlwave-shell-mode-map "\C-c\C-x" 'idlwave-shell-send-char) 3365(define-key idlwave-shell-mode-map "\C-c\C-x" 'idlwave-shell-send-char)
@@ -3526,5 +3650,4 @@ static char * file[] = {
3526 3650
3527(if idlwave-shell-use-toolbar 3651(if idlwave-shell-use-toolbar
3528 (add-hook 'idlwave-shell-mode-hook 'idlwave-toolbar-add-everywhere)) 3652 (add-hook 'idlwave-shell-mode-hook 'idlwave-toolbar-add-everywhere))
3529
3530;;; idlw-shell.el ends here 3653;;; idlw-shell.el ends here
diff --git a/lisp/progmodes/idlw-toolbar.el b/lisp/progmodes/idlw-toolbar.el
index 0ad1a3b24ce..651d1bafd2a 100644
--- a/lisp/progmodes/idlw-toolbar.el
+++ b/lisp/progmodes/idlw-toolbar.el
@@ -3,7 +3,7 @@
3 3
4;; Author: Carsten Dominik <dominik@astro.uva.nl> 4;; Author: Carsten Dominik <dominik@astro.uva.nl>
5;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu> 5;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
6;; Version: 4.14 6;; Version: 4.15
7;; Date: $Date: 2002/06/14 19:06:16 $ 7;; Date: $Date: 2002/06/14 19:06:16 $
8;; Keywords: processes 8;; Keywords: processes
9 9
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index 7cefcf19508..b9fcd83cb4f 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -1,11 +1,11 @@
1;;; idlwave.el --- IDL and WAVE CL editing mode for GNU Emacs 1;;; idlwave.el --- IDL editing mode for GNU Emacs
2;; Copyright (c) 1999, 2000, 2001,2002 Free Software Foundation 2;; Copyright (c) 1999, 2000, 2001,2002 Free Software Foundation
3 3
4;; Author: Carsten Dominik <dominik@astro.uva.nl> 4;; Author: Carsten Dominik <dominik@astro.uva.nl>
5;; Chris Chase <chase@att.com> 5;; Chris Chase <chase@att.com>
6;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu> 6;; Maintainer: J.D. Smith <jdsmith@as.arizona.edu>
7;; Version: 4.14 7;; Version: 4.15
8;; Date: $Date: 2002/08/30 11:02:31 $ 8;; Date: $Date: 2002/09/12 16:31:50 $
9;; Keywords: languages 9;; Keywords: languages
10 10
11;; This file is part of GNU Emacs. 11;; This file is part of GNU Emacs.
@@ -57,7 +57,7 @@
57;; SOURCE 57;; SOURCE
58;; ====== 58;; ======
59;; 59;;
60;; The newest version of this file is available from the maintainers 60;; The newest version of this file is available from the maintainer's
61;; Webpage. 61;; Webpage.
62;; 62;;
63;; http://idlwave.org 63;; http://idlwave.org
@@ -84,26 +84,33 @@
84;; Simon Marshall <Simon.Marshall@esrin.esa.it> 84;; Simon Marshall <Simon.Marshall@esrin.esa.it>
85;; Laurent Mugnier <mugnier@onera.fr> 85;; Laurent Mugnier <mugnier@onera.fr>
86;; Lubos Pochman <lubos@rsinc.com> 86;; Lubos Pochman <lubos@rsinc.com>
87;; Bob Portmann <portmann@al.noaa.gov>
87;; Patrick M. Ryan <pat@jaameri.gsfc.nasa.gov> 88;; Patrick M. Ryan <pat@jaameri.gsfc.nasa.gov>
88;; Marty Ryba <ryba@ll.mit.edu> 89;; Marty Ryba <ryba@ll.mit.edu>
89;; Phil Williams <williams@irc.chmcc.org> 90;; Phil Williams <williams@irc.chmcc.org>
90;; J.D. Smith <jdsmith@astrosun.tn.cornell.edu>
91;; Phil Sterne <sterne@dublin.llnl.gov> 91;; Phil Sterne <sterne@dublin.llnl.gov>
92;; 92;;
93;; CUSTOMIZATION: 93;; CUSTOMIZATION:
94;; ============= 94;; =============
95;; 95;;
96;; IDLWAVE has customize support - so if you want to learn about the 96;; IDLWAVE has extensive customize support - so if you want to learn
97;; variables which control the behavior of the mode, use 97;; about the variables which control the behavior of the mode, use
98;; `M-x idlwave-customize'. 98;; `M-x idlwave-customize'.
99;; 99;;
100;; You can set your own preferred values with Customize, or with Lisp 100;; You can set your own preferred values with Customize, or with Lisp
101;; code in .emacs. For an example of what to put into .emacs, check 101;; code in .emacs. For an example of what to put into .emacs, check
102;; the TexInfo documentation. 102;; the TexInfo documentation or see a complete .emacs at
103;; http://idlwave.org.
103;; 104;;
104;; KNOWN PROBLEMS: 105;; KNOWN PROBLEMS:
105;; ============== 106;; ==============
106;; 107;;
108;; IDLWAVE support for the IDL-derived PV-WAVE CL language of Visual
109;; Numerics, Inc. is growing less and less complete as the two
110;; languages grow increasingly apart. The mode probably shouldn't
111;; even have "WAVE" in it's title, but it's catchy, and required to
112;; avoid conflict with the CORBA idl.el mode. Caveat WAVEor.
113;;
107;; Moving the point backwards in conjunction with abbrev expansion 114;; Moving the point backwards in conjunction with abbrev expansion
108;; does not work as I would like it, but this is a problem with 115;; does not work as I would like it, but this is a problem with
109;; emacs abbrev expansion done by the self-insert-command. It ends 116;; emacs abbrev expansion done by the self-insert-command. It ends
@@ -120,15 +127,15 @@
120;; limited to comments only and occurs only when a comment 127;; limited to comments only and occurs only when a comment
121;; paragraph is filled via `idlwave-fill-paragraph'. 128;; paragraph is filled via `idlwave-fill-paragraph'.
122;; 129;;
123;; "&" is ignored when parsing statements.
124;; Avoid muti-statement lines (using "&") on block begin and end 130;; Avoid muti-statement lines (using "&") on block begin and end
125;; lines. Multi-statement lines can mess up the formatting, for 131;; lines. Multi-statement lines can mess up the formatting, for
126;; example, multiple end statements on a line: endif & endif. 132;; example, multiple end statements on a line: endif & endif.
127;; Using "&" outside of block begin/end lines should be okay. 133;; Using "&" outside of block begin/end lines should be okay.
128;; 134;;
129;; It is possible that the parser which decides what to complete has 135;; Determining the expression at point for printing and other
130;; problems with pointer dereferencing statements. I don't use 136;; examination commands is somewhat rough: currently only fairly
131;; pointers often enough to find out - please report any problems. 137;; simple entities are found. You can always drag-select or examine
138;; a region.
132;; 139;;
133;; When forcing completion of method keywords, the initial 140;; When forcing completion of method keywords, the initial
134;; query for a method has multiple entries for some methods. Would 141;; query for a method has multiple entries for some methods. Would
@@ -653,17 +660,18 @@ class info listed. See `idlwave-completion-show-classes'."
653When IDLWAVE tries to complete object-oriented methods, it usually 660When IDLWAVE tries to complete object-oriented methods, it usually
654cannot determine the class of a given object from context. In order 661cannot determine the class of a given object from context. In order
655to provide the user with a correct list of methods or keywords, it 662to provide the user with a correct list of methods or keywords, it
656needs have to determine the appropriate class. IDLWAVE has two ways 663needs to determine the appropriate class. IDLWAVE has two ways of
657to deal with this problem. 664doing this (well, three ways if you count the shell... see
658 665`idlwave-shell-query-for-class'):
6591. One possibility is to combine the items of all available classes 666
660 which contain this method for the purpose of completion. So when 6671. Combine the items of all available classes which contain this
661 completing a method, all methods of all known classes are 668 method for the purpose of completion. So when completing a method,
662 available, and when completing a keyword, all keywords allowed for 669 all methods of all known classes are available, and when completing
663 this method in any class are shown. This behavior is very much 670 a keyword, all keywords allowed for this method in any class are
664 like normal completion and is therefore the default. It works much 671 shown. This behavior is very much like normal completion and is
665 better than one might think - only for the INIT, GETPROPERTY and 672 therefore the default. It works much better than one might think -
666 SETPROPERTY the keyword lists become uncomfortably long. See also 673 only for the INIT, GETPROPERTY and SETPROPERTY the keyword lists
674 become uncomfortably long. See also
667 `idlwave-completion-show-classes'. 675 `idlwave-completion-show-classes'.
668 676
6692. The second possibility is to ask the user on each occasion. To 6772. The second possibility is to ask the user on each occasion. To
@@ -1156,38 +1164,39 @@ As a user, you should not set this to t.")
1156(defconst idlwave-font-lock-keywords-3 nil 1164(defconst idlwave-font-lock-keywords-3 nil
1157 "Gaudy level highlighting for IDLWAVE mode.") 1165 "Gaudy level highlighting for IDLWAVE mode.")
1158 1166
1167;; The following are the reserved words in IDL. Maybe we should
1168;; highlight some more stuff as well?
1169;; Procedure declarations. Fontify keyword plus procedure name.
1170(defvar idlwave-idl-keywords
1171 ;; To update this regexp, update the list of keywords and
1172 ;; evaluate the form.
1173 ;; (insert
1174 ;; (prin1-to-string
1175 ;; (concat
1176 ;; "\\<\\("
1177 ;; (regexp-opt
1178 ;; '("and" "or" "xor" "not"
1179 ;; "eq" "ge" "gt" "le" "lt" "ne"
1180 ;; "for" "do" "endfor"
1181 ;; "if" "then" "endif" "else" "endelse"
1182 ;; "case" "of" "endcase"
1183 ;; "switch" "break" "continue" "endswitch"
1184 ;; "begin" "end"
1185 ;; "repeat" "until" "endrep"
1186 ;; "while" "endwhile"
1187 ;; "goto" "return"
1188 ;; "inherits" "mod"
1189 ;; "compile_opt" "forward_function"
1190 ;; "on_error" "on_ioerror")) ; on_error is not officially reserved
1191 ;; "\\)\\>")))
1192 "\\<\\(and\\|b\\(egin\\|reak\\)\\|c\\(ase\\|o\\(mpile_opt\\|ntinue\\)\\)\\|do\\|e\\(lse\\|nd\\(case\\|else\\|for\\|if\\|rep\\|switch\\|while\\)?\\|q\\)\\|for\\(ward_function\\)?\\|g\\(oto\\|[et]\\)\\|i\\(f\\|nherits\\)\\|l[et]\\|mod\\|n\\(e\\|ot\\)\\|o\\(n_\\(error\\|ioerror\\)\\|[fr]\\)\\|re\\(peat\\|turn\\)\\|switch\\|then\\|until\\|while\\|xor\\)\\>")
1193
1159(let* ((oldp (or (string-match "Lucid" emacs-version) 1194(let* ((oldp (or (string-match "Lucid" emacs-version)
1160 (not (boundp 'emacs-minor-version)) 1195 (not (boundp 'emacs-minor-version))
1161 (and (<= emacs-major-version 19) 1196 (and (<= emacs-major-version 19)
1162 (<= emacs-minor-version 29)))) 1197 (<= emacs-minor-version 29))))
1163 1198
1164 ;; The following are the reserved words in IDL. Maybe we should 1199 (idl-keywords idlwave-idl-keywords)
1165 ;; highlight some more stuff as well?
1166 (idl-keywords
1167 ;; To update this regexp, update the list of keywords and
1168 ;; evaluate the form.
1169; (insert
1170; (prin1-to-string
1171; (concat
1172; "\\<\\("
1173; (regexp-opt
1174; '("and" "or" "xor" "not"
1175; "eq" "ge" "gt" "le" "lt" "ne"
1176; "for" "do" "endfor"
1177; "if" "then" "endif" "else" "endelse"
1178; "case" "of" "endcase"
1179; "switch" "break" "continue" "endswitch"
1180; "begin" "end"
1181; "repeat" "until" "endrep"
1182; "while" "endwhile"
1183; "goto" "return"
1184; "inherits" "mod"
1185; "compile_opt" "forward_function"
1186; "on_error" "on_ioerror")) ; on_error is not officially reserved
1187; "\\)\\>")))
1188
1189 "\\<\\(and\\|b\\(egin\\|reak\\)\\|c\\(ase\\|o\\(mpile_opt\\|ntinue\\)\\)\\|do\\|e\\(lse\\|nd\\(case\\|else\\|for\\|if\\|rep\\|switch\\|while\\)?\\|q\\)\\|for\\(ward_function\\)?\\|g\\(oto\\|[et]\\)\\|i\\(f\\|nherits\\)\\|l[et]\\|mod\\|n\\(e\\|ot\\)\\|o\\(n_\\(error\\|ioerror\\)\\|[fr]\\)\\|re\\(peat\\|turn\\)\\|switch\\|then\\|until\\|while\\|xor\\)\\>")
1190
1191 ;; Procedure declarations. Fontify keyword plus procedure name. 1200 ;; Procedure declarations. Fontify keyword plus procedure name.
1192 ;; Function declarations. Fontify keyword plus function name. 1201 ;; Function declarations. Fontify keyword plus function name.
1193 (pros-and-functions 1202 (pros-and-functions
@@ -1268,7 +1277,6 @@ As a user, you should not set this to t.")
1268 ;; The following lines are just a dummy to make the compiler shut up 1277 ;; The following lines are just a dummy to make the compiler shut up
1269 ;; about variables bound but not used. 1278 ;; about variables bound but not used.
1270 (setq oldp oldp 1279 (setq oldp oldp
1271 idl-keywords idl-keywords
1272 pros-and-functions pros-and-functions 1280 pros-and-functions pros-and-functions
1273 common-blocks common-blocks 1281 common-blocks common-blocks
1274 batch-files batch-files 1282 batch-files batch-files
@@ -1294,7 +1302,7 @@ As a user, you should not set this to t.")
1294 (setq idlwave-font-lock-keywords-3 1302 (setq idlwave-font-lock-keywords-3
1295 (list pros-and-functions 1303 (list pros-and-functions
1296 batch-files 1304 batch-files
1297 idl-keywords 1305 idlwave-idl-keywords
1298 label goto 1306 label goto
1299 structtag 1307 structtag
1300 structname 1308 structname
@@ -1437,7 +1445,7 @@ Normally a space.")
1437 "Character which is inserted as a last character on previous line by 1445 "Character which is inserted as a last character on previous line by
1438 \\[idlwave-split-line] to begin a continuation line. Normally $.") 1446 \\[idlwave-split-line] to begin a continuation line. Normally $.")
1439 1447
1440(defconst idlwave-mode-version " 4.14") 1448(defconst idlwave-mode-version " 4.15")
1441 1449
1442(defmacro idlwave-keyword-abbrev (&rest args) 1450(defmacro idlwave-keyword-abbrev (&rest args)
1443 "Creates a function for abbrev hooks to call `idlwave-check-abbrev' with args." 1451 "Creates a function for abbrev hooks to call `idlwave-check-abbrev' with args."
@@ -1494,27 +1502,11 @@ Otherwise ARGS forms a list that is evaluated."
1494 1502
1495(modify-syntax-entry ?$ "w" idlwave-find-symbol-syntax-table) 1503(modify-syntax-entry ?$ "w" idlwave-find-symbol-syntax-table)
1496(modify-syntax-entry ?_ "w" idlwave-find-symbol-syntax-table) 1504(modify-syntax-entry ?_ "w" idlwave-find-symbol-syntax-table)
1497
1498(defmacro idlwave-with-special-syntax (&rest body)
1499 "Execute BODY with a different systax table."
1500 `(let ((saved-syntax (syntax-table)))
1501 (unwind-protect
1502 (progn
1503 (set-syntax-table idlwave-find-symbol-syntax-table)
1504 ,@body)
1505 (set-syntax-table saved-syntax))))
1506
1507(defvar idlwave-print-symbol-syntax-table
1508 (copy-syntax-table idlwave-mode-syntax-table)
1509 "Syntax table that treats symbol characters as word characters.")
1510
1511(modify-syntax-entry ?$ "w" idlwave-find-symbol-syntax-table)
1512(modify-syntax-entry ?_ "w" idlwave-find-symbol-syntax-table)
1513(modify-syntax-entry ?! "w" idlwave-find-symbol-syntax-table) 1505(modify-syntax-entry ?! "w" idlwave-find-symbol-syntax-table)
1514(modify-syntax-entry ?. "w" idlwave-find-symbol-syntax-table) 1506(modify-syntax-entry ?. "w" idlwave-find-symbol-syntax-table)
1515 1507
1516(defmacro idlwave-with-special-syntax1 (&rest body) 1508(defmacro idlwave-with-special-syntax (&rest body)
1517 "Execute BODY with a different systax table." 1509 "Execute BODY with a different syntax table."
1518 `(let ((saved-syntax (syntax-table))) 1510 `(let ((saved-syntax (syntax-table)))
1519 (unwind-protect 1511 (unwind-protect
1520 (progn 1512 (progn
@@ -1522,6 +1514,15 @@ Otherwise ARGS forms a list that is evaluated."
1522 ,@body) 1514 ,@body)
1523 (set-syntax-table saved-syntax)))) 1515 (set-syntax-table saved-syntax))))
1524 1516
1517;(defmacro idlwave-with-special-syntax1 (&rest body)
1518; "Execute BODY with a different syntax table."
1519; `(let ((saved-syntax (syntax-table)))
1520; (unwind-protect
1521; (progn
1522; (set-syntax-table idlwave-find-symbol-syntax-table)
1523; ,@body)
1524; (set-syntax-table saved-syntax))))
1525
1525(defun idlwave-action-and-binding (key cmd &optional select) 1526(defun idlwave-action-and-binding (key cmd &optional select)
1526 "KEY and CMD are made into a key binding and an indent action. 1527 "KEY and CMD are made into a key binding and an indent action.
1527KEY is a string - same as for the `define-key' function. CMD is a 1528KEY is a string - same as for the `define-key' function. CMD is a
@@ -1576,6 +1577,7 @@ Capitalize system variables - action only
1576;(define-key idlwave-mode-map "\C-c\C- " 'idlwave-hard-tab) 1577;(define-key idlwave-mode-map "\C-c\C- " 'idlwave-hard-tab)
1577(define-key idlwave-mode-map "'" 'idlwave-show-matching-quote) 1578(define-key idlwave-mode-map "'" 'idlwave-show-matching-quote)
1578(define-key idlwave-mode-map "\"" 'idlwave-show-matching-quote) 1579(define-key idlwave-mode-map "\"" 'idlwave-show-matching-quote)
1580(define-key idlwave-mode-map "\C-g" 'idlwave-keyboard-quit)
1579(define-key idlwave-mode-map "\C-c;" 'idlwave-toggle-comment-region) 1581(define-key idlwave-mode-map "\C-c;" 'idlwave-toggle-comment-region)
1580(define-key idlwave-mode-map "\C-\M-a" 'idlwave-beginning-of-subprogram) 1582(define-key idlwave-mode-map "\C-\M-a" 'idlwave-beginning-of-subprogram)
1581(define-key idlwave-mode-map "\C-\M-e" 'idlwave-end-of-subprogram) 1583(define-key idlwave-mode-map "\C-\M-e" 'idlwave-end-of-subprogram)
@@ -1593,7 +1595,7 @@ Capitalize system variables - action only
1593(define-key idlwave-mode-map "\C-c\C-n" 'idlwave-next-statement) 1595(define-key idlwave-mode-map "\C-c\C-n" 'idlwave-next-statement)
1594;; (define-key idlwave-mode-map "\r" 'idlwave-newline) 1596;; (define-key idlwave-mode-map "\r" 'idlwave-newline)
1595;; (define-key idlwave-mode-map "\t" 'idlwave-indent-line) 1597;; (define-key idlwave-mode-map "\t" 'idlwave-indent-line)
1596(define-key idlwave-mode-map (kbd "S-<iso-lefttab>") 'idlwave-indent-statement) 1598(define-key idlwave-mode-map [(shift tab)] 'idlwave-indent-statement)
1597(define-key idlwave-mode-map "\C-c\C-a" 'idlwave-auto-fill-mode) 1599(define-key idlwave-mode-map "\C-c\C-a" 'idlwave-auto-fill-mode)
1598(define-key idlwave-mode-map "\M-q" 'idlwave-fill-paragraph) 1600(define-key idlwave-mode-map "\M-q" 'idlwave-fill-paragraph)
1599(define-key idlwave-mode-map "\M-s" 'idlwave-edit-in-idlde) 1601(define-key idlwave-mode-map "\M-s" 'idlwave-edit-in-idlde)
@@ -1637,6 +1639,7 @@ Capitalize system variables - action only
1637(define-key idlwave-mode-map "\C-c\C-v" 'idlwave-find-module) 1639(define-key idlwave-mode-map "\C-c\C-v" 'idlwave-find-module)
1638(define-key idlwave-mode-map "\C-c?" 'idlwave-routine-info) 1640(define-key idlwave-mode-map "\C-c?" 'idlwave-routine-info)
1639(define-key idlwave-mode-map "\M-?" 'idlwave-context-help) 1641(define-key idlwave-mode-map "\M-?" 'idlwave-context-help)
1642(define-key idlwave-mode-map [(control meta ?\?)] 'idlwave-online-help)
1640(define-key idlwave-mode-map [(meta tab)] 'idlwave-complete) 1643(define-key idlwave-mode-map [(meta tab)] 'idlwave-complete)
1641(define-key idlwave-mode-map "\C-c\C-i" 'idlwave-update-routine-info) 1644(define-key idlwave-mode-map "\C-c\C-i" 'idlwave-update-routine-info)
1642(define-key idlwave-mode-map "\C-c=" 'idlwave-resolve) 1645(define-key idlwave-mode-map "\C-c=" 'idlwave-resolve)
@@ -1965,7 +1968,7 @@ The main features of this mode are
1965 "[ \t\f]*$\\|[ \t]*;+[ \t]*$\\|;+[+=-_*]+$") 1968 "[ \t\f]*$\\|[ \t]*;+[ \t]*$\\|;+[+=-_*]+$")
1966 (set (make-local-variable 'paragraph-start) "[ \t\f]\\|[ \t]*;+[ \t]") 1969 (set (make-local-variable 'paragraph-start) "[ \t\f]\\|[ \t]*;+[ \t]")
1967 (set (make-local-variable 'paragraph-ignore-fill-prefix) nil) 1970 (set (make-local-variable 'paragraph-ignore-fill-prefix) nil)
1968 (set (make-local-variable 'parse-sexp-ignore-comments) nil) 1971 (set (make-local-variable 'parse-sexp-ignore-comments) t)
1969 1972
1970 ;; Set tag table list to use IDLTAGS as file name. 1973 ;; Set tag table list to use IDLTAGS as file name.
1971 (if (boundp 'tag-table-alist) 1974 (if (boundp 'tag-table-alist)
@@ -2134,18 +2137,33 @@ An END token must be preceded by whitespace."
2134 "Finds the start of current block and blinks to it for a second. 2137 "Finds the start of current block and blinks to it for a second.
2135Also checks if the correct end statement has been used." 2138Also checks if the correct end statement has been used."
2136 ;; All end statements are reserved words 2139 ;; All end statements are reserved words
2137 (let* ((pos (point)) 2140 ;; Re-indent end line
2138 end end1) 2141 (insert-char ?\ 1) ;; So indent, etc. work well
2142 (backward-char 1)
2143 (let* ((pos (point-marker))
2144 (last-abbrev-marker (copy-marker last-abbrev-location))
2145 (eol-pos (save-excursion (end-of-line) (point)))
2146 begin-pos end-pos end end1 )
2147 (if idlwave-reindent-end (idlwave-indent-line))
2148
2139 (when (and (idlwave-check-abbrev 0 t) 2149 (when (and (idlwave-check-abbrev 0 t)
2140 idlwave-show-block) 2150 idlwave-show-block)
2141 (save-excursion 2151 (save-excursion
2142 ;; Move inside current block 2152 ;; Move inside current block
2143 (setq end (buffer-substring 2153 (goto-char last-abbrev-marker)
2144 (save-excursion (skip-chars-backward "a-zA-Z")
2145 (point))
2146 (point)))
2147 (idlwave-beginning-of-statement)
2148 (idlwave-block-jump-out -1 'nomark) 2154 (idlwave-block-jump-out -1 'nomark)
2155 (setq begin-pos (point))
2156 (idlwave-block-jump-out 1 'nomark)
2157 (setq end-pos (point))
2158 (if (> end-pos eol-pos)
2159 (setq end-pos pos))
2160 (goto-char end-pos)
2161 (setq end (buffer-substring
2162 (progn
2163 (skip-chars-backward "a-zA-Z")
2164 (point))
2165 end-pos))
2166 (goto-char begin-pos)
2149 (when (setq end1 (cdr (idlwave-block-master))) 2167 (when (setq end1 (cdr (idlwave-block-master)))
2150 (cond 2168 (cond
2151 ((null end1)) ; no-operation 2169 ((null end1)) ; no-operation
@@ -2165,9 +2183,7 @@ Also checks if the correct end statement has been used."
2165 (message "Warning: Shouldn't this be \"%s\" instead of \"%s\"?" 2183 (message "Warning: Shouldn't this be \"%s\" instead of \"%s\"?"
2166 end1 end) 2184 end1 end)
2167 (sit-for 1))))))) 2185 (sit-for 1)))))))
2168 ;; Re-indent end line 2186 (delete-char 1))
2169 (if idlwave-reindent-end
2170 (idlwave-indent-line)))
2171 2187
2172(defun idlwave-block-master () 2188(defun idlwave-block-master ()
2173 (let ((case-fold-search t)) 2189 (let ((case-fold-search t))
@@ -2588,6 +2604,14 @@ If not in a statement just moves to end of line. Returns position."
2588 (looking-at "^@"))))) 2604 (looking-at "^@")))))
2589 last-statement)) 2605 last-statement))
2590 2606
2607(defun idlwave-skip-multi-commands (&optional lim)
2608 "Skip past multiple commands on a line (with `&')."
2609 (let ((save-point (point)))
2610 (when (re-search-forward ".*&" lim t)
2611 (goto-char (match-end 0))
2612 (if (idlwave-in-quote) (goto-char save-point)))
2613 (point)))
2614
2591(defun idlwave-skip-label-or-case () 2615(defun idlwave-skip-label-or-case ()
2592 "Skip label or case statement element. 2616 "Skip label or case statement element.
2593Returns position after label. 2617Returns position after label.
@@ -2627,6 +2651,7 @@ substatement."
2627 st nst last) 2651 st nst last)
2628 (idlwave-beginning-of-statement) 2652 (idlwave-beginning-of-statement)
2629 (idlwave-skip-label-or-case) 2653 (idlwave-skip-label-or-case)
2654 (idlwave-skip-multi-commands orig)
2630 (setq last (point)) 2655 (setq last (point))
2631 ;; Continue looking for substatements until we are past orig 2656 ;; Continue looking for substatements until we are past orig
2632 (while (and (<= (point) orig) (not (eobp))) 2657 (while (and (<= (point) orig) (not (eobp)))
@@ -2656,7 +2681,8 @@ list not just the type symbol. Returns nil if not an identifiable
2656statement." 2681statement."
2657 (save-excursion 2682 (save-excursion
2658 ;; Skip whitespace within a statement which is spaces, tabs, continuations 2683 ;; Skip whitespace within a statement which is spaces, tabs, continuations
2659 (while (looking-at "[ \t]*\\<\\$") 2684 ;; and possibly comments
2685 (while (looking-at "[ \t]*\\$")
2660 (forward-line 1)) 2686 (forward-line 1))
2661 (skip-chars-forward " \t") 2687 (skip-chars-forward " \t")
2662 (let ((st idlwave-statement-match) 2688 (let ((st idlwave-statement-match)
@@ -2757,13 +2783,16 @@ If the optional argument EXPAND is non-nil then the actions in
2757 ;; indent the line 2783 ;; indent the line
2758 (idlwave-indent-left-margin (idlwave-calculate-indent))) 2784 (idlwave-indent-left-margin (idlwave-calculate-indent)))
2759 ;; Adjust parallel comment 2785 ;; Adjust parallel comment
2760 (end-of-line) 2786 (end-of-line)
2761 (if (idlwave-in-comment) 2787 (if (idlwave-in-comment)
2762 (indent-for-comment)))) 2788 ;; Emacs 21 is too smart with fill-column on comment indent
2789 (let ((fill-column (if (fboundp 'comment-indent-new-line)
2790 (1- (frame-width))
2791 fill-column)))
2792 (indent-for-comment)))))
2763 (goto-char mloc) 2793 (goto-char mloc)
2764 ;; Get rid of marker 2794 ;; Get rid of marker
2765 (set-marker mloc nil) 2795 (set-marker mloc nil)))
2766 ))
2767 2796
2768(defun idlwave-do-action (action) 2797(defun idlwave-do-action (action)
2769 "Perform an action repeatedly on a line. 2798 "Perform an action repeatedly on a line.
@@ -2895,7 +2924,12 @@ statement if this statement is a continuation of the previous line."
2895 (case-fold-search t) 2924 (case-fold-search t)
2896 (end-reg (progn (beginning-of-line) (point))) 2925 (end-reg (progn (beginning-of-line) (point)))
2897 (close-exp (progn (skip-chars-forward " \t") (looking-at "\\s)"))) 2926 (close-exp (progn (skip-chars-forward " \t") (looking-at "\\s)")))
2898 (beg-reg (progn (idlwave-previous-statement) (point))) 2927; (beg-reg (progn (idlwave-previous-statement) (point)))
2928 (beg-reg (progn ;; Use substatement indent unless it's this line
2929 (idlwave-start-of-substatement 'pre)
2930 (if (eq (line-beginning-position) end-reg)
2931 (idlwave-previous-statement))
2932 (point)))
2899 (cur-indent (idlwave-current-indent)) 2933 (cur-indent (idlwave-current-indent))
2900 (else-cont (and (goto-char end-reg) (looking-at "[ \t]*else"))) 2934 (else-cont (and (goto-char end-reg) (looking-at "[ \t]*else")))
2901 (basic-indent ;; The basic, non-fancy indent 2935 (basic-indent ;; The basic, non-fancy indent
@@ -2908,7 +2942,7 @@ statement if this statement is a continuation of the previous line."
2908 (cond 2942 (cond
2909 ;; A continued Procedure call or definition 2943 ;; A continued Procedure call or definition
2910 ((progn 2944 ((progn
2911 (idlwave-look-at "\\(pro\\|function\\)") 2945 (idlwave-look-at "^[ \t]*\\(pro\\|function\\)") ;skip over
2912 (looking-at "[ \t]*\\([a-zA-Z0-9$_]+[ \t]*->[ \t]*\\)?[a-zA-Z][:a-zA-Z0-9$_]*[ \t]*\\(,\\)[ \t]*")) 2946 (looking-at "[ \t]*\\([a-zA-Z0-9$_]+[ \t]*->[ \t]*\\)?[a-zA-Z][:a-zA-Z0-9$_]*[ \t]*\\(,\\)[ \t]*"))
2913 (goto-char (match-end 0)) 2947 (goto-char (match-end 0))
2914 ;; Comment only, or blank line with "$"? Align with , 2948 ;; Comment only, or blank line with "$"? Align with ,
@@ -2917,7 +2951,7 @@ statement if this statement is a continuation of the previous line."
2917 (current-column)) 2951 (current-column))
2918 2952
2919 ;; Continued assignment (with =), 2953 ;; Continued assignment (with =),
2920 ((looking-at "[ \t]*[a-zA-Z0-9$_]+[ \t]*\\(=\\)[ \t]*") 2954 ((looking-at "[ \t]*[][().a-zA-Z0-9$_]+[ \t]*\\(=\\)[ \t]*")
2921 (goto-char (match-end 0)) 2955 (goto-char (match-end 0))
2922 ;; Comment only? Align with = 2956 ;; Comment only? Align with =
2923 (if (save-match-data (looking-at "[ \t$]*\\(;.*\\)?$")) 2957 (if (save-match-data (looking-at "[ \t$]*\\(;.*\\)?$"))
@@ -3574,6 +3608,18 @@ constants - a double quote followed by an octal digit."
3574 ;; return string beginning position or nil 3608 ;; return string beginning position or nil
3575 (if (> start bq) bq)))) 3609 (if (> start bq) bq))))
3576 3610
3611(defun idlwave-is-pointer-dereference (&optional limit)
3612 "Determines if the character after point is a pointer dereference *."
3613 (let ((pos (point)))
3614 (and
3615 (eq (char-after) ?\*)
3616 (not (idlwave-in-quote))
3617 (save-excursion
3618 (forward-char)
3619 (re-search-backward (concat "\\(" idlwave-idl-keywords
3620 "\\|[[(*+-/=,^><]\\)\\s-*\\*") limit t)))))
3621
3622
3577;; Statement templates 3623;; Statement templates
3578 3624
3579;; Replace these with a general template function, something like 3625;; Replace these with a general template function, something like
@@ -3951,7 +3997,7 @@ blank lines."
3951;; "sinterned" strings. The only exception is that the functions 3997;; "sinterned" strings. The only exception is that the functions
3952;; which scan whole buffers for routine information do not intern the 3998;; which scan whole buffers for routine information do not intern the
3953;; grabbed strings. This is only done afterwards. Therefore in these 3999;; grabbed strings. This is only done afterwards. Therefore in these
3954;; functions it is *not* save to assume the strings can be compared 4000;; functions it is *not* safe to assume the strings can be compared
3955;; with `eq' and be fed into the routine assq functions. 4001;; with `eq' and be fed into the routine assq functions.
3956 4002
3957;; Here we define the hashing functions. 4003;; Here we define the hashing functions.
@@ -4542,7 +4588,7 @@ With three prefix args, dispatch asynchronous process to do the update."
4542 (goto-char (point-min)) 4588 (goto-char (point-min))
4543 (while (re-search-forward 4589 (while (re-search-forward
4544 "^[ \t]*\\(pro\\|function\\)[ \t]" nil t) 4590 "^[ \t]*\\(pro\\|function\\)[ \t]" nil t)
4545 (setq string (buffer-substring 4591 (setq string (buffer-substring-no-properties
4546 (match-beginning 0) 4592 (match-beginning 0)
4547 (progn 4593 (progn
4548 (idlwave-end-of-statement) 4594 (idlwave-end-of-statement)
@@ -5016,7 +5062,7 @@ end
5016 5062
5017(defvar idlwave-shell-temp-pro-file) 5063(defvar idlwave-shell-temp-pro-file)
5018(defvar idlwave-shell-temp-rinfo-save-file) 5064(defvar idlwave-shell-temp-rinfo-save-file)
5019(defun idlwave-shell-update-routine-info (&optional quiet run-hooks) 5065(defun idlwave-shell-update-routine-info (&optional quiet run-hooks preempt)
5020 "Query the shell for routine_info of compiled modules and update the lists." 5066 "Query the shell for routine_info of compiled modules and update the lists."
5021 ;; Save and compile the procedure. The compiled procedure is then 5067 ;; Save and compile the procedure. The compiled procedure is then
5022 ;; saved into an IDL SAVE file, to allow for fast RESTORE. 5068 ;; saved into an IDL SAVE file, to allow for fast RESTORE.
@@ -5048,7 +5094,7 @@ end
5048 `(progn 5094 `(progn
5049 (idlwave-shell-routine-info-filter) 5095 (idlwave-shell-routine-info-filter)
5050 (idlwave-concatenate-rinfo-lists ,quiet ,run-hooks)) 5096 (idlwave-concatenate-rinfo-lists ,quiet ,run-hooks))
5051 'hide)) 5097 'hide preempt))
5052 5098
5053;; --------------------------------------------------------------------------- 5099;; ---------------------------------------------------------------------------
5054;; 5100;;
@@ -5127,7 +5173,7 @@ When we force a method or a method keyword, CLASS can specify the class."
5127 5173
5128 ;; Check for any special completion functions 5174 ;; Check for any special completion functions
5129 ((and idlwave-complete-special 5175 ((and idlwave-complete-special
5130 (idlwave-complete-special))) 5176 (idlwave-call-special idlwave-complete-special)))
5131 5177
5132 ((and (idlwave-in-quote) 5178 ((and (idlwave-in-quote)
5133 (not (eq what 'class))) 5179 (not (eq what 'class)))
@@ -5156,7 +5202,9 @@ When we force a method or a method keyword, CLASS can specify the class."
5156 (format "Select a %s name%s" 5202 (format "Select a %s name%s"
5157 isa 5203 isa
5158 (if class-selector 5204 (if class-selector
5159 (format " (class is %s)" class-selector) 5205 (format " (class is %s)"
5206 (if (eq class-selector t)
5207 "unknown" class-selector))
5160 "")) 5208 ""))
5161 isa 5209 isa
5162 'idlwave-attach-method-classes))) 5210 'idlwave-attach-method-classes)))
@@ -5177,7 +5225,9 @@ When we force a method or a method keyword, CLASS can specify the class."
5177 (format "Select a %s name%s" 5225 (format "Select a %s name%s"
5178 isa 5226 isa
5179 (if class-selector 5227 (if class-selector
5180 (format " (class is %s)" class-selector) 5228 (format " (class is %s)"
5229 (if (eq class-selector t)
5230 "unknown" class-selector))
5181 "")) 5231 ""))
5182 isa 5232 isa
5183 'idlwave-attach-method-classes))) 5233 'idlwave-attach-method-classes)))
@@ -5264,13 +5314,14 @@ use `idlwave-complete-in-buffer' to do some completion and return `t'.
5264If such a function returns `t', *no further* attempts to complete 5314If such a function returns `t', *no further* attempts to complete
5265other contexts will be done. If the function returns `nil', other completions 5315other contexts will be done. If the function returns `nil', other completions
5266will be tried.") 5316will be tried.")
5267(defun idlwave-complete-special () 5317
5268 (let ((functions idlwave-complete-special) 5318(defun idlwave-call-special (functions &rest args)
5269 fun) 5319 (let ((funcs functions)
5320 fun ret)
5270 (catch 'exit 5321 (catch 'exit
5271 (while (setq fun (pop functions)) 5322 (while (setq fun (pop funcs))
5272 (if (funcall fun) 5323 (if (setq ret (apply fun args))
5273 (throw 'exit t))) 5324 (throw 'exit ret)))
5274 nil))) 5325 nil)))
5275 5326
5276(defun idlwave-make-force-complete-where-list (what &optional module class) 5327(defun idlwave-make-force-complete-where-list (what &optional module class)
@@ -5522,14 +5573,18 @@ INFO is as returned by idlwave-what-function or -procedure."
5522 (save-excursion (goto-char apos) 5573 (save-excursion (goto-char apos)
5523 (looking-at "->[a-zA-Z][a-zA-Z0-9$_]*::"))))) 5574 (looking-at "->[a-zA-Z][a-zA-Z0-9$_]*::")))))
5524 5575
5576(defvar idlwave-determine-class-special nil
5577 "List of special functions for determining class.
5578Must accept two arguments: `apos' and `info'")
5579
5525(defun idlwave-determine-class (info type) 5580(defun idlwave-determine-class (info type)
5526 ;; Determine the class of a routine call. INFO is the structure returned 5581 ;; Determine the class of a routine call.
5527 ;; `idlwave-what-function' or `idlwave-what-procedure'. 5582 ;; INFO is the `cw-list' structure as returned by idlwave-where.
5528 ;; The third element in this structure is the class. When nil, we return nil. 5583 ;; The second element in this structure is the class. When nil, we
5529 ;; When t, try to get the class from text properties at the arrow. When 5584 ;; return nil. When t, try to get the class from text properties at
5530 ;; the object is "self", we use the class of the current routine. 5585 ;; the arrow. When the object is "self", we use the class of the
5531 ;; otherwise prompt the user for a class name. Also stores the selected 5586 ;; current routine. otherwise prompt the user for a class name.
5532 ;; class as a text property at the arrow. 5587 ;; Also stores the selected class as a text property at the arrow.
5533 ;; TYPE is 'fun or 'pro. 5588 ;; TYPE is 'fun or 'pro.
5534 (let* ((class (nth 2 info)) 5589 (let* ((class (nth 2 info))
5535 (apos (nth 3 info)) 5590 (apos (nth 3 info))
@@ -5550,7 +5605,7 @@ INFO is as returned by idlwave-what-function or -procedure."
5550 (let ((case-fold-search t)) 5605 (let ((case-fold-search t))
5551 (looking-at "self\\>"))))) 5606 (looking-at "self\\>")))))
5552 (force-query idlwave-force-class-query) 5607 (force-query idlwave-force-class-query)
5553 store class-alist) 5608 store special-class class-alist)
5554 (cond 5609 (cond
5555 ((null class) nil) 5610 ((null class) nil)
5556 ((eq t class) 5611 ((eq t class)
@@ -5560,9 +5615,20 @@ INFO is as returned by idlwave-what-function or -procedure."
5560 (not force-query)) 5615 (not force-query))
5561 (setq class (get-text-property apos 'idlwave-class) 5616 (setq class (get-text-property apos 'idlwave-class)
5562 class (idlwave-sintern-class class))) 5617 class (idlwave-sintern-class class)))
5563 (when (and (eq t class) 5618 (if (and (eq t class) is-self)
5564 is-self) 5619 (setq class (or (nth 2 (idlwave-current-routine)) class)))
5565 (setq class (or (nth 2 (idlwave-current-routine)) class))) 5620
5621 ;; Before prompting, try any special class determination routines
5622 (when (and (eq t class)
5623 idlwave-determine-class-special
5624 (not force-query))
5625 (setq special-class
5626 (idlwave-call-special idlwave-determine-class-special apos))
5627 (if special-class
5628 (setq class (idlwave-sintern-class special-class)
5629 store idlwave-store-inquired-class)))
5630
5631 ;; Prompt for a class, if we need to
5566 (when (and (eq class t) 5632 (when (and (eq class t)
5567 (or force-query query)) 5633 (or force-query query))
5568 (setq class-alist 5634 (setq class-alist
@@ -5582,11 +5648,17 @@ INFO is as returned by idlwave-what-function or -procedure."
5582 type (car info)) 5648 type (car info))
5583 "")) 5649 ""))
5584 class-alist nil nil nil 'idlwave-class-history)))))) 5650 class-alist nil nil nil 'idlwave-class-history))))))
5651
5652 ;; Store it, if requested
5585 (when (and class (not (eq t class))) 5653 (when (and class (not (eq t class)))
5586 ;; We have a real class here 5654 ;; We have a real class here
5587 (when (and store arrow) 5655 (when (and store arrow)
5588 (put-text-property apos (+ apos 2) 'idlwave-class class) 5656 (condition-case ()
5589 (put-text-property apos (+ apos 2) 'face idlwave-class-arrow-face)) 5657 (add-text-properties
5658 apos (+ apos 2)
5659 `(idlwave-class ,class face ,idlwave-class-arrow-face
5660 rear-nonsticky t))
5661 (error nil)))
5590 (setf (nth 2 info) class)) 5662 (setf (nth 2 info) class))
5591 ;; Return the class 5663 ;; Return the class
5592 class) 5664 class)
@@ -5678,7 +5750,7 @@ ARROW: Location of the arrow"
5678 (setq cw 'function) 5750 (setq cw 'function)
5679 (save-excursion 5751 (save-excursion
5680 (if (re-search-backward "->[ \t]*\\(\\([$a-zA-Z0-9_]+\\)::\\)?[$a-zA-Z0-9_]*\\=" bos t) 5752 (if (re-search-backward "->[ \t]*\\(\\([$a-zA-Z0-9_]+\\)::\\)?[$a-zA-Z0-9_]*\\=" bos t)
5681 (setq cw-arrow (match-beginning 0) 5753 (setq cw-arrow (copy-marker (match-beginning 0))
5682 cw-class (if (match-end 2) 5754 cw-class (if (match-end 2)
5683 (idlwave-sintern-class (match-string 2)) 5755 (idlwave-sintern-class (match-string 2))
5684 t)))))) 5756 t))))))
@@ -5698,8 +5770,8 @@ ARROW: Location of the arrow"
5698 5770
5699(defun idlwave-what-function (&optional bound) 5771(defun idlwave-what-function (&optional bound)
5700 ;; Find out if point is within the argument list of a function. 5772 ;; Find out if point is within the argument list of a function.
5701 ;; The return value is ("function-name" (point) level). 5773 ;; The return value is ("function-name" class arrow-start (point) level).
5702 ;; Level is 1 on the to level parenthesis, higher further down. 5774 ;; Level is 1 on the top level parentheses, higher further down.
5703 5775
5704 ;; If the optional BOUND is an integer, bound backwards directed 5776 ;; If the optional BOUND is an integer, bound backwards directed
5705 ;; searches to this point. 5777 ;; searches to this point.
@@ -5728,7 +5800,7 @@ ARROW: Location of the arrow"
5728 pos func-point) 5800 pos func-point)
5729 (if (re-search-backward 5801 (if (re-search-backward
5730 "->[ \t]*\\(\\([a-zA-Z][a-zA-Z0-9$_]*\\)::\\)?\\=" bound t) 5802 "->[ \t]*\\(\\([a-zA-Z][a-zA-Z0-9$_]*\\)::\\)?\\=" bound t)
5731 (setq arrow-start (match-beginning 0) 5803 (setq arrow-start (copy-marker (match-beginning 0))
5732 class (or (match-string 2) t))) 5804 class (or (match-string 2) t)))
5733 (throw 5805 (throw
5734 'exit 5806 'exit
@@ -5752,9 +5824,9 @@ ARROW: Location of the arrow"
5752 (idlwave-start-of-substatement 'pre) 5824 (idlwave-start-of-substatement 'pre)
5753 (setq string (buffer-substring (point) pos)) 5825 (setq string (buffer-substring (point) pos))
5754 (if (string-match 5826 (if (string-match
5755 "\\`\\(.*&\\)?[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)[ \t]*\\(,\\|\\'\\)" string) 5827 "\\`[ \t]*\\([a-zA-Z][a-zA-Z0-9$_]*\\)[ \t]*\\(,\\|\\'\\)" string)
5756 (setq pro (match-string 2 string) 5828 (setq pro (match-string 1 string)
5757 pro-point (+ (point) (match-beginning 2))) 5829 pro-point (+ (point) (match-beginning 1)))
5758 (if (and (idlwave-skip-object) 5830 (if (and (idlwave-skip-object)
5759 (setq string (buffer-substring (point) pos)) 5831 (setq string (buffer-substring (point) pos))
5760 (string-match 5832 (string-match
@@ -5764,7 +5836,7 @@ ARROW: Location of the arrow"
5764 pro-point (if (match-beginning 4) 5836 pro-point (if (match-beginning 4)
5765 (+ (point) (match-beginning 4)) 5837 (+ (point) (match-beginning 4))
5766 pos) 5838 pos)
5767 arrow-start (+ (point) (match-beginning 1)) 5839 arrow-start (copy-marker (+ (point) (match-beginning 1)))
5768 class (or (match-string 3 string) t))))) 5840 class (or (match-string 3 string) t)))))
5769 (list (idlwave-sintern-routine-or-method pro class) 5841 (list (idlwave-sintern-routine-or-method pro class)
5770 (idlwave-sintern-class class) 5842 (idlwave-sintern-class class)
@@ -5802,7 +5874,6 @@ ARROW: Location of the arrow"
5802 (goto-char pos) 5874 (goto-char pos)
5803 nil))) 5875 nil)))
5804 5876
5805
5806(defun idlwave-last-valid-char () 5877(defun idlwave-last-valid-char ()
5807 "Return the last character before point which is not white or a comment 5878 "Return the last character before point which is not white or a comment
5808and also not part of the current identifier. Since we do this in 5879and also not part of the current identifier. Since we do this in
@@ -5839,8 +5910,9 @@ This function is not general, can only be used for completion stuff."
5839(defun idlwave-complete-in-buffer (type stype list selector prompt isa 5910(defun idlwave-complete-in-buffer (type stype list selector prompt isa
5840 &optional prepare-display-function) 5911 &optional prepare-display-function)
5841 "Perform TYPE completion of word before point against LIST. 5912 "Perform TYPE completion of word before point against LIST.
5842SELECTOR is the PREDICATE argument for the completion function. 5913SELECTOR is the PREDICATE argument for the completion function. Show
5843Show PROMPT in echo area. TYPE is one of 'function, 'procedure or 'keyword." 5914PROMPT in echo area. TYPE is one of 'function, 'procedure,
5915'class-tag, or 'keyword."
5844 (let* ((completion-ignore-case t) 5916 (let* ((completion-ignore-case t)
5845 beg (end (point)) slash part spart completion all-completions 5917 beg (end (point)) slash part spart completion all-completions
5846 dpart dcompletion) 5918 dpart dcompletion)
@@ -5869,7 +5941,7 @@ Show PROMPT in echo area. TYPE is one of 'function, 'procedure or 'keyword."
5869 (cond 5941 (cond
5870 ((null completion) 5942 ((null completion)
5871 ;; nothing available. 5943 ;; nothing available.
5872 (error "Can't find %s completion for \"%s\"" isa part)) 5944 (error (concat prompt ": no completion for \"%s\"") part))
5873 ((and (not (equal dpart dcompletion)) 5945 ((and (not (equal dpart dcompletion))
5874 (not (eq t completion))) 5946 (not (eq t completion)))
5875 ;; We can add something 5947 ;; We can add something
@@ -5940,24 +6012,24 @@ Show PROMPT in echo area. TYPE is one of 'function, 'procedure or 'keyword."
5940 (idlwave-complete-in-buffer 'class 'class (idlwave-class-alist) nil 6012 (idlwave-complete-in-buffer 'class 'class (idlwave-class-alist) nil
5941 "Select a class" "class"))) 6013 "Select a class" "class")))
5942 6014
5943(defun idlwave-attach-classes (list is-kwd show-classes) 6015(defun idlwave-attach-classes (list type show-classes)
5944 ;; Attach the proper class list to a LIST of completion items. 6016 ;; Attach the proper class list to a LIST of completion items.
5945 ;; IS-KWD, when non-nil, shows its keywords - otherwise its methods 6017 ;; TYPE, when 'kwd, shows classes for method keywords, when
6018 ;; 'class-tag, for class tags, and otherwise for methods.
5946 ;; SHOW-CLASSES is the value of `idlwave-completion-show-classes'. 6019 ;; SHOW-CLASSES is the value of `idlwave-completion-show-classes'.
5947 (catch 'exit 6020 (if (or (null show-classes) ; don't want to see classes
5948 (if (or (null show-classes) ; don't want to see classes 6021 (null class-selector) ; not a method call
5949 (null class-selector) ; not a method call 6022 (and
5950 (and (stringp class-selector) ; the class is already known 6023 (stringp class-selector) ; the class is already known
5951 (not super-classes))) ; no possibilities for inheritance 6024 (not super-classes))) ; no possibilities for inheritance
5952 ;; In these cases, we do not have to do anything 6025 ;; In these cases, we do not have to do anything
5953 (throw 'exit list)) 6026 list
5954
5955 (let* ((do-prop (and (>= show-classes 0) 6027 (let* ((do-prop (and (>= show-classes 0)
5956 (>= emacs-major-version 21))) 6028 (>= emacs-major-version 21)))
5957 (do-buf (not (= show-classes 0))) 6029 (do-buf (not (= show-classes 0)))
5958 ; (do-dots (featurep 'xemacs)) 6030 ;; (do-dots (featurep 'xemacs))
5959 (do-dots t) 6031 (do-dots t)
5960 (inherit (if super-classes 6032 (inherit (if (and (not (eq type 'class-tag)) super-classes)
5961 (cons class-selector super-classes))) 6033 (cons class-selector super-classes)))
5962 (max (abs show-classes)) 6034 (max (abs show-classes))
5963 (lmax (if do-dots (apply 'max (mapcar 'length list)))) 6035 (lmax (if do-dots (apply 'max (mapcar 'length list))))
@@ -5965,16 +6037,22 @@ Show PROMPT in echo area. TYPE is one of 'function, 'procedure or 'keyword."
5965 (mapcar 6037 (mapcar
5966 (lambda (x) 6038 (lambda (x)
5967 ;; get the classes 6039 ;; get the classes
5968 (setq classes 6040 (if (eq type 'class-tag)
5969 (if is-kwd 6041 ;; Just one class for tags
5970 (idlwave-all-method-keyword-classes 6042 (setq classes
5971 method-selector x type-selector) 6043 (list
5972 (idlwave-all-method-classes x type-selector))) 6044 (idlwave-class-or-superclass-with-tag class-selector x)))
5973 (if inherit 6045 ;; Multiple classes for method of method-keyword
5974 (setq classes 6046 (setq classes
5975 (delq nil 6047 (if (eq type 'kwd)
5976 (mapcar (lambda (x) (if (memq x inherit) x nil)) 6048 (idlwave-all-method-keyword-classes
5977 classes)))) 6049 method-selector x type-selector)
6050 (idlwave-all-method-classes x type-selector)))
6051 (if inherit
6052 (setq classes
6053 (delq nil
6054 (mapcar (lambda (x) (if (memq x inherit) x nil))
6055 classes)))))
5978 (setq nclasses (length classes)) 6056 (setq nclasses (length classes))
5979 ;; Make the separator between item and class-info 6057 ;; Make the separator between item and class-info
5980 (if do-dots 6058 (if do-dots
@@ -6001,10 +6079,14 @@ Show PROMPT in echo area. TYPE is one of 'function, 'procedure or 'keyword."
6001 6079
6002(defun idlwave-attach-method-classes (list) 6080(defun idlwave-attach-method-classes (list)
6003 ;; Call idlwave-attach-classes with method parameters 6081 ;; Call idlwave-attach-classes with method parameters
6004 (idlwave-attach-classes list nil idlwave-completion-show-classes)) 6082 (idlwave-attach-classes list 'method idlwave-completion-show-classes))
6005(defun idlwave-attach-keyword-classes (list) 6083(defun idlwave-attach-keyword-classes (list)
6006 ;; Call idlwave-attach-classes with keyword parameters 6084 ;; Call idlwave-attach-classes with keyword parameters
6007 (idlwave-attach-classes list t idlwave-completion-show-classes)) 6085 (idlwave-attach-classes list 'kwd idlwave-completion-show-classes))
6086(defun idlwave-attach-class-tag-classes (list)
6087 ;; Call idlwave-attach-classes with class structure tags
6088 (idlwave-attach-classes list 'class-tag idlwave-completion-show-classes))
6089
6008 6090
6009;;---------------------------------------------------------------------- 6091;;----------------------------------------------------------------------
6010;;---------------------------------------------------------------------- 6092;;----------------------------------------------------------------------
@@ -6163,6 +6245,13 @@ sort the list before displaying"
6163 (remove-text-properties beg (point) '(face nil)))) 6245 (remove-text-properties beg (point) '(face nil))))
6164 (eval idlwave-complete-after-success-form-force)) 6246 (eval idlwave-complete-after-success-form-force))
6165 6247
6248(defun idlwave-keyboard-quit ()
6249 (interactive)
6250 (unwind-protect
6251 (if (eq (car-safe last-command) 'idlwave-display-completion-list)
6252 (idlwave-restore-wconf-after-completion))
6253 (keyboard-quit)))
6254
6166(defun idlwave-restore-wconf-after-completion () 6255(defun idlwave-restore-wconf-after-completion ()
6167 "Restore the old (before completion) window configuration." 6256 "Restore the old (before completion) window configuration."
6168 (and idlwave-completion-restore-window-configuration 6257 (and idlwave-completion-restore-window-configuration
@@ -6215,7 +6304,7 @@ sort the list before displaying"
6215 (setq this-command last-command))) 6304 (setq this-command last-command)))
6216 new-map)) 6305 new-map))
6217 6306
6218;; In Emacs we also to replace choose keybindings in the completion 6307;; In Emacs we also replace keybindings in the completion
6219;; map in order to install our wrappers. 6308;; map in order to install our wrappers.
6220 6309
6221(defun idlwave-display-completion-list-emacs (list) 6310(defun idlwave-display-completion-list-emacs (list)
@@ -6271,14 +6360,23 @@ Point is expected just before the opening `{' of the struct definition."
6271 (end (cdr borders)) 6360 (end (cdr borders))
6272 tags) 6361 tags)
6273 (goto-char beg) 6362 (goto-char beg)
6274 (while (re-search-forward "[{,][ \t]*\\(\\$.*\n[ \t]*\\)?\\([a-zA-Z][a-zA-Z0-9_]*\\)[ \t]*:" end t) 6363 (while (re-search-forward "[{,][ \t]*\\(\\$.*\n\\(^[ \t]*\\(\\$[ \t]*\\)?\\(;.*\\)?\n\\)*[ \t]*\\)?\\([a-zA-Z][a-zA-Z0-9_]*\\)[ \t]*:" end t)
6275 ;; Check if we are still on the top level of the structure. 6364 ;; Check if we are still on the top level of the structure.
6276 (if (and (condition-case nil (progn (up-list -1) t) (error nil)) 6365 (if (and (condition-case nil (progn (up-list -1) t) (error nil))
6277 (= (point) beg)) 6366 (= (point) beg))
6278 (push (match-string 2) tags)) 6367 (push (match-string 5) tags))
6279 (goto-char (match-end 0))) 6368 (goto-char (match-end 0)))
6280 (nreverse tags)))) 6369 (nreverse tags))))
6281 6370
6371(defun idlwave-find-struct-tag (tag)
6372 "Find a given TAG in the structure defined at point."
6373 (let* ((borders (idlwave-struct-borders))
6374 (beg (car borders))
6375 (end (cdr borders))
6376 (case-fold-search t))
6377 (re-search-forward (concat "\\(^[ \t]*\\|[,{][ \t]*\\)" tag "[ \t]*:")
6378 end t)))
6379
6282(defun idlwave-struct-inherits () 6380(defun idlwave-struct-inherits ()
6283 "Return a list of all `inherits' names in the struct at point. 6381 "Return a list of all `inherits' names in the struct at point.
6284Point is expected just before the opening `{' of the struct definition." 6382Point is expected just before the opening `{' of the struct definition."
@@ -6324,7 +6422,7 @@ If NAME is non-nil, search for a named structure NAME. If BOUND is an
6324integer, limit the search. If BOUND is the symbol `all', we search 6422integer, limit the search. If BOUND is the symbol `all', we search
6325first back and then forward through the entire file. If BOUND is the 6423first back and then forward through the entire file. If BOUND is the
6326symbol `back' we search only backward." 6424symbol `back' we search only backward."
6327 (let* ((ws "[ \t]*\\(\\$.*\n[ \t]*\\)?") 6425 (let* ((ws "[ \t]*\\(\\$.*\n[ \t]*\\)*")
6328 (case-fold-search t) 6426 (case-fold-search t)
6329 (lim (if (integerp bound) bound nil)) 6427 (lim (if (integerp bound) bound nil))
6330 (re (concat 6428 (re (concat
@@ -6372,6 +6470,13 @@ symbol `back' we search only backward."
6372 (setcdr inherits (mapcar (lambda (x) (idlwave-sintern-class x 'set)) 6470 (setcdr inherits (mapcar (lambda (x) (idlwave-sintern-class x 'set))
6373 (cdr inherits)))))) 6471 (cdr inherits))))))
6374 6472
6473(defun idlwave-find-class-definition (class)
6474 (let ((case-fold-search t))
6475 (if (re-search-forward
6476 (concat "^[ \t]*pro[ \t]+" (downcase class) "__define" "\\>") nil t)
6477 ;; FIXME: should we limit to end of pro here?
6478 (idlwave-find-structure-definition nil class))))
6479
6375(defun idlwave-find-class-info (class) 6480(defun idlwave-find-class-info (class)
6376 "Find the __define procedure for a class structure and return info entry." 6481 "Find the __define procedure for a class structure and return info entry."
6377 (let* ((pro (concat (downcase class) "__define")) 6482 (let* ((pro (concat (downcase class) "__define"))
@@ -6394,14 +6499,10 @@ symbol `back' we search only backward."
6394 (insert-file-contents file)) 6499 (insert-file-contents file))
6395 (save-excursion 6500 (save-excursion
6396 (goto-char 1) 6501 (goto-char 1)
6397 (setq case-fold-search t) 6502 (if (idlwave-find-class-definition class)
6398 (when (and (re-search-forward 6503 (list class
6399 (concat "^[ \t]*pro[ \t]+" pro "\\>") nil t) 6504 (cons 'tags (idlwave-struct-tags))
6400 ;; FIXME: should we limit to end of pro here? 6505 (cons 'inherits (idlwave-struct-inherits)))))))))
6401 (idlwave-find-structure-definition nil class))
6402 (list class
6403 (cons 'tags (idlwave-struct-tags))
6404 (cons 'inherits (idlwave-struct-inherits)))))))))
6405 6506
6406(defun idlwave-class-tags (class) 6507(defun idlwave-class-tags (class)
6407 "Return the native tags in CLASS." 6508 "Return the native tags in CLASS."
@@ -6412,8 +6513,13 @@ symbol `back' we search only backward."
6412 6513
6413(defun idlwave-all-class-tags (class) 6514(defun idlwave-all-class-tags (class)
6414 "Return a list of native and inherited tags in CLASS." 6515 "Return a list of native and inherited tags in CLASS."
6415 (apply 'append (mapcar 'idlwave-class-tags 6516 (condition-case err
6416 (cons class (idlwave-all-class-inherits class))))) 6517 (apply 'append (mapcar 'idlwave-class-tags
6518 (cons class (idlwave-all-class-inherits class))))
6519 (error
6520 (idlwave-class-tag-reset)
6521 (error "%s" (error-message-string err)))))
6522
6417 6523
6418(defun idlwave-all-class-inherits (class) 6524(defun idlwave-all-class-inherits (class)
6419 "Return a list of all superclasses of CLASS (recursively expanded). 6525 "Return a list of all superclasses of CLASS (recursively expanded).
@@ -6427,12 +6533,21 @@ The list is cached in `idlwave-class-info' for faster access."
6427 entry) 6533 entry)
6428 (if (setq entry (assq 'all-inherits info)) 6534 (if (setq entry (assq 'all-inherits info))
6429 (cdr entry) 6535 (cdr entry)
6430 (let ((inherits (idlwave-class-inherits class)) 6536 ;; Save the depth of inheritance scan to check for circular references
6537 (let ((inherits (mapcar (lambda (x) (cons x 0))
6538 (idlwave-class-inherits class)))
6431 rtn all-inherits cl) 6539 rtn all-inherits cl)
6432 (while inherits 6540 (while inherits
6433 (setq cl (pop inherits) 6541 (setq cl (pop inherits)
6434 rtn (cons cl rtn) 6542 rtn (cons (car cl) rtn)
6435 inherits (append inherits (idlwave-class-inherits cl)))) 6543 inherits (append (mapcar (lambda (x)
6544 (cons x (1+ (cdr cl))))
6545 (idlwave-class-inherits (car cl)))
6546 inherits))
6547 (if (> (cdr cl) 999)
6548 (error
6549 "Class scan: inheritance depth exceeded. Circular inheritance?")
6550 ))
6436 (setq all-inherits (nreverse rtn)) 6551 (setq all-inherits (nreverse rtn))
6437 (nconc info (list (cons 'all-inherits all-inherits))) 6552 (nconc info (list (cons 'all-inherits all-inherits)))
6438 all-inherits)))))) 6553 all-inherits))))))
@@ -6446,10 +6561,10 @@ The list is cached in `idlwave-class-info' for faster access."
6446(defvar idlwave-current-tags-class nil) 6561(defvar idlwave-current-tags-class nil)
6447(defvar idlwave-current-class-tags nil) 6562(defvar idlwave-current-class-tags nil)
6448(defvar idlwave-current-native-class-tags nil) 6563(defvar idlwave-current-native-class-tags nil)
6449(defvar idlwave-sint-classtags nil) 6564(defvar idlwave-sint-class-tags nil)
6450(idlwave-new-sintern-type 'classtag) 6565(idlwave-new-sintern-type 'class-tag)
6451(add-to-list 'idlwave-complete-special 'idlwave-complete-class-structure-tag) 6566(add-to-list 'idlwave-complete-special 'idlwave-complete-class-structure-tag)
6452(add-hook 'idlwave-update-rinfo-hook 'idlwave-classtag-reset) 6567(add-hook 'idlwave-update-rinfo-hook 'idlwave-class-tag-reset)
6453 6568
6454(defun idlwave-complete-class-structure-tag () 6569(defun idlwave-complete-class-structure-tag ()
6455 "Complete a structure tag on a `self' argument in an object method." 6570 "Complete a structure tag on a `self' argument in an object method."
@@ -6461,33 +6576,39 @@ The list is cached in `idlwave-class-info' for faster access."
6461 (skip-chars-backward "[a-zA-Z0-9._$]") 6576 (skip-chars-backward "[a-zA-Z0-9._$]")
6462 (and (< (point) (- pos 4)) 6577 (and (< (point) (- pos 4))
6463 (looking-at "self\\."))) 6578 (looking-at "self\\.")))
6464 (let* ((class (nth 2 (idlwave-current-routine)))) 6579 (let* ((class-selector (nth 2 (idlwave-current-routine)))
6580 (super-classes (idlwave-all-class-inherits class-selector)))
6465 ;; Check if we are in a class routine 6581 ;; Check if we are in a class routine
6466 (unless class 6582 (unless class-selector
6467 (error "Not in a method procedure or function")) 6583 (error "Not in a method procedure or function"))
6468 ;; Check if we need to update the "current" class 6584 ;; Check if we need to update the "current" class
6469 (if (not (equal class idlwave-current-tags-class)) 6585 (if (not (equal class-selector idlwave-current-tags-class))
6470 (idlwave-prepare-class-tag-completion class)) 6586 (idlwave-prepare-class-tag-completion class-selector))
6471 (setq idlwave-completion-help-info nil) 6587 (setq idlwave-completion-help-info
6588 (list 'idlwave-complete-class-structure-tag-help
6589 (idlwave-sintern-routine
6590 (concat class-selector "__define"))
6591 nil))
6472 (let ((idlwave-cpl-bold idlwave-current-native-class-tags)) 6592 (let ((idlwave-cpl-bold idlwave-current-native-class-tags))
6473 (idlwave-complete-in-buffer 6593 (idlwave-complete-in-buffer
6474 'classtag 'classtag 6594 'class-tag 'class-tag
6475 idlwave-current-class-tags nil 6595 idlwave-current-class-tags nil
6476 (format "Select a tag of class %s" class) 6596 (format "Select a tag of class %s" class-selector)
6477 "class tag")) 6597 "class tag"
6598 'idlwave-attach-class-tag-classes))
6478 t) ; return t to skip other completions 6599 t) ; return t to skip other completions
6479 nil))) 6600 nil)))
6480 6601
6481(defun idlwave-classtag-reset () 6602(defun idlwave-class-tag-reset ()
6482 (setq idlwave-current-tags-class nil)) 6603 (setq idlwave-current-tags-class nil))
6483 6604
6484(defun idlwave-prepare-class-tag-completion (class) 6605(defun idlwave-prepare-class-tag-completion (class)
6485 "Find and parse the necessary class definitions for class structure tags." 6606 "Find and parse the necessary class definitions for class structure tags."
6486 (setq idlwave-sint-classtags nil) 6607 (setq idlwave-sint-class-tags nil)
6487 (setq idlwave-current-tags-class class) 6608 (setq idlwave-current-tags-class class)
6488 (setq idlwave-current-class-tags 6609 (setq idlwave-current-class-tags
6489 (mapcar (lambda (x) 6610 (mapcar (lambda (x)
6490 (list (idlwave-sintern-classtag x 'set))) 6611 (list (idlwave-sintern-class-tag x 'set)))
6491 (idlwave-all-class-tags class))) 6612 (idlwave-all-class-tags class)))
6492 (setq idlwave-current-native-class-tags 6613 (setq idlwave-current-native-class-tags
6493 (mapcar 'downcase (idlwave-class-tags class)))) 6614 (mapcar 'downcase (idlwave-class-tags class))))
@@ -6549,6 +6670,8 @@ Gets set in `idlw-rinfo.el'.")
6549 t)) ; return t to skip other completions 6670 t)) ; return t to skip other completions
6550 (t nil)))) 6671 (t nil))))
6551 6672
6673;; Here we fake help using the routine "system variables" with keyword
6674;; set to the sysvar. Name and kwd are global variables here.
6552(defvar name) 6675(defvar name)
6553(defvar kwd) 6676(defvar kwd)
6554(defun idlwave-complete-sysvar-help (mode word) 6677(defun idlwave-complete-sysvar-help (mode word)
@@ -6566,7 +6689,43 @@ Gets set in `idlw-rinfo.el'.")
6566 (nth 1 idlwave-completion-help-info) 6689 (nth 1 idlwave-completion-help-info)
6567 word)))) 6690 word))))
6568 (t (error "This should not happen")))) 6691 (t (error "This should not happen"))))
6569 6692
6693;; Fake help in the source buffer for class structure tags.
6694;; kwd and name are global-variables here.
6695(defvar idlwave-help-do-class-struct-tag nil)
6696(defun idlwave-complete-class-structure-tag-help (mode word)
6697 (cond
6698 ((eq mode 'test) ; nothing gets fontified for class tags
6699 nil)
6700 ((eq mode 'set)
6701 (let (class-with)
6702 (when (setq class-with
6703 (idlwave-class-or-superclass-with-tag
6704 idlwave-current-tags-class
6705 word))
6706 (if (assq (idlwave-sintern-class class-with)
6707 idlwave-system-class-info)
6708 (error "No help available for system class tags."))
6709 (setq name (concat class-with "__define"))))
6710 (setq kwd word
6711 idlwave-help-do-class-struct-tag t))
6712 (t (error "This should not happen"))))
6713
6714(defun idlwave-class-or-superclass-with-tag (class tag)
6715 "Find and return the CLASS or one of its superclass with the
6716associated TAG, if any."
6717 (let ((sclasses (cons class (cdr (assq 'all-inherits
6718 (idlwave-class-info class)))))
6719 cl)
6720 (catch 'exit
6721 (while sclasses
6722 (setq cl (pop sclasses))
6723 (let ((tags (idlwave-class-tags cl)))
6724 (while tags
6725 (if (eq t (compare-strings tag 0 nil (car tags) 0 nil t))
6726 (throw 'exit cl))
6727 (setq tags (cdr tags))))))))
6728
6570 6729
6571(defun idlwave-sysvars-reset () 6730(defun idlwave-sysvars-reset ()
6572 (if (and (fboundp 'idlwave-shell-is-running) 6731 (if (and (fboundp 'idlwave-shell-is-running)
@@ -6620,9 +6779,10 @@ Gets set in `idlw-rinfo.el'.")
6620 (set-buffer "*Completions*") 6779 (set-buffer "*Completions*")
6621 (save-excursion 6780 (save-excursion
6622 (goto-char (point-min)) 6781 (goto-char (point-min))
6623 (while (re-search-forward "\\.*<[^>]+>" nil t) 6782 (let ((buffer-read-only nil))
6624 (put-text-property (match-beginning 0) (match-end 0) 6783 (while (re-search-forward "\\.*<[^>]+>" nil t)
6625 'face 'font-lock-string-face)))))) 6784 (put-text-property (match-beginning 0) (match-end 0)
6785 'face 'font-lock-string-face)))))))
6626 6786
6627(defun idlwave-uniquify (list) 6787(defun idlwave-uniquify (list)
6628 (let (nlist) 6788 (let (nlist)
@@ -6676,10 +6836,13 @@ Restore the pre-completion window configuration if possible."
6676(defvar idlwave-last-context-help-pos nil) 6836(defvar idlwave-last-context-help-pos nil)
6677(defun idlwave-context-help (&optional arg) 6837(defun idlwave-context-help (&optional arg)
6678 "Display IDL Online Help on context. 6838 "Display IDL Online Help on context.
6679If point is on a keyword, help for that keyword will be shown. 6839If point is on a keyword, help for that keyword will be shown. If
6680If point is on a routine name or in the argument list of a routine, 6840point is on a routine name or in the argument list of a routine, help
6681help for that routine will be displayed. 6841for that routine will be displayed. Works for system routines and
6682Works for system routines and keywords only." 6842keywords, it pulls up text help. For other routies and keywords,
6843visits the source file, finding help in the header (if
6844`idlwave-help-source-try-header' is non-nil) or the routine definition
6845itself."
6683 (interactive "P") 6846 (interactive "P")
6684 (idlwave-require-online-help) 6847 (idlwave-require-online-help)
6685 (idlwave-do-context-help arg)) 6848 (idlwave-do-context-help arg))
@@ -6711,7 +6874,7 @@ Works for system routines and keywords only."
6711 (if idlwave-help-is-loaded 6874 (if idlwave-help-is-loaded
6712 t ;; everything is OK. 6875 t ;; everything is OK.
6713 (let* ((dir (or (idlwave-help-directory) 6876 (let* ((dir (or (idlwave-help-directory)
6714 (error "Online Help is not installed (idlwave-help-directory is unknown)"))) 6877 (error "Online Help not installed (help directory unknown) - download at idlwave.org")))
6715 (lfile1 (expand-file-name "idlw-help.elc" dir)) 6878 (lfile1 (expand-file-name "idlw-help.elc" dir))
6716 (lfile2 (expand-file-name "idlw-help.el" dir)) 6879 (lfile2 (expand-file-name "idlw-help.el" dir))
6717 (hfile (expand-file-name "idlw-help.txt" dir))) 6880 (hfile (expand-file-name "idlw-help.txt" dir)))
diff --git a/man/idlwave.texi b/man/idlwave.texi
index a087e3e0778..903b648e3c9 100644
--- a/man/idlwave.texi
+++ b/man/idlwave.texi
@@ -9,12 +9,12 @@
9@synindex ky cp 9@synindex ky cp
10@syncodeindex vr cp 10@syncodeindex vr cp
11@syncodeindex fn cp 11@syncodeindex fn cp
12@set VERSION 4.14 12@set VERSION 4.15
13@set EDITION 4.14 13@set EDITION 4.15
14@set IDLVERSION 5.5 14@set IDLVERSION 5.5
15@set NSYSROUTINES 1322 15@set NSYSROUTINES 1324
16@set NSYSKEYWORDS 5952 16@set NSYSKEYWORDS 6129
17@set DATE June 2002 17@set DATE September 2002
18@set AUTHOR J.D. Smith & Carsten Dominik 18@set AUTHOR J.D. Smith & Carsten Dominik
19@set AUTHOR-EMAIL dominik@@astro.uva.nl 19@set AUTHOR-EMAIL dominik@@astro.uva.nl
20@set MAINTAINER J.D. Smith 20@set MAINTAINER J.D. Smith
@@ -145,12 +145,13 @@ Completion
145 145
146* Case of Completed Words:: CaseOFcomPletedWords 146* Case of Completed Words:: CaseOFcomPletedWords
147* Object Method Completion and Class Ambiguity:: obj->Method, what? 147* Object Method Completion and Class Ambiguity:: obj->Method, what?
148* Object Method Completion in the Shell::
148* Class and Keyword Inheritance:: obj->Method, _EXTRA=e 149* Class and Keyword Inheritance:: obj->Method, _EXTRA=e
149* Structure Tag Completion:: Completing state.Tag 150* Structure Tag Completion:: Completing state.Tag
150 151
151Actions 152Actions
152 153
153* Block Boundary Check:: Is the END correct 154* Block Boundary Check:: Is the END statement correct?
154* Padding Operators:: Enforcing space around `=' etc 155* Padding Operators:: Enforcing space around `=' etc
155* Case Changes:: Enforcing upper case keywords 156* Case Changes:: Enforcing upper case keywords
156 157
@@ -158,15 +159,17 @@ The IDLWAVE Shell
158 159
159* Starting the Shell:: How to launch IDL as a subprocess 160* Starting the Shell:: How to launch IDL as a subprocess
160* Using the Shell:: Interactively working with the Shell 161* Using the Shell:: Interactively working with the Shell
161* Debugging IDL Programs:: Compilation/Debugging 162* Commands Sent to the Shell::
163* Debugging IDL Programs::
162* Examining Variables:: 164* Examining Variables::
163* Custom Expression Examination:: 165* Custom Expression Examination::
164 166
165Debugging IDL Programs 167Debugging IDL Programs
166 168
167* Compiling Programs:: Compiling buffers under the shell 169* Debug Key Bindings::
168* Breakpoints and Stepping:: Deciding where to stop and look 170* Compiling Programs::
169* Walking the Calling Stack:: From where was this routine called? 171* Breakpoints and Stepping::
172* Walking the Calling Stack::
170 173
171Installation 174Installation
172 175
@@ -203,9 +206,7 @@ inferior shell@footnote{Note that this package has nothing to do with
203the Interface Definition Language, part of the Common Object Request 206the Interface Definition Language, part of the Common Object Request
204Broker Architecture (CORBA)}. It can also be used for editing source 207Broker Architecture (CORBA)}. It can also be used for editing source
205files for the related WAVE/CL language, but with only limited 208files for the related WAVE/CL language, but with only limited
206support. Note that this package has nothing to do with the Interface 209support.
207Definition Language, part of the Common Object Request Broker
208Architecture (CORBA).
209 210
210IDLWAVE consists of two main parts: a major mode for editing IDL source 211IDLWAVE consists of two main parts: a major mode for editing IDL source
211files files (@code{idlwave-mode}) and a mode for running the IDL program 212files files (@code{idlwave-mode}) and a mode for running the IDL program
@@ -223,7 +224,7 @@ Context-sensitive display of calling sequences and keywords for more
223than 1000 native IDL routines, extendible to any number of additional 224than 1000 native IDL routines, extendible to any number of additional
224routines in your local IDL libraries. 225routines in your local IDL libraries.
225@item 226@item
226Name space conflict search, with likelihood ranking. 227Routine name space conflict search, likelihood-of-use ranking.
227@item 228@item
228Fast, context-sensitive online help. 229Fast, context-sensitive online help.
229@item 230@item
@@ -370,6 +371,9 @@ at point.
370(setq idlwave-help-directory "~/.idlwave") 371(setq idlwave-help-directory "~/.idlwave")
371@end lisp 372@end lisp
372 373
374@ifhtml
375<A NAME="TUTORIAL"></A>
376@end ifhtml
373@node Getting Started, The IDLWAVE Major Mode, IDLWAVE in a Nutshell, Top 377@node Getting Started, The IDLWAVE Major Mode, IDLWAVE in a Nutshell, Top
374@chapter Getting Started (Tutorial) 378@chapter Getting Started (Tutorial)
375@cindex Quick-Start 379@cindex Quick-Start
@@ -750,12 +754,12 @@ languages along its 25+ year history, has inherited an unusual mix of
750syntax elements. Left to his or her own devices, a novice IDL 754syntax elements. Left to his or her own devices, a novice IDL
751programmer will often conjure code which is very difficult to read and 755programmer will often conjure code which is very difficult to read and
752impossible to adapt. Much can be gleaned from studying available IDL 756impossible to adapt. Much can be gleaned from studying available IDL
753code libraries for coding style pointers, but, due to the variety of IDL 757code libraries for coding style pointers, but, due to the variety of
754syntax elements, replicating this style can be challenging at best. 758IDL syntax elements, replicating this style can be challenging at
755Luckily, IDLWAVE understands the structure IDL code very well, and takes 759best. Luckily, IDLWAVE understands the structure of IDL code very
756care of almost all formatting issues for you. After configuring it to 760well, and takes care of almost all formatting issues for you. After
757match your coding standards, you can rely on it to help keep your code 761configuring it to match your coding standards, you can rely on it to
758neat and organized. 762help keep your code neat and organized.
759 763
760@cindex Foreign code, adapting 764@cindex Foreign code, adapting
761@cindex Indentation, of foreign code 765@cindex Indentation, of foreign code
@@ -831,19 +835,20 @@ function thisfunctionnameisverylongsoitwillleavelittleroom, a, b, $
831 c, d 835 c, d
832@end example 836@end example
833 837
834You can instruct IDLWAVE when to use this special continuation 838You can instruct IDLWAVE when to avoid using this special continuation
835indentation by setting the variable 839indentation by setting the variable
836@code{idlwave-max-extra-continuation-indent}, which specifies the 840@code{idlwave-max-extra-continuation-indent}, which specifies the
837maximum additional indentation beyond the basic indent to be tolerated, 841maximum additional indentation beyond the basic indent to be
838otherwise defaulting to fixed-offset from the enclosing indent (the size 842tolerated, otherwise defaulting to a fixed-offset from the enclosing
839of which offset is set in @code{idlwave-continuation-indent}). Also, 843indent (the size of which offset is set in
840since the indentation level is somewhat dynamic in continued statements 844@code{idlwave-continuation-indent}). Also, since the indentation
841with special continuation indentation, especially if 845level can be somewhat dynamic in continued statements with special
842@code{idlwave-max-extra-continuation-indent} is small, the key @kbd{C-u 846continuation indentation, especially if
843@key{TAB}} will re-indent all lines in the current statement. Note that 847@code{idlwave-max-extra-continuation-indent} is small, the key
844@code{idlwave-indent-to-open-paren}, if non-nil, overrides the 848@kbd{C-u @key{TAB}} will re-indent all lines in the current statement.
845@code{idlwave-max-extra-continuation-indent} limit, for parentheses 849Note that @code{idlwave-indent-to-open-paren}, if non-nil, overrides
846only, forcing them always to line up. 850the @code{idlwave-max-extra-continuation-indent} limit, for
851parentheses only, forcing them always to line up.
847 852
848 853
849@defopt idlwave-continuation-indent (@code{2}) 854@defopt idlwave-continuation-indent (@code{2})
@@ -882,7 +887,7 @@ unchanged.
882@item @code{;;} 887@item @code{;;}
883@tab Lines starting with two semicolons are indented like the surrounding code. 888@tab Lines starting with two semicolons are indented like the surrounding code.
884@item @code{;} 889@item @code{;}
885@tab Lines starting with a single semicolon are indent to a minimum column. 890@tab Lines starting with a single semicolon are indented to a minimum column.
886@end multitable 891@end multitable
887 892
888@noindent 893@noindent
@@ -1045,21 +1050,23 @@ consistent with the notation for hexadecimal numbers, e.g. @code{'C5'XB}.
1045@cindex Shell, querying for routine info 1050@cindex Shell, querying for routine info
1046 1051
1047@kindex C-c C-i 1052@kindex C-c C-i
1048IDL comes bundled with more than one thousand procedures, functions and 1053IDL comes bundled with more than one thousand procedures, functions
1049object methods, and large libraries typically contain hundreds or even 1054and object methods, and large libraries typically contain hundreds or
1050thousands more. This large command set makes it difficult to remember 1055even thousands more (each with a few to tens of keywords and
1051the calling sequence and keywords for routines you use, but IDLWAVE can 1056arguments). This large command set can make it difficult to remember
1052help. It builds up routine information using a wide variety of sources: 1057the calling sequence and keywords for the routines you use, but
1053IDLWAVE in fact knows far more about the routines on your system than 1058IDLWAVE can help. It builds up routine information using a wide
1054IDL itself. It maintains a list of all built-in routines, with calling 1059variety of sources: IDLWAVE in fact knows far more about the routines
1055sequences and keywords@footnote{This list is created by scanning the IDL 1060on your system than IDL itself. It maintains a list of all built-in
1056manuals and might contain (very few) errors. Please report any errors 1061routines, with calling sequences and keywords@footnote{This list is
1057to the maintainer, so that they can be fixed.}. It also scans Emacs 1062created by scanning the IDL manuals and might contain (very few)
1058buffers and library files for routine definitions, and queries the 1063errors. Please report any errors to the maintainer, so that they can
1059IDLWAVE-Shell for information about routines currently compiled there. 1064be fixed.}. It also scans Emacs buffers and library files for routine
1060This information is updated automatically, and so should usually be 1065definitions, and queries the IDLWAVE-Shell for information about
1061current. To force a global update and refresh the routine information, 1066routines currently compiled there. This information is updated
1062use @kbd{C-c C-i} (@code{idlwave-update-routine-info}). 1067automatically, and so should usually be current. To force a global
1068update and refresh the routine information, use @kbd{C-c C-i}
1069(@code{idlwave-update-routine-info}).
1063 1070
1064@kindex C-c ? 1071@kindex C-c ?
1065To display the information about a routine, press @kbd{C-c ?}, which 1072To display the information about a routine, press @kbd{C-c ?}, which
@@ -1218,11 +1225,11 @@ Maximum number of source files displayed in the Routine Info window.
1218For IDL system routines, RSI provides extensive documentation. IDLWAVE 1225For IDL system routines, RSI provides extensive documentation. IDLWAVE
1219can access an ASCII version of this documentation very quickly and 1226can access an ASCII version of this documentation very quickly and
1220accurately. This is @emph{much} faster than using the IDL online help 1227accurately. This is @emph{much} faster than using the IDL online help
1221application, because usually IDLWAVE gets you to the right place in the 1228application, because IDLWAVE usually gets you to the right place in the
1222docs directly, without any additional browsing and scrolling. For this 1229documentation directly, without any additional browsing and scrolling.
1223online help to work, an ASCII version of the IDL documentation, which is 1230For this online help to work, an ASCII version of the IDL documentation,
1224not part of the standalone IDLWAVE distribution, is required. The 1231which is not part of the standalone IDLWAVE distribution, is required.
1225necessary help files can be downloaded from 1232The necessary help files can be downloaded from
1226@uref{@value{IDLWAVE-HOMEPAGE}, the maintainers webpage}. The text 1233@uref{@value{IDLWAVE-HOMEPAGE}, the maintainers webpage}. The text
1227extracted from the PDF files is fine for normal documentation 1234extracted from the PDF files is fine for normal documentation
1228paragraphs, but graphics and multiline equations will not be well 1235paragraphs, but graphics and multiline equations will not be well
@@ -1240,12 +1247,20 @@ delimited in @code{<NEW>..</NEW>} blocks.
1240@cindex Source code, as online help 1247@cindex Source code, as online help
1241@cindex DocLib header, as online help 1248@cindex DocLib header, as online help
1242For routines which are not documented in the IDL manual (for example 1249For routines which are not documented in the IDL manual (for example
1243your own routines), the source code is used as help text. If the 1250personal or library routines), the source code itself is used as help
1244requested information can be found in a (more or less) standard DocLib 1251text. If the requested information can be found in a (more or less)
1245file header, IDLWAVE shows the header (scrolling down to appropriate 1252standard DocLib file header, IDLWAVE shows the header (scrolling down to
1246keywords). Otherwise the routine definition statement 1253appropriate keyword). Otherwise the routine definition statement
1247(@code{pro}/@code{function}) is shown. 1254(@code{pro}/@code{function}) is shown.
1248 1255
1256@cindex Structure tags, in online help
1257@cindex Class tags, in online help
1258Help is also available for class structure tags (@code{self.TAG}), and
1259generic structure tags, if structure tag completion is enabled
1260(@pxref{Structure Tag Completion}). This is implemented by visiting the
1261tag within the class or structure definition source itself. Help is not
1262available on built-in system class tags.
1263
1249@kindex M-? 1264@kindex M-?
1250In any IDL program (or, as with most IDLWAVE commands, in the IDL 1265In any IDL program (or, as with most IDLWAVE commands, in the IDL
1251Shell), press @kbd{M-?} (@code{idlwave-context-help}), or click with 1266Shell), press @kbd{M-?} (@code{idlwave-context-help}), or click with
@@ -1268,6 +1283,10 @@ locations are recognized context for help:
1268@tab Beyond the class name in an @code{OBJ_NEW} call. 1283@tab Beyond the class name in an @code{OBJ_NEW} call.
1269@item @i{Executive Command} 1284@item @i{Executive Command}
1270@tab An executive command like @code{.RUN}. Mostly useful in the shell. 1285@tab An executive command like @code{.RUN}. Mostly useful in the shell.
1286@item @i{Structure Tags}
1287@tab In structure tags like @code{state.xsize}
1288@item @i{Structure Tags}
1289@tab In class tags like @code{self.value}.
1271@item @i{Default} 1290@item @i{Default}
1272@tab The routine that would be selected for routine info display. 1291@tab The routine that would be selected for routine info display.
1273@end multitable 1292@end multitable
@@ -1290,9 +1309,11 @@ Online help for routines and keywords can be accessed through the
1290Routine Info display. Click with @kbd{Mouse-3} on an item to see the 1309Routine Info display. Click with @kbd{Mouse-3} on an item to see the
1291corresponding help (@pxref{Routine Info}). 1310corresponding help (@pxref{Routine Info}).
1292@item 1311@item
1293When using completion and Emacs pops up a window with possible 1312When using completion and Emacs pops up a @file{*Completions*} buffer
1294completions, clicking with @kbd{Mouse-3} on a completion item invokes 1313with possible completions, clicking with @kbd{Mouse-3} on a completion
1295help on that item (@pxref{Completion}). 1314item invokes help on that item (@pxref{Completion}). Items for which
1315help is available in the online system documentation (vs. just the
1316program source itself) will be emphasized (e.g. colored blue).
1296@end itemize 1317@end itemize
1297@noindent 1318@noindent
1298In both cases, a blue face indicates that the item is documented in the 1319In both cases, a blue face indicates that the item is documented in the
@@ -1431,10 +1452,10 @@ name = 'a_ @r{File name (default inside quotes)}
1431@cindex Completion, ambiguity 1452@cindex Completion, ambiguity
1432@cindex Completion, forcing function name 1453@cindex Completion, forcing function name
1433The only place where completion is ambiguous is procedure/function 1454The only place where completion is ambiguous is procedure/function
1434@emph{keywords} versus @emph{functions}. After @samp{plot,x_}, IDLWAVE 1455@emph{keywords} versus @emph{functions}. After @samp{plot,x,_}, IDLWAVE
1435will always assume a keyword to plot. You can force completion of a 1456will always assume a keyword to @samp{plot}. However, a function is
1436function name at such a location with a prefix arg: @kbd{C-u 1457also a possible completion here. You can force completion of a function
1437M-@key{TAB}}. 1458name at such a location by using a prefix arg: @kbd{C-u M-@key{TAB}}.
1438 1459
1439@cindex Scrolling the @file{*Completions*} window 1460@cindex Scrolling the @file{*Completions*} window
1440@cindex Completion, scrolling 1461@cindex Completion, scrolling
@@ -1445,9 +1466,18 @@ If the list of completions is too long to fit in the
1445@kbd{M-@key{TAB}} repeatedly. Online help (if installed) for each 1466@kbd{M-@key{TAB}} repeatedly. Online help (if installed) for each
1446possible completion is available by clicking with @kbd{Mouse-3} on the 1467possible completion is available by clicking with @kbd{Mouse-3} on the
1447item. Items for which system online help (from the IDL manual) is 1468item. Items for which system online help (from the IDL manual) is
1448available will be displayed in a different font (e.g. colored blue). 1469available will be emphasized (e.g. colored blue). For other items, the
1449For other items, the corresponding source code or DocLib header will be 1470corresponding source code or DocLib header will be used as the help
1450used as the help text. 1471text.
1472
1473@cindex Completion, cancelling
1474@cindex Cancelling completion
1475Completion is not a blocking operation --- you are free to continue
1476editing, enter commands, or simply ignore the @file{*Completions*}
1477buffer during a completion operation. If, however, the most recent
1478command was a completion, @kbd{C-g} will remove the buffer and restore
1479the window configuration. You can also remove the buffer at any time
1480with no negative consequences.
1451 1481
1452@defopt idlwave-keyword-completion-adds-equal (@code{t}) 1482@defopt idlwave-keyword-completion-adds-equal (@code{t})
1453Non-@code{nil} means completion automatically adds @samp{=} after 1483Non-@code{nil} means completion automatically adds @samp{=} after
@@ -1473,6 +1503,7 @@ available.
1473@menu 1503@menu
1474* Case of Completed Words:: CaseOFcomPletedWords 1504* Case of Completed Words:: CaseOFcomPletedWords
1475* Object Method Completion and Class Ambiguity:: obj->Method, what? 1505* Object Method Completion and Class Ambiguity:: obj->Method, what?
1506* Object Method Completion in the Shell::
1476* Class and Keyword Inheritance:: obj->Method, _EXTRA=e 1507* Class and Keyword Inheritance:: obj->Method, _EXTRA=e
1477* Structure Tag Completion:: Completing state.Tag 1508* Structure Tag Completion:: Completing state.Tag
1478@end menu 1509@end menu
@@ -1512,7 +1543,7 @@ Non-@code{nil} means the empty string is considered lower case for
1512completion. 1543completion.
1513@end defopt 1544@end defopt
1514 1545
1515@node Object Method Completion and Class Ambiguity, Class and Keyword Inheritance, Case of Completed Words, Completion 1546@node Object Method Completion and Class Ambiguity, Object Method Completion in the Shell, Case of Completed Words, Completion
1516@subsection Object Method Completion and Class Ambiguity 1547@subsection Object Method Completion and Class Ambiguity
1517@cindex Object methods 1548@cindex Object methods
1518@cindex Class ambiguity 1549@cindex Class ambiguity
@@ -1537,14 +1568,18 @@ narrow down the number of possible completions. The variable
1537@code{idlwave-query-class} can be configured to make such prompting the 1568@code{idlwave-query-class} can be configured to make such prompting the
1538default for all methods (not recommended), or selectively for very 1569default for all methods (not recommended), or selectively for very
1539common methods for which the number of completing keywords would be too 1570common methods for which the number of completing keywords would be too
1540large (e.g. @code{Init}). After you have specified the class for a 1571large (e.g. @code{Init}).
1541particular statement (e.g. when completing the method), IDLWAVE can 1572
1542remember it for the rest of the editing session. Subsequent completions 1573@cindex Saving object class on @code{->}
1543in the same statement (e.g. keywords) can then reuse this class 1574@cindex @code{->}
1544information. This works by placing a text property on the method 1575After you have specified the class for a particular statement (e.g. when
1545invocation operator @samp{->}, after which the operator will be shown in 1576completing the method), IDLWAVE can remember it for the rest of the
1546a different face. This is not enabled by default --- the variable 1577editing session. Subsequent completions in the same statement
1547@code{idlwave-store-inquired-class} can be used to turn it on. 1578(e.g. keywords) can then reuse this class information. This works by
1579placing a text property on the method invocation operator @samp{->},
1580after which the operator will be shown in a different face. This is not
1581enabled by default --- the variable @code{idlwave-store-inquired-class}
1582can be used to turn it on.
1548 1583
1549@defopt idlwave-completion-show-classes (@code{1}) 1584@defopt idlwave-completion-show-classes (@code{1})
1550Non-@code{nil} means show classes in @file{*Completions*} buffer when 1585Non-@code{nil} means show classes in @file{*Completions*} buffer when
@@ -1569,7 +1604,22 @@ Face to highlight object operator arrows @samp{->} which carry a class
1569text property. 1604text property.
1570@end defopt 1605@end defopt
1571 1606
1572@node Class and Keyword Inheritance, Structure Tag Completion, Object Method Completion and Class Ambiguity, Completion 1607@node Object Method Completion in the Shell, Class and Keyword Inheritance, Object Method Completion and Class Ambiguity, Completion
1608@subsection Object Method Completion in the Shell
1609@cindex Method Completion in Shell
1610In the IDLWAVE Shell (@pxref{The IDLWAVE Shell}), objects on which
1611methods are being invoked have a special property: they must exist as
1612variables, and so their class can be determined (for instance, using the
1613@code{obj_class()} function). In the Shell, when attempting completion,
1614routine info, or online help within a method routine, a query is sent to
1615determine the class of the object. If this query is successful, the
1616class found will be used to select appropriate completions, routine
1617info, or help. If unsuccessful, information from all known classes will
1618be used (as in the buffer). Setting the variable
1619@code{idlwave-store-inquired-class} can eliminate unnecessary repetitive
1620queries for the object's class, and speed up completion.
1621
1622@node Class and Keyword Inheritance, Structure Tag Completion, Object Method Completion in the Shell, Completion
1573@subsection Class and Keyword Inheritance 1623@subsection Class and Keyword Inheritance
1574@cindex Inheritance, class 1624@cindex Inheritance, class
1575@cindex Keyword inheritance 1625@cindex Keyword inheritance
@@ -1595,20 +1645,22 @@ entire class inheritance chain. This is often referred to as
1595@w{@code{self->MySuperClass::SetProperty,_EXTRA=e}}. 1645@w{@code{self->MySuperClass::SetProperty,_EXTRA=e}}.
1596 1646
1597IDLWAVE can accommodate this special synergy between class and keyword 1647IDLWAVE can accommodate this special synergy between class and keyword
1598inheritance: if @code{_EXTRA} or @code{_REF_EXTRA} are detected among a 1648inheritance: if @code{_EXTRA} or @code{_REF_EXTRA} is detected among a
1599method's keyword parameters, all keywords of superclass versions of the 1649method's keyword parameters, all keywords of superclass versions of the
1600method being considered are included in completion. The completion 1650method being considered are included in completion. There is of course
1601buffer will label keywords based on their originating class. The 1651no guarantee that this type of keyword chaining actually occurrs, but
1602variable @code{idlwave-keyword-class-inheritance} can be used to 1652for some methods it's a very convenient assumption. The variable
1603configure which methods have keyword inheritance treated in this simple, 1653@code{idlwave-keyword-class-inheritance} can be used to configure which
1604class-driven way. By default, only @code{Init} and 1654methods have keyword inheritance treated in this simple, class-driven
1605@code{(Get|Set)Property} are. 1655way. By default, only @code{Init} and @code{(Get|Set)Property} are.
1656The completion buffer will label keywords based on their originating
1657class.
1606 1658
1607@defopt idlwave-support-inheritance (@code{t}) 1659@defopt idlwave-support-inheritance (@code{t})
1608Non-@code{nil} means consider inheritance during completion, online help etc. 1660Non-@code{nil} means consider inheritance during completion, online help etc.
1609@end defopt 1661@end defopt
1610 1662
1611@defopt idlwave-keyword-class-inheritance 1663@defopt idlwave-keyword-class-inheritance
1612A list of regular expressions to match methods for which simple 1664A list of regular expressions to match methods for which simple
1613class-driven keyword inheritance will be used for Completion. 1665class-driven keyword inheritance will be used for Completion.
1614@end defopt 1666@end defopt
@@ -1621,17 +1673,18 @@ class-driven keyword inheritance will be used for Completion.
1621In many programs, especially those involving widgets, large structures 1673In many programs, especially those involving widgets, large structures
1622(e.g. the @samp{state} structure) are used to communicate among 1674(e.g. the @samp{state} structure) are used to communicate among
1623routines. It is very convenient to be able to complete structure tags, 1675routines. It is very convenient to be able to complete structure tags,
1624in the same way as for instance variables of the @samp{self} object 1676in the same way as for instance variables (tags) of the @samp{self}
1625(@pxref{Object Method Completion and Class Ambiguity}). Add-in code for 1677object (@pxref{Object Method Completion and Class Ambiguity}). Add-in
1626structure tag completion is available in the form of a loadable 1678code for structure tag completion is available in the form of a loadable
1627completion module: @file{idlw-complete-structtag.el}. Tag completion in 1679completion module: @file{idlw-complete-structtag.el}. Tag completion in
1628structures is highly ambiguous (much more so than @samp{self} 1680structures is highly ambiguous (much more so than @samp{self}
1629completion), so @code{idlw-complete-structtag} makes an unusual and 1681completion), so @code{idlw-complete-structtag} makes an unusual and very
1630specific assumption: the exact same variable name is used to refer to 1682specific assumption: the exact same variable name is used to refer to
1631the structure in all parts of the program. So, if you consistently 1683the structure in all parts of the program. This is entirely unenforced
1684by the IDL language, but is a typical convention. If you consistently
1632refer to the same structure with the same variable name 1685refer to the same structure with the same variable name
1633(e.g. @samp{state}), structure tags which are read from its definition 1686(e.g. @samp{state}), structure tags which are read from its definition
1634can be used for completion. 1687in the same file can be used for completion.
1635 1688
1636Structure tag completion is not enabled by default. To enable it, 1689Structure tag completion is not enabled by default. To enable it,
1637simply add the following to your @file{.emacs}: 1690simply add the following to your @file{.emacs}:
@@ -1641,6 +1694,9 @@ simply add the following to your @file{.emacs}:
1641 (lambda () (require 'idlw-complete-structtag))) 1694 (lambda () (require 'idlw-complete-structtag)))
1642@end lisp 1695@end lisp
1643 1696
1697Once enabled, you'll also be able to access online help on the structure
1698tags, using the usual methods (@pxref{Online Help}).
1699
1644@node Routine Source, Resolving Routines, Completion, The IDLWAVE Major Mode 1700@node Routine Source, Resolving Routines, Completion, The IDLWAVE Major Mode
1645@section Routine Source 1701@section Routine Source
1646@cindex Routine source file 1702@cindex Routine source file
@@ -1648,21 +1704,21 @@ simply add the following to your @file{.emacs}:
1648@cindex Source file, of a routine 1704@cindex Source file, of a routine
1649@kindex C-c C-v 1705@kindex C-c C-v
1650In addition to clicking on a @i{Source:} line in the routine info 1706In addition to clicking on a @i{Source:} line in the routine info
1651window, there is another way to find the source file of a routine. The 1707window, there is another way to quickly visit the source file of a
1652command @kbd{C-c C-v} (@code{idlwave-find-module}) asks for a module 1708routine. The command @kbd{C-c C-v} (@code{idlwave-find-module}) asks
1653name, offering the same default as @code{idlwave-routine-info} would 1709for a module name, offering the same default as
1654have used, taken from nearby buffer contents. In the minibuffer, 1710@code{idlwave-routine-info} would have used, taken from nearby buffer
1655specify a complete routine name (including any class part). IDLWAVE 1711contents. In the minibuffer, specify a complete routine name (including
1656will display the source file in another window, positioned at the 1712any class part). IDLWAVE will display the source file in another
1657routine in question. 1713window, positioned at the routine in question.
1658 1714
1659@cindex Buffers, killing 1715@cindex Buffers, killing
1660@cindex Killing autoloaded buffers 1716@cindex Killing autoloaded buffers
1661Since getting the source of a routine into a buffer is so easy with 1717Since getting the source of a routine into a buffer is so easy with
1662IDLWAVE, too many buffers visiting different IDL source files are 1718IDLWAVE, too many buffers visiting different IDL source files are
1663sometimes created. The special command @kbd{C-c C-k} 1719sometimes created. The special command @kbd{C-c C-k}
1664(@code{idlwave-kill-autoloaded-buffers}) can be used to remove these 1720(@code{idlwave-kill-autoloaded-buffers}) can be used to easily remove
1665buffers. 1721these buffers.
1666 1722
1667@node Resolving Routines, Code Templates, Routine Source, The IDLWAVE Major Mode 1723@node Resolving Routines, Code Templates, Routine Source, The IDLWAVE Major Mode
1668@section Resolving Routines 1724@section Resolving Routines
@@ -1864,29 +1920,30 @@ convenience function @code{idlwave-define-abbrev}:
1864(add-hook 'idlwave-mode-hook 1920(add-hook 'idlwave-mode-hook
1865 (lambda () 1921 (lambda ()
1866 (idlwave-define-abbrev "wb" "widget_base()" 1922 (idlwave-define-abbrev "wb" "widget_base()"
1867 (idlwave-keyword-abbrev 1)) 1923 (idlwave-keyword-abbrev 1))
1868 (idlwave-define-abbrev "ine" "IF N_Elements() EQ 0 THEN" 1924 (idlwave-define-abbrev "ine" "IF N_Elements() EQ 0 THEN"
1869 (idlwave-keyword-abbrev 11)))) 1925 (idlwave-keyword-abbrev 11))))
1870@end lisp 1926@end lisp
1871 1927
1872Notice how the abbreviation (here @emph{wb}) and its expansion 1928Notice how the abbreviation (here @emph{wb}) and its expansion
1873(@emph{widget_base()}) are given as argument, and the single argument to 1929(@emph{widget_base()}) are given as arguments, and the single argument to
1874@code{idlwave-keyword-abbrev} (here @emph{1}) specifies how far back to 1930@code{idlwave-keyword-abbrev} (here @emph{1}) specifies how far back to
1875move the point upon expansion (in this example, to put it between the 1931move the point upon expansion (in this example, to put it between the
1876parentheses). 1932parentheses).
1877 1933
1878The abbreviations are expanded in upper or lower case, depending upon 1934The abbreviations are expanded in upper or lower case, depending upon
1879the variables @code{idlwave-abbrev-change-case} and (for reserved word 1935the variables @code{idlwave-abbrev-change-case} and, for reserved word
1880templates) @code{idlwave-reserved-word-upcase} (@pxref{Case Changes}). 1936templates, @code{idlwave-reserved-word-upcase} (@pxref{Case Changes}).
1881 1937
1882@defopt idlwave-abbrev-start-char (@code{"\"}) 1938@defopt idlwave-abbrev-start-char (@code{"\"})
1883A single character string used to start abbreviations in abbrev 1939A single character string used to start abbreviations in abbrev mode.
1884mode. 1940Beware of common characters which might naturally occur in sequence with
1941abbreviation strings.
1885@end defopt 1942@end defopt
1886 1943
1887@defopt idlwave-abbrev-move (@code{t}) 1944@defopt idlwave-abbrev-move (@code{t})
1888Non-@code{nil} means the abbrev hook can move point, e.g. to end up 1945Non-@code{nil} means the abbrev hook can move point, e.g. to end up
1889between the parenthesis of a function call. 1946between the parentheses of a function call.
1890@end defopt 1947@end defopt
1891 1948
1892@node Actions, Doc Header, Abbreviations, The IDLWAVE Major Mode 1949@node Actions, Doc Header, Abbreviations, The IDLWAVE Major Mode
@@ -1894,13 +1951,13 @@ between the parenthesis of a function call.
1894@cindex Actions 1951@cindex Actions
1895@cindex Coding standards, enforcing 1952@cindex Coding standards, enforcing
1896 1953
1897@emph{Actions} are special commands which are executed automatically 1954@emph{Actions} are special formatting commands which are executed
1898while you write code in order to check the structure of the program or 1955automatically while you write code in order to check the structure of
1899to enforce coding standards. Most actions which have been implemented 1956the program or to enforce coding standards. Most actions which have
1900in IDLWAVE are turned off by default, assuming that the average user 1957been implemented in IDLWAVE are turned off by default, assuming that the
1901wants her code the way she writes it. But if you are a lazy typist and 1958average user wants her code the way she writes it. But if you are a
1902want your code to adhere to certain standards, actions can be 1959lazy typist and want your code to adhere to certain standards, actions
1903helpful. 1960can be helpful.
1904 1961
1905Actions can be applied in three ways: 1962Actions can be applied in three ways:
1906 1963
@@ -1931,7 +1988,7 @@ Non-@code{nil} means performs actions when indenting.
1931@end defopt 1988@end defopt
1932 1989
1933@menu 1990@menu
1934* Block Boundary Check:: Is the END correct 1991* Block Boundary Check:: Is the END statement correct?
1935* Padding Operators:: Enforcing space around `=' etc 1992* Padding Operators:: Enforcing space around `=' etc
1936* Case Changes:: Enforcing upper case keywords 1993* Case Changes:: Enforcing upper case keywords
1937@end menu 1994@end menu
@@ -2183,12 +2240,13 @@ Unfortunately IDL for Windows and MacOS do not have command-prompt
2183versions and thus do not allow the interaction with 2240versions and thus do not allow the interaction with
2184Emacs@footnote{Please inform the maintainer if you come up with a way to 2241Emacs@footnote{Please inform the maintainer if you come up with a way to
2185make the IDLWAVE shell work on these systems.} --- so the IDLWAVE shell 2242make the IDLWAVE shell work on these systems.} --- so the IDLWAVE shell
2186currently only works under GNU and Unix. 2243currently only works under Unix.
2187 2244
2188@menu 2245@menu
2189* Starting the Shell:: How to launch IDL as a subprocess 2246* Starting the Shell:: How to launch IDL as a subprocess
2190* Using the Shell:: Interactively working with the Shell 2247* Using the Shell:: Interactively working with the Shell
2191* Debugging IDL Programs:: Compilation/Debugging 2248* Commands Sent to the Shell::
2249* Debugging IDL Programs::
2192* Examining Variables:: 2250* Examining Variables::
2193* Custom Expression Examination:: 2251* Custom Expression Examination::
2194@end menu 2252@end menu
@@ -2285,7 +2343,7 @@ The prefix for temporary IDL files used when compiling regions.
2285Hook for customizing @code{idlwave-shell-mode}. 2343Hook for customizing @code{idlwave-shell-mode}.
2286@end defopt 2344@end defopt
2287 2345
2288@node Using the Shell, Debugging IDL Programs, Starting the Shell, The IDLWAVE Shell 2346@node Using the Shell, Commands Sent to the Shell, Starting the Shell, The IDLWAVE Shell
2289@section Using the Shell 2347@section Using the Shell
2290@cindex Comint 2348@cindex Comint
2291@cindex Shell, basic commands 2349@cindex Shell, basic commands
@@ -2301,18 +2359,14 @@ between emacs and IDL sessions. Here is a list of commonly used
2301commands: 2359commands:
2302 2360
2303@multitable @columnfractions .12 .88 2361@multitable @columnfractions .12 .88
2304@item @key{UP} 2362@item @key{UP}, @key{M-p}
2305@tab Cycle backwards in input history 2363@tab Cycle backwards in input history
2306@item @key{DOWN} 2364@item @key{DOWN}, @key{M-n}
2307@tab Cycle forwards in input history 2365@tab Cycle forwards in input history
2308@item @kbd{M-p}
2309@tab Cycle backwards in input history @emph{matching input}
2310@item @kbd{M-n}
2311@tab Cycle forwards in input history @emph{matching input}
2312@item @kbd{M-r} 2366@item @kbd{M-r}
2313@tab Previous input matching a regexp 2367@tab Previous input matching a regexp
2314@item @kbd{M-s} 2368@item @kbd{M-s}
2315@tab Next input that matches a regexp 2369@tab Next input matching a regexp
2316@item @kbd{return} 2370@item @kbd{return}
2317@tab Send input or copy line to current prompt 2371@tab Send input or copy line to current prompt
2318@item @kbd{C-c C-a} 2372@item @kbd{C-c C-a}
@@ -2336,10 +2390,11 @@ commands:
2336@end multitable 2390@end multitable
2337 2391
2338In addition to these standard @file{comint} commands, 2392In addition to these standard @file{comint} commands,
2339@code{idlwave-shell-mode} provides many of the commands which simplify 2393@code{idlwave-shell-mode} provides many of the same commands which
2340writing IDL code, including abbreviations, online help, and completion. 2394simplify writing IDL code available in IDLWAVE buffers. This includes
2341See @ref{Routine Info} and @ref{Online Help} and @ref{Completion} for more 2395abbreviations, online help, and completion. See @ref{Routine Info} and
2342information on these commands. 2396@ref{Online Help} and @ref{Completion} for more information on these
2397commands.
2343 2398
2344@cindex Completion, in the shell 2399@cindex Completion, in the shell
2345@cindex Routine info, in the shell 2400@cindex Routine info, in the shell
@@ -2412,26 +2467,87 @@ The three regular expressions which match the magic spells for input
2412modes. 2467modes.
2413@end defopt 2468@end defopt
2414 2469
2415@node Debugging IDL Programs, Examining Variables, Using the Shell, The IDLWAVE Shell 2470@node Commands Sent to the Shell, Debugging IDL Programs, Using the Shell, The IDLWAVE Shell
2471@section Commands Sent to the Shell
2472@cindex Commands in shell, showing
2473@cindex Showing commands in shell
2474
2475The IDLWAVE buffers and shell interact very closely. In addition to the
2476normal commands you enter at the @code{IDL>} prompt, many other special
2477commands are sent to the shell, sometimes as a direct result of invoking
2478a key command, menu item, or toolbar button, but also automatically, as
2479part of the normal flow of information updates between the buffer and
2480shell.
2481
2482The commands sent include @code{breakpoint}, @code{.step} and other
2483debug commands (@pxref{Debugging IDL Programs}), @code{.run} and other
2484compilation statements (@pxref{Compiling Programs}), examination
2485commands like @code{print} and @code{help} (@pxref{Examining
2486Variables}), and other special purpose commands designed to keep
2487information on the running shell current.
2488
2489By default, much of this background shell input and output is hidden
2490from the user, but this is configurable. The custom variable
2491@code{idlwave-abbrev-show-commands} allows you to configure which
2492commands sent to the shell are shown there. For a related customization
2493for separating the output of @emph{examine} commands @xref{Examining
2494Variables}.
2495
2496@defopt idlwave-shell-show-commands (@code{'(run misc breakpoint)})
2497A list of command types to echo in the shell when sent. Possible values
2498are @code{run} for @code{.run}, @code{.compile} and other run commands,
2499@code{misc} for lesser used commands like @code{window}, @code{retall},
2500etc., @code{breakpoint} for breakpoint setting and clearing commands,
2501and @code{debug} for other debug, stepping, and continue commands. In
2502addition, if the variable is set to the single symbol @code{'everything},
2503all the copious shell input is displayed (which is probably only useful
2504for debugging purposes).
2505@end defopt
2506
2507@node Debugging IDL Programs, Examining Variables, Commands Sent to the Shell, The IDLWAVE Shell
2416@section Debugging IDL Programs 2508@section Debugging IDL Programs
2417@cindex Debugging 2509@cindex Debugging
2418@cindex Keybindings for debugging 2510@cindex Keybindings for debugging
2419@cindex Toolbar 2511@cindex Toolbar
2420 2512
2421@kindex C-c C-d
2422Programs can be compiled, run, and debugged directly from the source 2513Programs can be compiled, run, and debugged directly from the source
2423buffer in Emacs. The IDLWAVE shell installs key bindings both in the 2514buffer in Emacs. IDLWAVE makes compiling and debugging IDL programs
2424shell buffer and in all IDL code buffers of the current Emacs session. 2515far less cumbersome by providing a full-featured,
2425On Emacs versions which support this, it also installs a debugging 2516key/menu/toolbar-driven interface to commands like @code{breakpoint},
2426toolbar. The display of the toolbar can be toggled with @kbd{C-c C-d 2517@code{.step}, @code{.run}, etc.
2427C-t} (@code{idlwave-shell-toggle-toolbar}). 2518
2519The IDLWAVE shell installs key bindings both in the shell buffer and in
2520all IDL code buffers of the current Emacs session, so debug commands
2521work in both places (in the shell, commands operate on the last file
2522compiled). On Emacs versions which support this, a debugging toolbar is
2523also installed. The display of the toolbar can be toggled with @kbd{C-c
2524C-d C-t} (@code{idlwave-shell-toggle-toolbar}).
2525
2526@defopt idlwave-shell-use-toolbar (@code{t})
2527Non-@code{nil} means use the debugging toolbar in all IDL related
2528buffers.
2529@end defopt
2530
2531@menu
2532* Debug Key Bindings::
2533* Compiling Programs::
2534* Breakpoints and Stepping::
2535* Walking the Calling Stack::
2536@end menu
2537
2538@node Debug Key Bindings, Compiling Programs, Debugging IDL Programs, Debugging IDL Programs
2539@subsection Debug Key Bindings
2540@kindex C-c C-d
2541@cindex Key bindings
2428 2542
2429The debugging key bindings are by default on the prefix key @kbd{C-c 2543The debugging key bindings are by default on the prefix key @kbd{C-c
2430C-d}, so for example setting a breakpoint is done with @kbd{C-c C-d 2544C-d}, so for example setting a breakpoint is done with @kbd{C-c C-d
2431C-b}, compiling a source file with @kbd{C-c C-d C-c}. If you find this 2545C-b}, and compiling a source file with @kbd{C-c C-d C-c}. If you find
2432too much work, you can add bindings for one or more modifier keys which 2546this too much work, you can easily configure IDLWAVE to use one or more
2433is not used by other commands. For example, if you write in 2547modifier keys not in use by other commands, in lieu of the prefix
2434@file{.emacs}: 2548@kbd{C-c C-d} (though these bindings will typically also be available
2549--- see @code{idlwave-shell-activate-prefix-keybindings}). For example,
2550if you write in @file{.emacs}:
2435 2551
2436@lisp 2552@lisp
2437(setq idlwave-shell-debug-modifiers '(control shift)) 2553(setq idlwave-shell-debug-modifiers '(control shift))
@@ -2458,22 +2574,12 @@ key, like @kbd{C-c C-d C-b}.
2458 2574
2459@defopt idlwave-shell-debug-modifiers (@code{nil}) 2575@defopt idlwave-shell-debug-modifiers (@code{nil})
2460List of modifier keys to use for additional binding of debugging 2576List of modifier keys to use for additional binding of debugging
2461commands in the shell and source buffers. 2577commands in the shell and source buffers. Can be one or more of
2462@end defopt 2578@code{control}, @code{meta}, @code{super}, @code{hyper}, @code{alt}, and
2463 2579@code{shift}.
2464@defopt idlwave-shell-use-toolbar (@code{t})
2465Non-@code{nil} means use the debugging toolbar in all IDL related
2466buffers.
2467@end defopt 2580@end defopt
2468 2581
2469 2582@node Compiling Programs, Breakpoints and Stepping, Debug Key Bindings, Debugging IDL Programs
2470@menu
2471* Compiling Programs:: Compiling buffers under the shell
2472* Breakpoints and Stepping:: Deciding where to stop and look
2473* Walking the Calling Stack:: From where was this routine called?
2474@end menu
2475
2476@node Compiling Programs, Breakpoints and Stepping, Debugging IDL Programs, Debugging IDL Programs
2477@subsection Compiling Programs 2583@subsection Compiling Programs
2478@cindex Compiling programs 2584@cindex Compiling programs
2479@cindex Programs, compiling 2585@cindex Programs, compiling
@@ -2524,22 +2630,30 @@ configured in @code{idlwave-shell-mark-stop-line}.
2524You can set breakpoints and step through a program with IDLWAVE. 2630You can set breakpoints and step through a program with IDLWAVE.
2525Setting a breakpoint in the current line of the source buffer is done 2631Setting a breakpoint in the current line of the source buffer is done
2526with @kbd{C-c C-d C-b} (@code{idlwave-shell-break-here}). With a prefix 2632with @kbd{C-c C-d C-b} (@code{idlwave-shell-break-here}). With a prefix
2527arg of 1 (i.e. @kbd{C-1 C-c C-d C-b}, the breakpoint gets a @code{/ONCE} 2633arg of 1 (i.e. @kbd{C-1 C-c C-d C-b}), the breakpoint gets a
2528keyword, meaning that it will be deleted after first use. With a 2634@code{/ONCE} keyword, meaning that it will be deleted after first use.
2529numeric prefix greater than one, the breakpoint will only be active the 2635With a numeric prefix greater than one (e.g. @kbd{C-4 C-c C-d C-b}), the
2530@code{nth} time it is hit. To clear the breakpoint in the current line, 2636breakpoint will only be active the @code{nth} time it is hit. With a
2637single non-numeric prefix (i.e. @kbd{C-u C-c C-d C-b}), prompt for a
2638condition --- an IDL expression to be evaulated and trigger the
2639breakpoint only if true. To clear the breakpoint in the current line,
2531use @kbd{C-c C-d C-d} (@code{idlwave-clear-current-bp}). When executed 2640use @kbd{C-c C-d C-d} (@code{idlwave-clear-current-bp}). When executed
2532from the shell window, the breakpoint where IDL is currently stopped 2641from the shell window, the breakpoint where IDL is currently stopped
2533will be deleted. To clear all breakpoints, use @kbd{C-c C-d C-a} 2642will be deleted. To clear all breakpoints, use @kbd{C-c C-d C-a}
2534(@code{idlwave-clear-all-bp}). Breakpoint lines are highlighted in the 2643(@code{idlwave-clear-all-bp}). Breakpoint lines are highlighted in the
2535source code. 2644source code. Note that IDL places breakpoints as close as possible on
2645or after the line you specify. IDLWAVE queries the shell for the actual
2646breakpoint location which was set, so the exact line you specify may not
2647be marked.
2536 2648
2537Once the program has stopped somewhere, you can step through it. The 2649Once the program has stopped somewhere, you can step through it. The
2538most important stepping commands are @kbd{C-c C-d C-s} to execute one 2650most important stepping commands are @kbd{C-c C-d C-s} to execute one
2539line of IDL code ("step into"); @kbd{C-c C-d C-n} to step a single line, 2651line of IDL code ("step into"); @kbd{C-c C-d C-n} to step a single line,
2540treating procedure and function calls as a single step ("step over"); 2652treating procedure and function calls as a single step ("step over");
2541@kbd{C-c C-d C-h} to continue execution to the line at the cursor and 2653@kbd{C-c C-d C-h} to continue execution to the line at the cursor and
2542@kbd{C-c C-d C-r} to continue execution. Here is a summary of the 2654@kbd{C-c C-d C-r} to continue execution. @xref{Commands Sent to the
2655Shell}, for information on displaying or hiding the breakpoint and
2656stepping commands the shell receives. Here is a summary of the
2543breakpoint and stepping commands: 2657breakpoint and stepping commands:
2544 2658
2545@multitable @columnfractions .23 .77 2659@multitable @columnfractions .23 .77
@@ -2603,6 +2717,9 @@ automatically return to the current level. @xref{Examining Variables},
2603for information how to examine the value of variables and expressions on 2717for information how to examine the value of variables and expressions on
2604higher calling stack levels. 2718higher calling stack levels.
2605 2719
2720@ifhtml
2721<A NAME="EXAMINE"></A>
2722@end ifhtml
2606@node Examining Variables, Custom Expression Examination, Debugging IDL Programs, The IDLWAVE Shell 2723@node Examining Variables, Custom Expression Examination, Debugging IDL Programs, The IDLWAVE Shell
2607@section Examining Variables 2724@section Examining Variables
2608@cindex @code{PRINT} expressions 2725@cindex @code{PRINT} expressions
@@ -2904,6 +3021,8 @@ Laurent Mugnier <mugnier@@onera.fr>
2904@item 3021@item
2905Lubos Pochman <lubos@@rsinc.com> 3022Lubos Pochman <lubos@@rsinc.com>
2906@item 3023@item
3024Bob Portmann <portmann@@al.noaa.gov>
3025@item
2907Patrick M. Ryan <pat@@jaameri.gsfc.nasa.gov> 3026Patrick M. Ryan <pat@@jaameri.gsfc.nasa.gov>
2908@item 3027@item
2909Marty Ryba <ryba@@ll.mit.edu> 3028Marty Ryba <ryba@@ll.mit.edu>
@@ -2950,14 +3069,14 @@ several places:
2950@emph{Builtin routines} are defined inside IDL itself. The source 3069@emph{Builtin routines} are defined inside IDL itself. The source
2951code of such routines is not available. 3070code of such routines is not available.
2952@item 3071@item
2953Routines which are @emph{part of the current program}, defined in a 3072Routines which are @emph{part of the current program}, are defined in a
2954file which is explicitly compiled by the user. This file may or may not 3073file explicitly compiled by the user. This file may or may not be
2955be located on the IDL search path. 3074located on the IDL search path.
2956@item 3075@item
2957@emph{Library routines} are defined in files located on IDL's search 3076@emph{Library routines} are defined in files located on IDL's search
2958path, and will need not be manually compiled. When a library routine is 3077path, and will not need to be manually compiled. When a library routine
2959called for the first time, IDL will find the source file and compile it 3078is called for the first time, IDL will find the source file and compile
2960dynamically. A special sub-category of library routines are the 3079it dynamically. A special sub-category of library routines are the
2961@emph{system routines} distributed with IDL, and usually available in 3080@emph{system routines} distributed with IDL, and usually available in
2962the @file{lib} subdirectory of the IDL distribution. 3081the @file{lib} subdirectory of the IDL distribution.
2963@item 3082@item
@@ -3089,7 +3208,7 @@ from the same directories, call the command
3089selected directories, write an updated version of the libinfo file and 3208selected directories, write an updated version of the libinfo file and
3090rebuild IDLWAVE's internal lists. If you give three prefix arguments 3209rebuild IDLWAVE's internal lists. If you give three prefix arguments
3091@w{@kbd{C-u C-u C-u C-c C-i}}, updating will be done with a background 3210@w{@kbd{C-u C-u C-u C-c C-i}}, updating will be done with a background
3092job@footnote{GNU and Unix systems only, I think.}. You can continue to work, 3211job@footnote{Unix systems only, I think.}. You can continue to work,
3093and the library catalog will be re-read when it is ready. 3212and the library catalog will be re-read when it is ready.
3094 3213
3095A note of caution: Depending on your local installation, the IDL 3214A note of caution: Depending on your local installation, the IDL
@@ -3103,11 +3222,11 @@ File for routine information of the IDL library.
3103@end defopt 3222@end defopt
3104 3223
3105@defopt idlwave-library-path 3224@defopt idlwave-library-path
3106IDL library path for Windows and MacOS. Not needed under GNU and Unix. 3225IDL library path for Windows and MacOS. Not needed under Unix.
3107@end defopt 3226@end defopt
3108 3227
3109@defopt idlwave-system-directory 3228@defopt idlwave-system-directory
3110The IDL system directory for Windows and MacOS. Not needed under GNU and Unix. 3229The IDL system directory for Windows and MacOS. Not needed under Unix.
3111@end defopt 3230@end defopt
3112 3231
3113@defopt idlwave-special-lib-alist 3232@defopt idlwave-special-lib-alist
@@ -3351,6 +3470,9 @@ user is King!
3351 "help,___,/STRUCTURE")))) 3470 "help,___,/STRUCTURE"))))
3352@end example 3471@end example
3353 3472
3473@ifhtml
3474<A NAME="WIN_MAC"></A>
3475@end ifhtml
3354@node Windows and MacOS, Index, Configuration Examples, Top 3476@node Windows and MacOS, Index, Configuration Examples, Top
3355@appendix Windows and MacOS 3477@appendix Windows and MacOS
3356@cindex Windows 3478@cindex Windows
@@ -3361,17 +3483,17 @@ of Emacs, much of IDLWAVE does also work under different operating
3361systems like Windows (with NTEmacs or NTXEmacs) or MacOS. 3483systems like Windows (with NTEmacs or NTXEmacs) or MacOS.
3362 3484
3363The only problem really is that RSI does not provide a command-line 3485The only problem really is that RSI does not provide a command-line
3364version of IDL for Windows or MacOS which IDLWAVE can interact 3486version of IDL for Windows or MacOS with which IDLWAVE can
3365with@footnote{Call your RSI representative and complain --- it should be 3487interact@footnote{Call your RSI representative and complain --- it
3366trivial for them to provide one. And if enough people ask for it, maybe 3488should be trivial for them to provide one. And if enough people ask
3367they will. The upcoming IDL for Mac OSX is slated to have a 3489for it, maybe they will. The upcoming IDL for Mac OSX is slated to
3368command-line version.}. Therefore the IDLWAVE Shell does not work and 3490have a command-line version.}. Therefore the IDLWAVE Shell does not
3369you have to rely on IDLDE to run and debug your programs. However, 3491work and you have to rely on IDLDE to run and debug your programs.
3370editing IDL source files with Emacs/IDLWAVE works with all bells and 3492However, editing IDL source files with Emacs/IDLWAVE works with all
3371whistles, including routine info, completion and fast online help. Only 3493bells and whistles, including routine info, completion and fast online
3372a small amount of additional information must be specified in your 3494help. Only a small amount of additional information must be specified
3373.emacs file: you must specify path names which on a GNU or UNIX system 3495in your .emacs file: the path names which, on a UNIX system, are
3374are automatically gathered by talking to the IDL program. 3496automatically gathered by talking to the IDL program.
3375 3497
3376Here is an example of the additional configuration needed for a Windows 3498Here is an example of the additional configuration needed for a Windows
3377system. I am assuming that IDLWAVE has been installed in 3499system. I am assuming that IDLWAVE has been installed in