Mercurial > emacs
comparison lisp/progmodes/idlw-shell.el @ 83307:21eea50897a7
Merged from miles@gnu.org--gnu-2005 (patch 69, 313-319)
Patches applied:
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-313
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-314
Merge from gnus--rel--5.10
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-315
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-316
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-317
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-318
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-319
Update from CVS
* miles@gnu.org--gnu-2005/gnus--rel--5.10--patch-69
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-347
author | Karoly Lorentey <lorentey@elte.hu> |
---|---|
date | Fri, 20 May 2005 17:44:36 +0000 |
parents | 2006100ee57e a7e02ef1e3d6 |
children | 63b7247f4be6 |
comparison
equal
deleted
inserted
replaced
83306:8b66fddd72c5 | 83307:21eea50897a7 |
---|---|
43 ;; available from: | 43 ;; available from: |
44 ;; http://idlwave.org | 44 ;; http://idlwave.org |
45 ;; | 45 ;; |
46 ;; INSTALLATION: | 46 ;; INSTALLATION: |
47 ;; ============= | 47 ;; ============= |
48 ;; | 48 ;; |
49 ;; Follow the instructions in the INSTALL file of the distribution. | 49 ;; Follow the instructions in the INSTALL file of the distribution. |
50 ;; In short, put this file on your load path and add the following | 50 ;; In short, put this file on your load path and add the following |
51 ;; lines to your .emacs file: | 51 ;; lines to your .emacs file: |
52 ;; | 52 ;; |
53 ;; (autoload 'idlwave-shell "idlw-shell" "IDLWAVE Shell" t) | 53 ;; (autoload 'idlwave-shell "idlw-shell" "IDLWAVE Shell" t) |
56 ;; SOURCE | 56 ;; SOURCE |
57 ;; ====== | 57 ;; ====== |
58 ;; | 58 ;; |
59 ;; The newest version of this file can be found on the maintainers | 59 ;; The newest version of this file can be found on the maintainers |
60 ;; web site. | 60 ;; web site. |
61 ;; | 61 ;; |
62 ;; http://idlwave.org | 62 ;; http://idlwave.org |
63 ;; | 63 ;; |
64 ;; DOCUMENTATION | 64 ;; DOCUMENTATION |
65 ;; ============= | 65 ;; ============= |
66 ;; | 66 ;; |
67 ;; IDLWAVE is documented online in info format. | 67 ;; IDLWAVE is documented online in info format. |
68 ;; A printable version of the documentation is available from the | 68 ;; A printable version of the documentation is available from the |
75 ;; 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 |
76 ;; keybindings in the prefix map. There bindings are available anyway - so | 76 ;; keybindings in the prefix map. There bindings are available anyway - so |
77 ;; it is a bug in XEmacs. | 77 ;; it is a bug in XEmacs. |
78 ;; The Debug menu in source buffers *does* display the bindings correctly. | 78 ;; The Debug menu in source buffers *does* display the bindings correctly. |
79 ;; | 79 ;; |
80 ;; | 80 ;; |
81 ;; CUSTOMIZATION VARIABLES | 81 ;; CUSTOMIZATION VARIABLES |
82 ;; ======================= | 82 ;; ======================= |
83 ;; | 83 ;; |
84 ;; IDLWAVE has customize support - so if you want to learn about | 84 ;; IDLWAVE has customize support - so if you want to learn about |
85 ;; the variables which control the behavior of the mode, use | 85 ;; the variables which control the behavior of the mode, use |
99 (eval-and-compile | 99 (eval-and-compile |
100 ;; Kludge to allow `defcustom' for Emacs 19. | 100 ;; Kludge to allow `defcustom' for Emacs 19. |
101 (condition-case () (require 'custom) (error nil)) | 101 (condition-case () (require 'custom) (error nil)) |
102 (if (and (featurep 'custom) | 102 (if (and (featurep 'custom) |
103 (fboundp 'custom-declare-variable) | 103 (fboundp 'custom-declare-variable) |
104 (fboundp 'defface)) | 104 (fboundp 'defface)) |
105 ;; We've got what we needed | 105 ;; We've got what we needed |
106 (setq idlwave-shell-have-new-custom t) | 106 (setq idlwave-shell-have-new-custom t) |
107 ;; We have the old or no custom-library, hack around it! | 107 ;; We have the old or no custom-library, hack around it! |
108 (defmacro defgroup (&rest args) nil) | 108 (defmacro defgroup (&rest args) nil) |
109 (defmacro defcustom (var value doc &rest args) | 109 (defmacro defcustom (var value doc &rest args) |
110 `(defvar ,var ,value ,doc)))) | 110 `(defvar ,var ,value ,doc)))) |
111 | 111 |
112 ;;; Customizations: idlwave-shell group | 112 ;;; Customizations: idlwave-shell group |
113 | 113 |
114 ;; General/Misc. customizations | 114 ;; General/Misc. customizations |
116 "General setup of the Shell interaction for IDLWAVE/Shell." | 116 "General setup of the Shell interaction for IDLWAVE/Shell." |
117 :prefix "idlwave-shell" | 117 :prefix "idlwave-shell" |
118 :group 'idlwave) | 118 :group 'idlwave) |
119 | 119 |
120 (defcustom idlwave-shell-prompt-pattern "^ ?IDL> " | 120 (defcustom idlwave-shell-prompt-pattern "^ ?IDL> " |
121 "*Regexp to match IDL prompt at beginning of a line. | 121 "*Regexp to match IDL prompt at beginning of a line. |
122 For example, \"^IDL> \" or \"^WAVE> \". | 122 For example, \"^IDL> \" or \"^WAVE> \". |
123 The \"^\" means beginning of line, and is required. | 123 The \"^\" means beginning of line, and is required. |
124 This variable is used to initialize `comint-prompt-regexp' in the | 124 This variable is used to initialize `comint-prompt-regexp' in the |
125 process buffer. | 125 process buffer. |
126 | 126 |
127 This is a fine thing to set in your `.emacs' file." | 127 This is a fine thing to set in your `.emacs' file." |
128 :group 'idlwave-shell-general-setup | 128 :group 'idlwave-shell-general-setup |
129 :type 'regexp) | 129 :type 'regexp) |
208 So by default setting a breakpoint will be on C-c C-d C-b." | 208 So by default setting a breakpoint will be on C-c C-d C-b." |
209 :group 'idlwave-shell-general-setup | 209 :group 'idlwave-shell-general-setup |
210 :type 'boolean) | 210 :type 'boolean) |
211 | 211 |
212 (defcustom idlwave-shell-automatic-electric-debug 'breakpoint | 212 (defcustom idlwave-shell-automatic-electric-debug 'breakpoint |
213 "Enter the electric-debug minor mode automatically. | 213 "Enter the electric-debug minor mode automatically. |
214 This occurs at a breakpoint or any other halt. The mode is exited | 214 This occurs at a breakpoint or any other halt. The mode is exited |
215 upon return to the main level. Can be set to 'breakpoint to enter | 215 upon return to the main level. Can be set to 'breakpoint to enter |
216 electric debug mode only when breakpoints are tripped." | 216 electric debug mode only when breakpoints are tripped." |
217 :group 'idlwave-shell-general-setup | 217 :group 'idlwave-shell-general-setup |
218 :type '(choice | 218 :type '(choice |
293 `comint-input-ring-size'. | 293 `comint-input-ring-size'. |
294 The history is only saved if the variable `idlwave-shell-save-command-history' | 294 The history is only saved if the variable `idlwave-shell-save-command-history' |
295 is non-nil." | 295 is non-nil." |
296 :group 'idlwave-shell-command-setup | 296 :group 'idlwave-shell-command-setup |
297 :type 'file) | 297 :type 'file) |
298 | 298 |
299 (defcustom idlwave-shell-show-commands | 299 (defcustom idlwave-shell-show-commands |
300 '(run misc breakpoint) | 300 '(run misc breakpoint) |
301 "*A list of command types to show output from in the shell. | 301 "*A list of command types to show output from in the shell. |
302 Possibilities are 'run, 'debug, 'breakpoint, and 'misc. Unselected | 302 Possibilities are 'run, 'debug, 'breakpoint, and 'misc. Unselected |
303 types are not displayed in the shell. The type 'everything causes all | 303 types are not displayed in the shell. The type 'everything causes all |
304 the copious shell traffic to be displayed." | 304 the copious shell traffic to be displayed." |
305 :group 'idlwave-shell-command-setup | 305 :group 'idlwave-shell-command-setup |
306 :type '(choice | 306 :type '(choice |
307 (const everything) | 307 (const everything) |
308 (set :tag "Checklist" :greedy t | 308 (set :tag "Checklist" :greedy t |
309 (const :tag "All .run and .compile commands" run) | 309 (const :tag "All .run and .compile commands" run) |
310 (const :tag "All breakpoint commands" breakpoint) | 310 (const :tag "All breakpoint commands" breakpoint) |
311 (const :tag "All debug and stepping commands" debug) | 311 (const :tag "All debug and stepping commands" debug) |
312 (const :tag "Close, window, retall, etc. commands" misc)))) | 312 (const :tag "Close, window, retall, etc. commands" misc)))) |
313 | 313 |
314 (defcustom idlwave-shell-examine-alist | 314 (defcustom idlwave-shell-examine-alist |
315 '(("Print" . "print,___") | 315 '(("Print" . "print,___") |
316 ("Help" . "help,___") | 316 ("Help" . "help,___") |
317 ("Structure Help" . "help,___,/STRUCTURE") | 317 ("Structure Help" . "help,___,/STRUCTURE") |
318 ("Dimensions" . "print,size(___,/DIMENSIONS)") | 318 ("Dimensions" . "print,size(___,/DIMENSIONS)") |
319 ("Type" . "print,size(___,/TNAME)") | 319 ("Type" . "print,size(___,/TNAME)") |
320 ("N_Elements" . "print,n_elements(___)") | 320 ("N_Elements" . "print,n_elements(___)") |
321 ("All Size Info" . "help,(__IWsz__=size(___,/STRUCTURE)),/STRUCTURE & print,__IWsz__.DIMENSIONS") | 321 ("All Size Info" . "help,(__IWsz__=size(___,/STRUCTURE)),/STRUCTURE & print,__IWsz__.DIMENSIONS") |
322 ("Ptr Valid" . "print,ptr_valid(___)") | 322 ("Ptr Valid" . "print,ptr_valid(___)") |
323 ("Widget Valid" . "print,widget_info(___,/VALID)") | 323 ("Widget Valid" . "print,widget_info(___,/VALID)") |
324 ("Widget Geometry" . "help,widget_info(___,/GEOMETRY)")) | 324 ("Widget Geometry" . "help,widget_info(___,/GEOMETRY)")) |
325 "Alist of special examine commands for popup selection. | 325 "Alist of special examine commands for popup selection. |
326 The keys are used in the selection popup created by | 326 The keys are used in the selection popup created by |
327 `idlwave-shell-examine-select', and the corresponding value is sent as | 327 `idlwave-shell-examine-select', and the corresponding value is sent as |
328 a command to the shell, with special sequence `___' replaced by the | 328 a command to the shell, with special sequence `___' replaced by the |
329 expression being examined." | 329 expression being examined." |
330 :group 'idlwave-shell-command-setup | 330 :group 'idlwave-shell-command-setup |
331 :type '(repeat | 331 :type '(repeat |
332 (cons | 332 (cons |
333 (string :tag "Label ") | 333 (string :tag "Label ") |
334 (string :tag "Command")))) | 334 (string :tag "Command")))) |
335 | 335 |
336 (defvar idlwave-shell-print-expression-function nil | 336 (defvar idlwave-shell-print-expression-function nil |
337 "*OBSOLETE VARIABLE, is no longer used.") | 337 "*OBSOLETE VARIABLE, is no longer used.") |
338 | 338 |
339 (defcustom idlwave-shell-separate-examine-output t | 339 (defcustom idlwave-shell-separate-examine-output t |
340 "*Non-nil mean, put output of examine commands in their own buffer." | 340 "*Non-nil mean, put output of examine commands in their own buffer." |
341 :group 'idlwave-shell-command-setup | 341 :group 'idlwave-shell-command-setup |
342 :type 'boolean) | 342 :type 'boolean) |
343 | 343 |
344 (defcustom idlwave-shell-comint-settings | 344 (defcustom idlwave-shell-comint-settings |
345 '((comint-scroll-to-bottom-on-input . t) | 345 '((comint-scroll-to-bottom-on-input . t) |
346 (comint-scroll-to-bottom-on-output . t) | 346 (comint-scroll-to-bottom-on-output . t) |
347 (comint-scroll-show-maximum-output . nil)) | 347 (comint-scroll-show-maximum-output . nil)) |
348 | 348 |
401 print,'Quit the program, y or n?' | 401 print,'Quit the program, y or n?' |
402 print,'<onechar>' ; Ask IDLWAVE to send one character | 402 print,'<onechar>' ; Ask IDLWAVE to send one character |
403 answer = GET_KBRD(1) | 403 answer = GET_KBRD(1) |
404 | 404 |
405 Since the IDLWAVE shell defines the system variable `!IDLWAVE_VERSION', | 405 Since the IDLWAVE shell defines the system variable `!IDLWAVE_VERSION', |
406 you could actually check if you are running under Emacs before printing | 406 you could actually check if you are running under Emacs before printing |
407 the magic strings. Here is a procedure which uses this. | 407 the magic strings. Here is a procedure which uses this. |
408 | 408 |
409 Usage: | 409 Usage: |
410 ====== | 410 ====== |
411 idlwave_char_input ; Make IDLWAVE send one character | 411 idlwave_char_input ; Make IDLWAVE send one character |
418 defsysv,'!idlwave_version',exists=running_emacs | 418 defsysv,'!idlwave_version',exists=running_emacs |
419 if running_emacs then begin | 419 if running_emacs then begin |
420 if keyword_set(on) then print,'<chars>' $ | 420 if keyword_set(on) then print,'<chars>' $ |
421 else if keyword_set(off) then print,'</chars>' $ | 421 else if keyword_set(off) then print,'</chars>' $ |
422 else print,'<onechar>' | 422 else print,'<onechar>' |
423 endif | 423 endif |
424 end" | 424 end" |
425 :group 'idlwave-shell-command-setup | 425 :group 'idlwave-shell-command-setup |
426 :type '(list | 426 :type '(list |
427 (regexp :tag "One-char regexp") | 427 (regexp :tag "One-char regexp") |
428 (regexp :tag "Char-mode regexp") | 428 (regexp :tag "Char-mode regexp") |
476 (defcustom idlwave-shell-electric-stop-color "Violet" | 476 (defcustom idlwave-shell-electric-stop-color "Violet" |
477 "*The color for the default face or overlay arrow when stopped." | 477 "*The color for the default face or overlay arrow when stopped." |
478 :group 'idlwave-shell-highlighting-and-faces | 478 :group 'idlwave-shell-highlighting-and-faces |
479 :type 'string) | 479 :type 'string) |
480 | 480 |
481 (defcustom idlwave-shell-electric-stop-line-face | 481 (defcustom idlwave-shell-electric-stop-line-face |
482 (prog1 | 482 (prog1 |
483 (copy-face 'modeline 'idlwave-shell-electric-stop-line-face) | 483 (copy-face 'modeline 'idlwave-shell-electric-stop-line-face) |
484 (set-face-background 'idlwave-shell-electric-stop-line-face | 484 (set-face-background 'idlwave-shell-electric-stop-line-face |
485 idlwave-shell-electric-stop-color) | 485 idlwave-shell-electric-stop-color) |
486 (condition-case nil | 486 (condition-case nil |
487 (set-face-foreground 'idlwave-shell-electric-stop-line-face nil) | 487 (set-face-foreground 'idlwave-shell-electric-stop-line-face nil) |
488 (error nil))) | 488 (error nil))) |
489 "*The face for `idlwave-shell-stop-line-overlay' when in electric debug mode. | 489 "*The face for `idlwave-shell-stop-line-overlay' when in electric debug mode. |
525 "Face for highlighting lines with breakpoints." | 525 "Face for highlighting lines with breakpoints." |
526 :group 'idlwave-shell-highlighting-and-faces) | 526 :group 'idlwave-shell-highlighting-and-faces) |
527 ;; Just copy the underline face to be on the safe side. | 527 ;; Just copy the underline face to be on the safe side. |
528 (copy-face 'underline 'idlwave-shell-bp-face)) | 528 (copy-face 'underline 'idlwave-shell-bp-face)) |
529 | 529 |
530 (defcustom idlwave-shell-disabled-breakpoint-face | 530 (defcustom idlwave-shell-disabled-breakpoint-face |
531 'idlwave-shell-disabled-bp-face | 531 'idlwave-shell-disabled-bp-face |
532 "*The face for disabled breakpoint lines in the source code. | 532 "*The face for disabled breakpoint lines in the source code. |
533 Allows you to choose the font, color and other properties for | 533 Allows you to choose the font, color and other properties for |
534 lines which have a breakpoint. See also `idlwave-shell-mark-breakpoints'." | 534 lines which have a breakpoint. See also `idlwave-shell-mark-breakpoints'." |
535 :group 'idlwave-shell-highlighting-and-faces | 535 :group 'idlwave-shell-highlighting-and-faces |
578 (defun idlwave-shell-temp-file (type) | 578 (defun idlwave-shell-temp-file (type) |
579 "Return a temp file, creating it if necessary. | 579 "Return a temp file, creating it if necessary. |
580 | 580 |
581 TYPE is either 'pro' or 'rinfo', and `idlwave-shell-temp-pro-file' or | 581 TYPE is either 'pro' or 'rinfo', and `idlwave-shell-temp-pro-file' or |
582 `idlwave-shell-temp-rinfo-save-file' is set (respectively)." | 582 `idlwave-shell-temp-rinfo-save-file' is set (respectively)." |
583 (cond | 583 (cond |
584 ((eq type 'rinfo) | 584 ((eq type 'rinfo) |
585 (or idlwave-shell-temp-rinfo-save-file | 585 (or idlwave-shell-temp-rinfo-save-file |
586 (setq idlwave-shell-temp-rinfo-save-file | 586 (setq idlwave-shell-temp-rinfo-save-file |
587 (idlwave-shell-make-temp-file idlwave-shell-temp-pro-prefix)))) | 587 (idlwave-shell-make-temp-file idlwave-shell-temp-pro-prefix)))) |
588 ((eq type 'pro) | 588 ((eq type 'pro) |
589 (or idlwave-shell-temp-pro-file | 589 (or idlwave-shell-temp-pro-file |
590 (setq idlwave-shell-temp-pro-file | 590 (setq idlwave-shell-temp-pro-file |
591 (idlwave-shell-make-temp-file idlwave-shell-temp-pro-prefix)))) | 591 (idlwave-shell-make-temp-file idlwave-shell-temp-pro-prefix)))) |
592 (t (error "Wrong argument (idlwave-shell-temp-file): %s" | 592 (t (error "Wrong argument (idlwave-shell-temp-file): %s" |
593 (symbol-name type))))) | 593 (symbol-name type))))) |
594 | 594 |
595 | 595 |
596 (defun idlwave-shell-make-temp-file (prefix) | 596 (defun idlwave-shell-make-temp-file (prefix) |
597 "Create a temporary file." | 597 "Create a temporary file." |
598 ; Hard coded make-temp-file for Emacs<21 | 598 ; Hard coded make-temp-file for Emacs<21 |
599 (if (fboundp 'make-temp-file) | 599 (if (fboundp 'make-temp-file) |
617 nil) | 617 nil) |
618 file))) | 618 file))) |
619 | 619 |
620 | 620 |
621 (defvar idlwave-shell-dirstack-query "cd,current=___cur & print,___cur" | 621 (defvar idlwave-shell-dirstack-query "cd,current=___cur & print,___cur" |
622 "Command used by `idlwave-shell-resync-dirs' to query IDL for | 622 "Command used by `idlwave-shell-resync-dirs' to query IDL for |
623 the directory stack.") | 623 the directory stack.") |
624 | 624 |
625 (defvar idlwave-shell-path-query "print,'PATH:<'+transpose(expand_path(!PATH,/ARRAY))+'>' & print,'SYSDIR:<'+!dir+'>'" | 625 (defvar idlwave-shell-path-query "print,'PATH:<'+transpose(expand_path(!PATH,/ARRAY))+'>' & print,'SYSDIR:<'+!dir+'>'" |
626 | 626 |
627 "The command which gets !PATH and !DIR info from the shell.") | 627 "The command which gets !PATH and !DIR info from the shell.") |
628 | 628 |
629 (defvar idlwave-shell-mode-line-info nil | 629 (defvar idlwave-shell-mode-line-info nil |
630 "Additional info displayed in the mode line") | 630 "Additional info displayed in the mode line") |
631 | 631 |
632 (defvar idlwave-shell-default-directory nil | 632 (defvar idlwave-shell-default-directory nil |
633 "The default directory in the idlwave-shell buffer, of outside use.") | 633 "The default directory in the idlwave-shell buffer, of outside use.") |
634 | 634 |
635 (defvar idlwave-shell-last-save-and-action-file nil | 635 (defvar idlwave-shell-last-save-and-action-file nil |
676 (when (or (featurep 'xemacs) ; XEmacs can do also ttys | 676 (when (or (featurep 'xemacs) ; XEmacs can do also ttys |
677 (fboundp 'tty-defined-colors) ; Emacs 21 as well | 677 (fboundp 'tty-defined-colors) ; Emacs 21 as well |
678 window-system) ; Window systems always | 678 window-system) ; Window systems always |
679 (progn | 679 (progn |
680 (setq idlwave-shell-stop-line-overlay (make-overlay 1 1)) | 680 (setq idlwave-shell-stop-line-overlay (make-overlay 1 1)) |
681 (overlay-put idlwave-shell-stop-line-overlay | 681 (overlay-put idlwave-shell-stop-line-overlay |
682 'face idlwave-shell-stop-line-face)))) | 682 'face idlwave-shell-stop-line-face)))) |
683 | 683 |
684 (t | 684 (t |
685 ;; IDLWAVE may decide. Will use a face on window systems, arrow elsewhere | 685 ;; IDLWAVE may decide. Will use a face on window systems, arrow elsewhere |
686 (if window-system | 686 (if window-system |
687 (progn | 687 (progn |
688 (setq idlwave-shell-stop-line-overlay (make-overlay 1 1)) | 688 (setq idlwave-shell-stop-line-overlay (make-overlay 1 1)) |
689 (overlay-put idlwave-shell-stop-line-overlay | 689 (overlay-put idlwave-shell-stop-line-overlay |
690 'face idlwave-shell-stop-line-face))))) | 690 'face idlwave-shell-stop-line-face))))) |
691 | 691 |
692 ;; Now the expression and output overlays | 692 ;; Now the expression and output overlays |
693 (setq idlwave-shell-expression-overlay (make-overlay 1 1)) | 693 (setq idlwave-shell-expression-overlay (make-overlay 1 1)) |
694 (overlay-put idlwave-shell-expression-overlay | 694 (overlay-put idlwave-shell-expression-overlay |
745 (defvar idlwave-shell-wait-for-output nil | 745 (defvar idlwave-shell-wait-for-output nil |
746 "Whether to wait for output to accumulate.") | 746 "Whether to wait for output to accumulate.") |
747 | 747 |
748 ;;; The following are the types of messages we attempt to catch to | 748 ;;; The following are the types of messages we attempt to catch to |
749 ;;; resync our idea of where IDL execution currently is. | 749 ;;; resync our idea of where IDL execution currently is. |
750 ;;; | 750 ;;; |
751 | 751 |
752 (defvar idlwave-shell-halt-frame nil | 752 (defvar idlwave-shell-halt-frame nil |
753 "The frame associated with halt/breakpoint messages.") | 753 "The frame associated with halt/breakpoint messages.") |
754 | 754 |
755 (defvar idlwave-shell-step-frame nil | 755 (defvar idlwave-shell-step-frame nil |
789 (defvar idlwave-shell-break-message "^% Breakpoint at:" | 789 (defvar idlwave-shell-break-message "^% Breakpoint at:" |
790 "*Regular expression matching an IDL breakpoint message line.") | 790 "*Regular expression matching an IDL breakpoint message line.") |
791 | 791 |
792 (defconst idlwave-shell-electric-debug-help | 792 (defconst idlwave-shell-electric-debug-help |
793 " ==> IDLWAVE Electric Debug Mode Help <== | 793 " ==> IDLWAVE Electric Debug Mode Help <== |
794 | 794 |
795 Break Point Setting and Clearing: | 795 Break Point Setting and Clearing: |
796 b Set breakpoint ([C-u b] for conditional, [C-n b] nth hit, etc.). | 796 b Set breakpoint ([C-u b] for conditional, [C-n b] nth hit, etc.). |
797 d Clear nearby breakpoint. | 797 d Clear nearby breakpoint. |
798 a Clear all breakpoints. | 798 a Clear all breakpoints. |
799 i Set breakpoint in routine named here. | 799 i Set breakpoint in routine named here. |
815 - or _ Show lower level in calling stack. | 815 - or _ Show lower level in calling stack. |
816 | 816 |
817 Examining Expressions (with prefix for examining the region): | 817 Examining Expressions (with prefix for examining the region): |
818 p Print expression near point or in region ([C-u p]). | 818 p Print expression near point or in region ([C-u p]). |
819 ? Help on expression near point or in region ([C-u ?]). | 819 ? Help on expression near point or in region ([C-u ?]). |
820 x Examine expression near point or in region ([C-u x]) with | 820 x Examine expression near point or in region ([C-u x]) with |
821 letter completion of the examine type. | 821 letter completion of the examine type. |
822 | 822 |
823 Miscellaneous: | 823 Miscellaneous: |
824 q Quit - end debugging session and return to the Shell's main level. | 824 q Quit - end debugging session and return to the Shell's main level. |
825 v Turn Electric Debugging Mode off (C-c C-d C-v to return). | 825 v Turn Electric Debugging Mode off (C-c C-d C-v to return). |
869 3. Routine Info | 869 3. Routine Info |
870 ------------ | 870 ------------ |
871 `\\[idlwave-routine-info]' displays information about an IDL routine near point, | 871 `\\[idlwave-routine-info]' displays information about an IDL routine near point, |
872 just like in `idlwave-mode'. The module used is the one at point or | 872 just like in `idlwave-mode'. The module used is the one at point or |
873 the one whose argument list is being edited. | 873 the one whose argument list is being edited. |
874 To update IDLWAVE's knowledge about compiled or edited modules, use | 874 To update IDLWAVE's knowledge about compiled or edited modules, use |
875 \\[idlwave-update-routine-info]. | 875 \\[idlwave-update-routine-info]. |
876 \\[idlwave-find-module] find the source of a module. | 876 \\[idlwave-find-module] find the source of a module. |
877 \\[idlwave-resolve] tells IDL to compile an unresolved module. | 877 \\[idlwave-resolve] tells IDL to compile an unresolved module. |
878 \\[idlwave-context-help] shows the online help on the item at | 878 \\[idlwave-context-help] shows the online help on the item at |
879 point, if online help has been installed. | 879 point, if online help has been installed. |
880 | 880 |
881 | 881 |
882 4. Debugging | 882 4. Debugging |
883 --------- | 883 --------- |
884 A complete set of commands for compiling and debugging IDL programs | 884 A complete set of commands for compiling and debugging IDL programs |
885 is available from the menu. Also keybindings starting with a | 885 is available from the menu. Also keybindings starting with a |
886 `C-c C-d' prefix are available for most commands in the *idl* buffer | 886 `C-c C-d' prefix are available for most commands in the *idl* buffer |
887 and also in source buffers. The best place to learn about the | 887 and also in source buffers. The best place to learn about the |
888 keybindings is again the menu. | 888 keybindings is again the menu. |
889 | 889 |
890 On Emacs versions where this is possible, a debugging toolbar is | 890 On Emacs versions where this is possible, a debugging toolbar is |
972 idlwave-shell-command-output nil | 972 idlwave-shell-command-output nil |
973 idlwave-shell-step-frame nil) | 973 idlwave-shell-step-frame nil) |
974 (idlwave-shell-display-line nil) | 974 (idlwave-shell-display-line nil) |
975 (setq idlwave-shell-calling-stack-index 0) | 975 (setq idlwave-shell-calling-stack-index 0) |
976 (setq idlwave-shell-only-prompt-pattern | 976 (setq idlwave-shell-only-prompt-pattern |
977 (concat "\\`[ \t\n]*" | 977 (concat "\\`[ \t\n]*" |
978 (substring idlwave-shell-prompt-pattern 1) | 978 (substring idlwave-shell-prompt-pattern 1) |
979 "[ \t\n]*\\'")) | 979 "[ \t\n]*\\'")) |
980 | 980 |
981 (when idlwave-shell-query-for-class | 981 (when idlwave-shell-query-for-class |
982 (add-to-list (make-local-variable 'idlwave-determine-class-special) | 982 (add-to-list (make-local-variable 'idlwave-determine-class-special) |
983 'idlwave-shell-get-object-class) | 983 'idlwave-shell-get-object-class) |
1008 (when idlwave-shell-comint-settings | 1008 (when idlwave-shell-comint-settings |
1009 (let ((list idlwave-shell-comint-settings) entry) | 1009 (let ((list idlwave-shell-comint-settings) entry) |
1010 (while (setq entry (pop list)) | 1010 (while (setq entry (pop list)) |
1011 (set (make-local-variable (car entry)) (cdr entry))))) | 1011 (set (make-local-variable (car entry)) (cdr entry))))) |
1012 | 1012 |
1013 | 1013 |
1014 (unless (memq 'comint-carriage-motion | 1014 (unless (memq 'comint-carriage-motion |
1015 (default-value 'comint-output-filter-functions)) | 1015 (default-value 'comint-output-filter-functions)) |
1016 ;; Strip those pesky ctrl-m's. | 1016 ;; Strip those pesky ctrl-m's. |
1017 (add-hook 'comint-output-filter-functions | 1017 (add-hook 'comint-output-filter-functions |
1018 (lambda (string) | 1018 (lambda (string) |
1019 (when (string-match "\r" string) | 1019 (when (string-match "\r" string) |
1020 (let ((pmark (process-mark (get-buffer-process | 1020 (let ((pmark (process-mark (get-buffer-process |
1021 (current-buffer))))) | 1021 (current-buffer))))) |
1022 (save-excursion | 1022 (save-excursion |
1023 ;; bare CR -> delete preceding line | 1023 ;; bare CR -> delete preceding line |
1024 (goto-char comint-last-output-start) | 1024 (goto-char comint-last-output-start) |
1025 (while (search-forward "\r" pmark t) | 1025 (while (search-forward "\r" pmark t) |
1057 ;; Run the hooks. | 1057 ;; Run the hooks. |
1058 (run-hooks 'idlwave-shell-mode-hook) | 1058 (run-hooks 'idlwave-shell-mode-hook) |
1059 (idlwave-shell-send-command idlwave-shell-initial-commands nil 'hide) | 1059 (idlwave-shell-send-command idlwave-shell-initial-commands nil 'hide) |
1060 ;; Turn off IDL's ^d interpreting, and define a system | 1060 ;; Turn off IDL's ^d interpreting, and define a system |
1061 ;; variable which knows the version of IDLWAVE | 1061 ;; variable which knows the version of IDLWAVE |
1062 (idlwave-shell-send-command | 1062 (idlwave-shell-send-command |
1063 (format "defsysv,'!idlwave_version','%s',1" | 1063 (format "defsysv,'!idlwave_version','%s',1" |
1064 idlwave-mode-version) | 1064 idlwave-mode-version) |
1065 nil 'hide) | 1065 nil 'hide) |
1066 ;; Get the paths if they weren't read in from file | 1066 ;; Get the paths if they weren't read in from file |
1067 (if (and (not idlwave-path-alist) | 1067 (if (and (not idlwave-path-alist) |
1068 (or (not (stringp idlwave-system-directory)) | 1068 (or (not (stringp idlwave-system-directory)) |
1079 (old-path-alist idlwave-path-alist)) | 1079 (old-path-alist idlwave-path-alist)) |
1080 (when sysdir | 1080 (when sysdir |
1081 (setq idlwave-system-directory sysdir) | 1081 (setq idlwave-system-directory sysdir) |
1082 (put 'idlwave-system-directory 'from-shell t)) | 1082 (put 'idlwave-system-directory 'from-shell t)) |
1083 ;; Preserve any existing flags | 1083 ;; Preserve any existing flags |
1084 (setq idlwave-path-alist | 1084 (setq idlwave-path-alist |
1085 (mapcar (lambda (x) | 1085 (mapcar (lambda (x) |
1086 (let ((old-entry (assoc x old-path-alist))) | 1086 (let ((old-entry (assoc x old-path-alist))) |
1087 (if old-entry | 1087 (if old-entry |
1088 (cons x (cdr old-entry)) | 1088 (cons x (cdr old-entry)) |
1089 (list x)))) | 1089 (list x)))) |
1090 dirs)) | 1090 dirs)) |
1091 (put 'idlwave-path-alist 'from-shell t) | 1091 (put 'idlwave-path-alist 'from-shell t) |
1092 (if idlwave-path-alist | 1092 (if idlwave-path-alist |
1093 (if (and idlwave-auto-write-paths | 1093 (if (and idlwave-auto-write-paths |
1094 (not idlwave-library-path) | 1094 (not idlwave-library-path) |
1095 (not no-write) ) | 1095 (not no-write) ) |
1096 (idlwave-write-paths)) | 1096 (idlwave-write-paths)) |
1097 ;; Fall back | 1097 ;; Fall back |
1123 (or | 1123 (or |
1124 (let ((flist (visible-frame-list)) | 1124 (let ((flist (visible-frame-list)) |
1125 (frame (selected-frame))) | 1125 (frame (selected-frame))) |
1126 (catch 'exit | 1126 (catch 'exit |
1127 (while flist | 1127 (while flist |
1128 (if (not (eq (car flist) | 1128 (if (not (eq (car flist) |
1129 idlwave-shell-idl-wframe)) | 1129 idlwave-shell-idl-wframe)) |
1130 (throw 'exit (car flist)) | 1130 (throw 'exit (car flist)) |
1131 (setq flist (cdr flist)))))) | 1131 (setq flist (cdr flist)))))) |
1132 (make-frame)) | 1132 (make-frame)) |
1133 (selected-frame)))))) | 1133 (selected-frame)))))) |
1134 | 1134 |
1142 ;; It does not exist. Check if we have a source frame. | 1142 ;; It does not exist. Check if we have a source frame. |
1143 (if (not (frame-live-p idlwave-shell-display-wframe)) | 1143 (if (not (frame-live-p idlwave-shell-display-wframe)) |
1144 ;; We do not have a source frame, so we use this one. | 1144 ;; We do not have a source frame, so we use this one. |
1145 (setq idlwave-shell-display-wframe (selected-frame))) | 1145 (setq idlwave-shell-display-wframe (selected-frame))) |
1146 ;; Return a new frame | 1146 ;; Return a new frame |
1147 (setq idlwave-shell-idl-wframe | 1147 (setq idlwave-shell-idl-wframe |
1148 (make-frame idlwave-shell-frame-parameters))))) | 1148 (make-frame idlwave-shell-frame-parameters))))) |
1149 | 1149 |
1150 ;;;###autoload | 1150 ;;;###autoload |
1151 (defun idlwave-shell (&optional arg quick) | 1151 (defun idlwave-shell (&optional arg quick) |
1152 "Run an inferior IDL, with I/O through buffer `(idlwave-shell-buffer)'. | 1152 "Run an inferior IDL, with I/O through buffer `(idlwave-shell-buffer)'. |
1153 If buffer exists but shell process is not running, start new IDL. | 1153 If buffer exists but shell process is not running, start new IDL. |
1154 If buffer exists and shell process is running, just switch to the buffer. | 1154 If buffer exists and shell process is running, just switch to the buffer. |
1171 (let ((idlwave-shell-use-dedicated-frame nil)) | 1171 (let ((idlwave-shell-use-dedicated-frame nil)) |
1172 (idlwave-shell nil) | 1172 (idlwave-shell nil) |
1173 (delete-other-windows)) | 1173 (delete-other-windows)) |
1174 (and idlwave-shell-use-dedicated-frame | 1174 (and idlwave-shell-use-dedicated-frame |
1175 (setq idlwave-shell-idl-wframe (selected-frame))) | 1175 (setq idlwave-shell-idl-wframe (selected-frame))) |
1176 (add-hook 'idlwave-shell-sentinel-hook | 1176 (add-hook 'idlwave-shell-sentinel-hook |
1177 'save-buffers-kill-emacs t)) | 1177 'save-buffers-kill-emacs t)) |
1178 | 1178 |
1179 ;; A non-nil arg means, we want a dedicated frame. This will last | 1179 ;; A non-nil arg means, we want a dedicated frame. This will last |
1180 ;; for the current editing session. | 1180 ;; for the current editing session. |
1181 (if arg (setq idlwave-shell-use-dedicated-frame t)) | 1181 (if arg (setq idlwave-shell-use-dedicated-frame t)) |
1182 (if (equal arg '(16)) (setq idlwave-shell-use-dedicated-frame nil)) | 1182 (if (equal arg '(16)) (setq idlwave-shell-use-dedicated-frame nil)) |
1183 | 1183 |
1184 ;; Check if the process still exists. If not, create it. | 1184 ;; Check if the process still exists. If not, create it. |
1185 (unless (comint-check-proc (idlwave-shell-buffer)) | 1185 (unless (comint-check-proc (idlwave-shell-buffer)) |
1186 (let* ((prg (or idlwave-shell-explicit-file-name "idl")) | 1186 (let* ((prg (or idlwave-shell-explicit-file-name "idl")) |
1187 (buf (apply 'make-comint | 1187 (buf (apply 'make-comint |
1188 idlwave-shell-process-name prg nil | 1188 idlwave-shell-process-name prg nil |
1205 (if idlwave-shell-ready | 1205 (if idlwave-shell-ready |
1206 (raise-frame (window-frame window))) | 1206 (raise-frame (window-frame window))) |
1207 (if (eq (selected-frame) (window-frame window)) | 1207 (if (eq (selected-frame) (window-frame window)) |
1208 (select-window window)))) | 1208 (select-window window)))) |
1209 ;; Save the paths at the end | 1209 ;; Save the paths at the end |
1210 (add-hook 'idlwave-shell-sentinel-hook | 1210 (add-hook 'idlwave-shell-sentinel-hook |
1211 (lambda () | 1211 (lambda () |
1212 (if (and | 1212 (if (and |
1213 idlwave-auto-write-paths | 1213 idlwave-auto-write-paths |
1214 idlwave-path-alist | 1214 idlwave-path-alist |
1215 (not idlwave-library-path) | 1215 (not idlwave-library-path) |
1216 (get 'idlwave-path-alist 'from-shell)) | 1216 (get 'idlwave-path-alist 'from-shell)) |
1217 (idlwave-write-paths))))) | 1217 (idlwave-write-paths))))) |
1238 (delq type idlwave-shell-show-commands) | 1238 (delq type idlwave-shell-show-commands) |
1239 (add-to-list'idlwave-shell-show-commands type))) | 1239 (add-to-list'idlwave-shell-show-commands type))) |
1240 (setq idlwave-shell-show-commands (list type)))) | 1240 (setq idlwave-shell-show-commands (list type)))) |
1241 | 1241 |
1242 | 1242 |
1243 (defun idlwave-shell-send-command (&optional cmd pcmd hide preempt | 1243 (defun idlwave-shell-send-command (&optional cmd pcmd hide preempt |
1244 show-if-error) | 1244 show-if-error) |
1245 "Send a command to IDL process. | 1245 "Send a command to IDL process. |
1246 | 1246 |
1247 \(CMD PCMD HIDE\) are placed at the end of ` | 1247 \(CMD PCMD HIDE\) are placed at the end of ` |
1248 idlwave-shell-pending-commands'. If IDL is ready the first command, | 1248 idlwave-shell-pending-commands'. If IDL is ready the first command, |
1259 | 1259 |
1260 If optional fourth argument PREEMPT is non-nil CMD is put at front of | 1260 If optional fourth argument PREEMPT is non-nil CMD is put at front of |
1261 `idlwave-shell-pending-commands'. If PREEMPT is 'wait, wait for all | 1261 `idlwave-shell-pending-commands'. If PREEMPT is 'wait, wait for all |
1262 output to complete and the next prompt to arrive before returning | 1262 output to complete and the next prompt to arrive before returning |
1263 \(useful if you need an answer now\). IDL is considered ready if the | 1263 \(useful if you need an answer now\). IDL is considered ready if the |
1264 prompt is present and if `idlwave-shell-ready' is non-nil. | 1264 prompt is present and if `idlwave-shell-ready' is non-nil. |
1265 | 1265 |
1266 If SHOW-IF-ERROR is non-nil, show the output it it contains an error | 1266 If SHOW-IF-ERROR is non-nil, show the output it it contains an error |
1267 message, independent of what HIDE is set to." | 1267 message, independent of what HIDE is set to." |
1268 | 1268 |
1269 ; (setq hide nil) ; FIXME: turn this on for debugging only | 1269 ; (setq hide nil) ; FIXME: turn this on for debugging only |
1270 ; (if (null cmd) | 1270 ; (if (null cmd) |
1271 ; (progn | 1271 ; (progn |
1272 ; (message "SENDING Pending commands: %s" | 1272 ; (message "SENDING Pending commands: %s" |
1273 ; (prin1-to-string idlwave-shell-pending-commands))) | 1273 ; (prin1-to-string idlwave-shell-pending-commands))) |
1274 ; (message "SENDING %s|||%s" cmd pcmd)) | 1274 ; (message "SENDING %s|||%s" cmd pcmd)) |
1275 (if (and (symbolp idlwave-shell-show-commands) | 1275 (if (and (symbolp idlwave-shell-show-commands) |
1276 (eq idlwave-shell-show-commands 'everything)) | 1276 (eq idlwave-shell-show-commands 'everything)) |
1277 (setq hide nil)) | 1277 (setq hide nil)) |
1278 (let ((save-buffer (current-buffer)) | 1278 (let ((save-buffer (current-buffer)) |
1279 buf proc) | 1279 buf proc) |
1280 ;; Get or make the buffer and its process | 1280 ;; Get or make the buffer and its process |
1298 (if preempt | 1298 (if preempt |
1299 ;; Put at front. | 1299 ;; Put at front. |
1300 (append (list (list cmd pcmd hide show-if-error)) | 1300 (append (list (list cmd pcmd hide show-if-error)) |
1301 idlwave-shell-pending-commands) | 1301 idlwave-shell-pending-commands) |
1302 ;; Put at end. | 1302 ;; Put at end. |
1303 (append idlwave-shell-pending-commands | 1303 (append idlwave-shell-pending-commands |
1304 (list (list cmd pcmd hide show-if-error)))))) | 1304 (list (list cmd pcmd hide show-if-error)))))) |
1305 ;; Check if IDL ready | 1305 ;; Check if IDL ready |
1306 (let ((save-point (point-marker))) | 1306 (let ((save-point (point-marker))) |
1307 (goto-char (process-mark proc)) | 1307 (goto-char (process-mark proc)) |
1308 (if (and idlwave-shell-ready | 1308 (if (and idlwave-shell-ready |
1347 (let ((errf (if error 'error 'message)) | 1347 (let ((errf (if error 'error 'message)) |
1348 buf proc) | 1348 buf proc) |
1349 (if (or (not (setq buf (get-buffer (idlwave-shell-buffer)))) | 1349 (if (or (not (setq buf (get-buffer (idlwave-shell-buffer)))) |
1350 (not (setq proc (get-buffer-process buf)))) | 1350 (not (setq proc (get-buffer-process buf)))) |
1351 (funcall errf "Shell is not running")) | 1351 (funcall errf "Shell is not running")) |
1352 (if (equal c ?\C-g) | 1352 (if (equal c ?\C-g) |
1353 (funcall errf "Abort") | 1353 (funcall errf "Abort") |
1354 (comint-send-string proc (char-to-string c))))) | 1354 (comint-send-string proc (char-to-string c))))) |
1355 | 1355 |
1356 (defvar idlwave-shell-char-mode-active) | 1356 (defvar idlwave-shell-char-mode-active) |
1357 (defun idlwave-shell-input-mode-magic (string) | 1357 (defun idlwave-shell-input-mode-magic (string) |
1388 (not (setq proc (get-buffer-process buf)))) | 1388 (not (setq proc (get-buffer-process buf)))) |
1389 (funcall errf "Shell is not running")) | 1389 (funcall errf "Shell is not running")) |
1390 (if idlwave-shell-ready | 1390 (if idlwave-shell-ready |
1391 (funcall errf "No IDL program seems to be waiting for input")) | 1391 (funcall errf "No IDL program seems to be waiting for input")) |
1392 | 1392 |
1393 ;; OK, start the loop | 1393 ;; OK, start the loop |
1394 (message "Character mode on: Sending single chars (`C-g' to exit)") | 1394 (message "Character mode on: Sending single chars (`C-g' to exit)") |
1395 (message | 1395 (message |
1396 (catch 'exit | 1396 (catch 'exit |
1397 (while t | 1397 (while t |
1398 ;; Wait for input | 1398 ;; Wait for input |
1468 works well enough, since any print output typically arrives before | 1468 works well enough, since any print output typically arrives before |
1469 error messages, etc." | 1469 error messages, etc." |
1470 (setq output (substring output (string-match "\n" output))) | 1470 (setq output (substring output (string-match "\n" output))) |
1471 (while (string-match "\\(\n\\|\\`\\)%.*\\(\n .*\\)*" output) | 1471 (while (string-match "\\(\n\\|\\`\\)%.*\\(\n .*\\)*" output) |
1472 (setq output (replace-match "" nil t output))) | 1472 (setq output (replace-match "" nil t output))) |
1473 (unless | 1473 (unless |
1474 (string-match idlwave-shell-only-prompt-pattern output) | 1474 (string-match idlwave-shell-only-prompt-pattern output) |
1475 output)) | 1475 output)) |
1476 | 1476 |
1477 (defvar idlwave-shell-hidden-output-buffer " *idlwave-shell-hidden-output*" | 1477 (defvar idlwave-shell-hidden-output-buffer " *idlwave-shell-hidden-output*" |
1478 "Buffer containing hidden output from IDL commands.") | 1478 "Buffer containing hidden output from IDL commands.") |
1479 (defvar idlwave-shell-current-state nil) | 1479 (defvar idlwave-shell-current-state nil) |
1480 | 1480 |
1481 (defun idlwave-shell-filter (proc string) | 1481 (defun idlwave-shell-filter (proc string) |
1482 "Watch for IDL prompt and filter incoming text. | 1482 "Watch for IDL prompt and filter incoming text. |
1483 When the IDL prompt is received executes `idlwave-shell-post-command-hook' | 1483 When the IDL prompt is received executes `idlwave-shell-post-command-hook' |
1484 and then calls `idlwave-shell-send-command' for any pending commands." | 1484 and then calls `idlwave-shell-send-command' for any pending commands." |
1485 ;; We no longer do the cleanup here - this is done by the process sentinel | 1485 ;; We no longer do the cleanup here - this is done by the process sentinel |
1507 (progn | 1507 (progn |
1508 (if idlwave-shell-use-input-mode-magic | 1508 (if idlwave-shell-use-input-mode-magic |
1509 (idlwave-shell-input-mode-magic | 1509 (idlwave-shell-input-mode-magic |
1510 (concat idlwave-shell-accumulation string))) | 1510 (concat idlwave-shell-accumulation string))) |
1511 (setq idlwave-shell-accumulation | 1511 (setq idlwave-shell-accumulation |
1512 (substring string | 1512 (substring string |
1513 (progn (string-match "\\(.*[\n\r]+\\)*" | 1513 (progn (string-match "\\(.*[\n\r]+\\)*" |
1514 string) | 1514 string) |
1515 (match-end 0))))) | 1515 (match-end 0))))) |
1516 (setq idlwave-shell-accumulation | 1516 (setq idlwave-shell-accumulation |
1517 (concat idlwave-shell-accumulation string))) | 1517 (concat idlwave-shell-accumulation string))) |
1518 | 1518 |
1519 | 1519 |
1520 ;;; Test/Debug code | 1520 ;;; Test/Debug code |
1521 ; (save-excursion (set-buffer | 1521 ; (save-excursion (set-buffer |
1522 ; (get-buffer-create "*idlwave-shell-output*")) | 1522 ; (get-buffer-create "*idlwave-shell-output*")) |
1523 ; (goto-char (point-max)) | 1523 ; (goto-char (point-max)) |
1524 ; (insert "\nSTRING===>\n" string "\n<====\n")) | 1524 ; (insert "\nSTRING===>\n" string "\n<====\n")) |
1525 | 1525 |
1526 ;; Check for prompt in current accumulating output | 1526 ;; Check for prompt in current accumulating output |
1527 (if (setq idlwave-shell-ready | 1527 (if (setq idlwave-shell-ready |
1528 (string-match idlwave-shell-prompt-pattern | 1528 (string-match idlwave-shell-prompt-pattern |
1529 idlwave-shell-accumulation)) | 1529 idlwave-shell-accumulation)) |
1530 (progn | 1530 (progn |
1556 ;; Show the output in the shell if it contains an error | 1556 ;; Show the output in the shell if it contains an error |
1557 (if idlwave-shell-hide-output | 1557 (if idlwave-shell-hide-output |
1558 (if (and idlwave-shell-show-if-error | 1558 (if (and idlwave-shell-show-if-error |
1559 (eq idlwave-shell-current-state 'error)) | 1559 (eq idlwave-shell-current-state 'error)) |
1560 (idlwave-shell-comint-filter proc full-output) | 1560 (idlwave-shell-comint-filter proc full-output) |
1561 ;; If it's only *mostly* hidden, filter % lines, | 1561 ;; If it's only *mostly* hidden, filter % lines, |
1562 ;; and show anything that remains | 1562 ;; and show anything that remains |
1563 (if (eq idlwave-shell-hide-output 'mostly) | 1563 (if (eq idlwave-shell-hide-output 'mostly) |
1564 (let ((filtered | 1564 (let ((filtered |
1565 (idlwave-shell-filter-hidden-output | 1565 (idlwave-shell-filter-hidden-output |
1566 full-output))) | 1566 full-output))) |
1567 (if filtered | 1567 (if filtered |
1568 (idlwave-shell-comint-filter | 1568 (idlwave-shell-comint-filter |
1569 proc filtered)))))) | 1569 proc filtered)))))) |
1570 | 1570 |
1571 ;; Call the post-command hook | 1571 ;; Call the post-command hook |
1572 (if (listp idlwave-shell-post-command-hook) | 1572 (if (listp idlwave-shell-post-command-hook) |
1573 (progn | 1573 (progn |
1574 ;(message "Calling list") | 1574 ;(message "Calling list") |
1575 ;(prin1 idlwave-shell-post-command-hook) | 1575 ;(prin1 idlwave-shell-post-command-hook) |
1610 (if (and idlwave-shell-save-command-history | 1610 (if (and idlwave-shell-save-command-history |
1611 (stringp idlwave-shell-command-history-file)) | 1611 (stringp idlwave-shell-command-history-file)) |
1612 (condition-case nil | 1612 (condition-case nil |
1613 (comint-write-input-ring) | 1613 (comint-write-input-ring) |
1614 (error nil))))) | 1614 (error nil))))) |
1615 | 1615 |
1616 (when (and (> (length (frame-list)) 1) | 1616 (when (and (> (length (frame-list)) 1) |
1617 (frame-live-p idlwave-shell-idl-wframe)) | 1617 (frame-live-p idlwave-shell-idl-wframe)) |
1618 (delete-frame idlwave-shell-idl-wframe) | 1618 (delete-frame idlwave-shell-idl-wframe) |
1619 (setq idlwave-shell-idl-wframe nil | 1619 (setq idlwave-shell-idl-wframe nil |
1620 idlwave-shell-display-wframe nil)) | 1620 idlwave-shell-display-wframe nil)) |
1634 | 1634 |
1635 ;; FIXME: the following two variables do not currently allow line breaks | 1635 ;; FIXME: the following two variables do not currently allow line breaks |
1636 ;; in module and file names. I am not sure if it will be necessary to | 1636 ;; in module and file names. I am not sure if it will be necessary to |
1637 ;; change this. Currently it seems to work the way it is. | 1637 ;; change this. Currently it seems to work the way it is. |
1638 (defvar idlwave-shell-syntax-error | 1638 (defvar idlwave-shell-syntax-error |
1639 "^% Syntax error.\\s-*\n\\s-*At:\\s-*\\(.*\\),\\s-*Line\\s-*\\(.*\\)" | 1639 "^% Syntax error.\\s-*\n\\s-*At:\\s-*\\(.*\\),\\s-*Line\\s-*\\(.*\\)" |
1640 "A regular expression to match an IDL syntax error. | 1640 "A regular expression to match an IDL syntax error. |
1641 The 1st pair matches the file name, the second pair matches the line | 1641 The 1st pair matches the file name, the second pair matches the line |
1642 number.") | 1642 number.") |
1643 | 1643 |
1644 (defvar idlwave-shell-other-error | 1644 (defvar idlwave-shell-other-error |
1645 "^% .*\n\\s-*At:\\s-*\\(.*\\),\\s-*Line\\s-*\\(.*\\)" | 1645 "^% .*\n\\s-*At:\\s-*\\(.*\\),\\s-*Line\\s-*\\(.*\\)" |
1646 "A regular expression to match any IDL error.") | 1646 "A regular expression to match any IDL error.") |
1647 | 1647 |
1648 (defvar idlwave-shell-halting-error | 1648 (defvar idlwave-shell-halting-error |
1649 "^% .*\n\\([^%].*\n\\)*% Execution halted at:\\(\\s-*\\S-+\\s-*[0-9]+\\s-*.*\\)\n" | 1649 "^% .*\n\\([^%].*\n\\)*% Execution halted at:\\(\\s-*\\S-+\\s-*[0-9]+\\s-*.*\\)\n" |
1650 "A regular expression to match errors which halt execution.") | 1650 "A regular expression to match errors which halt execution.") |
1651 | 1651 |
1652 (defvar idlwave-shell-cant-continue-error | 1652 (defvar idlwave-shell-cant-continue-error |
1653 "^% Can't continue from this point.\n" | 1653 "^% Can't continue from this point.\n" |
1654 "A regular expression to match errors stepping errors.") | 1654 "A regular expression to match errors stepping errors.") |
1655 | 1655 |
1656 (defvar idlwave-shell-file-line-message | 1656 (defvar idlwave-shell-file-line-message |
1657 (concat | 1657 (concat |
1658 "\\(" ; program name group (1) | 1658 "\\(" ; program name group (1) |
1659 "\\$MAIN\\$\\|" ; main level routine | 1659 "\\$MAIN\\$\\|" ; main level routine |
1660 "\\<[a-zA-Z][a-zA-Z0-9_$:]*" ; start with a letter followed by [..] | 1660 "\\<[a-zA-Z][a-zA-Z0-9_$:]*" ; start with a letter followed by [..] |
1661 "\\([ \t]*\n[ \t]*[a-zA-Z0-9_$:]+\\)*"; continuation lines program name (2) | 1661 "\\([ \t]*\n[ \t]*[a-zA-Z0-9_$:]+\\)*"; continuation lines program name (2) |
1662 "\\)" ; end program name group (1) | 1662 "\\)" ; end program name group (1) |
1670 "[^ \t\n]+" ; file names can contain any non-white | 1670 "[^ \t\n]+" ; file names can contain any non-white |
1671 "\\([ \t]*\n[ \t]*[^ \t\n]+\\)*" ; continuation lines file name (6) | 1671 "\\([ \t]*\n[ \t]*[^ \t\n]+\\)*" ; continuation lines file name (6) |
1672 "\\)" ; end line number group (5) | 1672 "\\)" ; end line number group (5) |
1673 ) | 1673 ) |
1674 "*A regular expression to parse out the file name and line number. | 1674 "*A regular expression to parse out the file name and line number. |
1675 The 1st group should match the subroutine name. | 1675 The 1st group should match the subroutine name. |
1676 The 3rd group is the line number. | 1676 The 3rd group is the line number. |
1677 The 5th group is the file name. | 1677 The 5th group is the file name. |
1678 All parts may contain linebreaks surrounded by spaces. This is important | 1678 All parts may contain linebreaks surrounded by spaces. This is important |
1679 in IDL5 which inserts random linebreaks in long module and file names.") | 1679 in IDL5 which inserts random linebreaks in long module and file names.") |
1680 | 1680 |
1689 the above." | 1689 the above." |
1690 (let (trace) | 1690 (let (trace) |
1691 (cond | 1691 (cond |
1692 ;; Make sure we have output | 1692 ;; Make sure we have output |
1693 ((not idlwave-shell-command-output)) | 1693 ((not idlwave-shell-command-output)) |
1694 | 1694 |
1695 ;; First Priority: Syntax and other errors | 1695 ;; First Priority: Syntax and other errors |
1696 ((or | 1696 ((or |
1697 (string-match idlwave-shell-syntax-error | 1697 (string-match idlwave-shell-syntax-error |
1698 idlwave-shell-command-output) | 1698 idlwave-shell-command-output) |
1699 (string-match idlwave-shell-other-error | 1699 (string-match idlwave-shell-other-error |
1700 idlwave-shell-command-output)) | 1700 idlwave-shell-command-output)) |
1701 (save-excursion | 1701 (save-excursion |
1705 (insert idlwave-shell-command-output) | 1705 (insert idlwave-shell-command-output) |
1706 (goto-char (point-min)) | 1706 (goto-char (point-min)) |
1707 (setq idlwave-shell-error-last (point))) | 1707 (setq idlwave-shell-error-last (point))) |
1708 (setq idlwave-shell-current-state 'error) | 1708 (setq idlwave-shell-current-state 'error) |
1709 (idlwave-shell-goto-next-error)) | 1709 (idlwave-shell-goto-next-error)) |
1710 | 1710 |
1711 ;; Second Priority: Halting errors | 1711 ;; Second Priority: Halting errors |
1712 ((string-match idlwave-shell-halting-error | 1712 ((string-match idlwave-shell-halting-error |
1713 idlwave-shell-command-output) | 1713 idlwave-shell-command-output) |
1714 ;; Grab the file and line state info. | 1714 ;; Grab the file and line state info. |
1715 (setq idlwave-shell-calling-stack-index 0) | 1715 (setq idlwave-shell-calling-stack-index 0) |
1716 (setq idlwave-shell-halt-frame | 1716 (setq idlwave-shell-halt-frame |
1717 (idlwave-shell-parse-line | 1717 (idlwave-shell-parse-line |
1718 (substring idlwave-shell-command-output | 1718 (substring idlwave-shell-command-output |
1719 (match-beginning 2))) | 1719 (match-beginning 2))) |
1720 idlwave-shell-current-state 'error) | 1720 idlwave-shell-current-state 'error) |
1721 (idlwave-shell-display-line (idlwave-shell-pc-frame))) | 1721 (idlwave-shell-display-line (idlwave-shell-pc-frame))) |
1722 | 1722 |
1723 ;; Third Priority: Various types of innocuous HALT and | 1723 ;; Third Priority: Various types of innocuous HALT and |
1724 ;; TRACEBACK messages. | 1724 ;; TRACEBACK messages. |
1725 ((or (setq trace (string-match idlwave-shell-trace-message-re | 1725 ((or (setq trace (string-match idlwave-shell-trace-message-re |
1726 idlwave-shell-command-output)) | 1726 idlwave-shell-command-output)) |
1727 (string-match idlwave-shell-halt-messages-re | 1727 (string-match idlwave-shell-halt-messages-re |
1728 idlwave-shell-command-output)) | 1728 idlwave-shell-command-output)) |
1729 ;; Grab the file and line state info. | 1729 ;; Grab the file and line state info. |
1730 (setq idlwave-shell-calling-stack-index 0) | 1730 (setq idlwave-shell-calling-stack-index 0) |
1731 (setq idlwave-shell-halt-frame | 1731 (setq idlwave-shell-halt-frame |
1732 (idlwave-shell-parse-line | 1732 (idlwave-shell-parse-line |
1733 (substring idlwave-shell-command-output (match-end 0)))) | 1733 (substring idlwave-shell-command-output (match-end 0)))) |
1734 (setq idlwave-shell-current-state 'halt) | 1734 (setq idlwave-shell-current-state 'halt) |
1735 ;; Don't debug trace messages | 1735 ;; Don't debug trace messages |
1736 (idlwave-shell-display-line (idlwave-shell-pc-frame) nil | 1736 (idlwave-shell-display-line (idlwave-shell-pc-frame) nil |
1737 (if trace 'no-debug))) | 1737 (if trace 'no-debug))) |
1738 | 1738 |
1739 ;; Fourth Priority: Breakpoints | 1739 ;; Fourth Priority: Breakpoints |
1740 ((string-match idlwave-shell-break-message | 1740 ((string-match idlwave-shell-break-message |
1741 idlwave-shell-command-output) | 1741 idlwave-shell-command-output) |
1742 (setq idlwave-shell-calling-stack-index 0) | 1742 (setq idlwave-shell-calling-stack-index 0) |
1743 (setq idlwave-shell-halt-frame | 1743 (setq idlwave-shell-halt-frame |
1744 (idlwave-shell-parse-line | 1744 (idlwave-shell-parse-line |
1745 (substring idlwave-shell-command-output (match-end 0)))) | 1745 (substring idlwave-shell-command-output (match-end 0)))) |
1746 ;; We used to count hits on breakpoints | 1746 ;; We used to count hits on breakpoints |
1747 ;; this is no longer supported since IDL breakpoints | 1747 ;; this is no longer supported since IDL breakpoints |
1748 ;; have learned counting. | 1748 ;; have learned counting. |
1749 ;; Do breakpoint command processing | 1749 ;; Do breakpoint command processing |
1750 (let ((bp (assoc | 1750 (let ((bp (assoc |
1751 (list | 1751 (list |
1752 (nth 0 idlwave-shell-halt-frame) | 1752 (nth 0 idlwave-shell-halt-frame) |
1753 (nth 1 idlwave-shell-halt-frame)) | 1753 (nth 1 idlwave-shell-halt-frame)) |
1754 idlwave-shell-bp-alist))) | 1754 idlwave-shell-bp-alist))) |
1755 ;(message "Scanning with %s" bp) | 1755 ;(message "Scanning with %s" bp) |
1758 (if cmd ;; Execute any breakpoint command | 1758 (if cmd ;; Execute any breakpoint command |
1759 (if (listp cmd) (eval cmd) (funcall cmd)))) | 1759 (if (listp cmd) (eval cmd) (funcall cmd)))) |
1760 ;; A breakpoint that we did not know about - perhaps it was | 1760 ;; A breakpoint that we did not know about - perhaps it was |
1761 ;; set by the user... Let's update our list. | 1761 ;; set by the user... Let's update our list. |
1762 (idlwave-shell-bp-query))) | 1762 (idlwave-shell-bp-query))) |
1763 (setq idlwave-shell-current-state 'breakpoint) | 1763 (setq idlwave-shell-current-state 'breakpoint) |
1764 (idlwave-shell-display-line (idlwave-shell-pc-frame))) | 1764 (idlwave-shell-display-line (idlwave-shell-pc-frame))) |
1765 | 1765 |
1766 ;; Last Priority: Can't Step errors | 1766 ;; Last Priority: Can't Step errors |
1767 ((string-match idlwave-shell-cant-continue-error | 1767 ((string-match idlwave-shell-cant-continue-error |
1768 idlwave-shell-command-output) | 1768 idlwave-shell-command-output) |
1769 (setq idlwave-shell-current-state 'breakpoint)) | 1769 (setq idlwave-shell-current-state 'breakpoint)) |
1770 | 1770 |
1775 "Parse IDL message for the subroutine, file name and line number. | 1775 "Parse IDL message for the subroutine, file name and line number. |
1776 We need to work hard here to remove the stupid line breaks inserted by | 1776 We need to work hard here to remove the stupid line breaks inserted by |
1777 IDL5. These line breaks can be right in the middle of procedure | 1777 IDL5. These line breaks can be right in the middle of procedure |
1778 or file names. | 1778 or file names. |
1779 It is very difficult to come up with a robust solution. This one seems | 1779 It is very difficult to come up with a robust solution. This one seems |
1780 to be pretty good though. | 1780 to be pretty good though. |
1781 | 1781 |
1782 Here is in what ways it improves over the previous solution: | 1782 Here is in what ways it improves over the previous solution: |
1783 | 1783 |
1784 1. The procedure name can be split and will be restored. | 1784 1. The procedure name can be split and will be restored. |
1785 2. The number can be split. I have never seen this, but who knows. | 1785 2. The number can be split. I have never seen this, but who knows. |
1800 (when (and (not (if skip-main (string-match ":\\s-*\\$MAIN" string))) | 1800 (when (and (not (if skip-main (string-match ":\\s-*\\$MAIN" string))) |
1801 (string-match idlwave-shell-file-line-message string)) | 1801 (string-match idlwave-shell-file-line-message string)) |
1802 (setq procedure (match-string 1 string) | 1802 (setq procedure (match-string 1 string) |
1803 number (match-string 3 string) | 1803 number (match-string 3 string) |
1804 file (match-string 5 string)) | 1804 file (match-string 5 string)) |
1805 | 1805 |
1806 ;; Repair the strings | 1806 ;; Repair the strings |
1807 (setq procedure (idlwave-shell-repair-string procedure)) | 1807 (setq procedure (idlwave-shell-repair-string procedure)) |
1808 (setq number (idlwave-shell-repair-string number)) | 1808 (setq number (idlwave-shell-repair-string number)) |
1809 (setq file (idlwave-shell-repair-file-name file)) | 1809 (setq file (idlwave-shell-repair-file-name file)) |
1810 | 1810 |
1811 ;; If we have a file, return the frame list | 1811 ;; If we have a file, return the frame list |
1812 (if file | 1812 (if file |
1813 (list (idlwave-shell-file-name file) | 1813 (list (idlwave-shell-file-name file) |
1814 (string-to-int number) | 1814 (string-to-number number) |
1815 procedure) | 1815 procedure) |
1816 ;; No success finding a file | 1816 ;; No success finding a file |
1817 nil)))) | 1817 nil)))) |
1818 | 1818 |
1819 (defun idlwave-shell-repair-string (string) | 1819 (defun idlwave-shell-repair-string (string) |
1826 "Repair a file name string by taking out all linebreaks. | 1826 "Repair a file name string by taking out all linebreaks. |
1827 The last line of STRING may be garbage - we check which one makes a valid | 1827 The last line of STRING may be garbage - we check which one makes a valid |
1828 file name." | 1828 file name." |
1829 (let ((file1 "") (file2 "") (start 0)) | 1829 (let ((file1 "") (file2 "") (start 0)) |
1830 ;; We scan no further than to the next "^%" line | 1830 ;; We scan no further than to the next "^%" line |
1831 (if (string-match "^%" file) | 1831 (if (string-match "^%" file) |
1832 (setq file (substring file 0 (match-beginning 0)))) | 1832 (setq file (substring file 0 (match-beginning 0)))) |
1833 ;; Take out the line breaks | 1833 ;; Take out the line breaks |
1834 (while (string-match "[ \t]*\n[ \t]*" file start) | 1834 (while (string-match "[ \t]*\n[ \t]*" file start) |
1835 (setq file1 (concat file1 (substring file start (match-beginning 0))) | 1835 (setq file1 (concat file1 (substring file start (match-beginning 0))) |
1836 start (match-end 0))) | 1836 start (match-end 0))) |
1881 (defun idlwave-shell-window (n) | 1881 (defun idlwave-shell-window (n) |
1882 "Issue a `window,N' command to IDL, with special window size. | 1882 "Issue a `window,N' command to IDL, with special window size. |
1883 The size is given by `idlwave-shell-graphics-window-size'." | 1883 The size is given by `idlwave-shell-graphics-window-size'." |
1884 (interactive "P") | 1884 (interactive "P") |
1885 (let ((n (if n (prefix-numeric-value n) 0))) | 1885 (let ((n (if n (prefix-numeric-value n) 0))) |
1886 (idlwave-shell-send-command | 1886 (idlwave-shell-send-command |
1887 (apply 'format "window,%d,xs=%d,ys=%d" | 1887 (apply 'format "window,%d,xs=%d,ys=%d" |
1888 n idlwave-shell-graphics-window-size) | 1888 n idlwave-shell-graphics-window-size) |
1889 nil (idlwave-shell-hide-p 'misc) nil t))) | 1889 nil (idlwave-shell-hide-p 'misc) nil t))) |
1890 | 1890 |
1891 (defun idlwave-shell-resync-dirs () | 1891 (defun idlwave-shell-resync-dirs () |
1901 (defun idlwave-shell-retall (&optional arg) | 1901 (defun idlwave-shell-retall (&optional arg) |
1902 "Return from the entire calling stack. | 1902 "Return from the entire calling stack. |
1903 Also get rid of widget events in the queue." | 1903 Also get rid of widget events in the queue." |
1904 (interactive "P") | 1904 (interactive "P") |
1905 (save-selected-window | 1905 (save-selected-window |
1906 ;;if (widget_info(/MANAGED))[0] gt 0 then for i=0,n_elements(widget_info(/MANAGED))-1 do widget_control,(widget_info(/MANAGED))[i],/clear_events & | 1906 ;;if (widget_info(/MANAGED))[0] gt 0 then for i=0,n_elements(widget_info(/MANAGED))-1 do widget_control,(widget_info(/MANAGED))[i],/clear_events & |
1907 (idlwave-shell-send-command "retall" nil | 1907 (idlwave-shell-send-command "retall" nil |
1908 (if (idlwave-shell-hide-p 'misc) 'mostly) | 1908 (if (idlwave-shell-hide-p 'misc) 'mostly) |
1909 nil t) | 1909 nil t) |
1910 (idlwave-shell-display-line nil))) | 1910 (idlwave-shell-display-line nil))) |
1911 | 1911 |
1912 (defun idlwave-shell-closeall (&optional arg) | 1912 (defun idlwave-shell-closeall (&optional arg) |
1913 "Close all open files." | 1913 "Close all open files." |
1914 (interactive "P") | 1914 (interactive "P") |
1915 (idlwave-shell-send-command "close,/all" nil | 1915 (idlwave-shell-send-command "close,/all" nil |
1916 (idlwave-shell-hide-p 'misc) nil t)) | 1916 (idlwave-shell-hide-p 'misc) nil t)) |
1917 | 1917 |
1918 (defun idlwave-shell-quit (&optional arg) | 1918 (defun idlwave-shell-quit (&optional arg) |
1919 "Exit the idl process after confirmation. | 1919 "Exit the idl process after confirmation. |
1920 With prefix ARG, exit without confirmation." | 1920 With prefix ARG, exit without confirmation." |
1926 (idlwave-shell-send-command "exit") | 1926 (idlwave-shell-send-command "exit") |
1927 (error nil))))) | 1927 (error nil))))) |
1928 | 1928 |
1929 (defun idlwave-shell-reset (&optional hidden) | 1929 (defun idlwave-shell-reset (&optional hidden) |
1930 "Reset IDL. Return to main level and destroy the leftover variables. | 1930 "Reset IDL. Return to main level and destroy the leftover variables. |
1931 This issues the following commands: | 1931 This issues the following commands: |
1932 RETALL | 1932 RETALL |
1933 WIDGET_CONTROL,/RESET | 1933 WIDGET_CONTROL,/RESET |
1934 CLOSE, /ALL | 1934 CLOSE, /ALL |
1935 HEAP_GC, /VERBOSE" | 1935 HEAP_GC, /VERBOSE" |
1936 ;; OBJ_DESTROY, OBJ_VALID() FIXME: should this be added? | 1936 ;; OBJ_DESTROY, OBJ_VALID() FIXME: should this be added? |
1976 sep-re (concat (regexp-quote sep) " *") | 1976 sep-re (concat (regexp-quote sep) " *") |
1977 text (substring text (match-end 0))) | 1977 text (substring text (match-end 0))) |
1978 ;; Set dummy values and kill the text | 1978 ;; Set dummy values and kill the text |
1979 (setq sep "@" sep-re "@ *" text "") | 1979 (setq sep "@" sep-re "@ *" text "") |
1980 (if idlwave-idlwave_routine_info-compiled | 1980 (if idlwave-idlwave_routine_info-compiled |
1981 (message | 1981 (message |
1982 "Routine Info warning: No match for BEGIN line in \n>>>\n%s\n<<<\n" | 1982 "Routine Info warning: No match for BEGIN line in \n>>>\n%s\n<<<\n" |
1983 idlwave-shell-command-output))) | 1983 idlwave-shell-command-output))) |
1984 (if (string-match "^>>>END OF IDLWAVE ROUTINE INFO.*" text) | 1984 (if (string-match "^>>>END OF IDLWAVE ROUTINE INFO.*" text) |
1985 (setq text (substring text 0 (match-beginning 0))) | 1985 (setq text (substring text 0 (match-beginning 0))) |
1986 (if idlwave-idlwave_routine_info-compiled | 1986 (if idlwave-idlwave_routine_info-compiled |
1987 (message | 1987 (message |
1988 "Routine Info warning: No match for END line in \n>>>\n%s\n<<<\n" | 1988 "Routine Info warning: No match for END line in \n>>>\n%s\n<<<\n" |
1989 idlwave-shell-command-output))) | 1989 idlwave-shell-command-output))) |
1990 (if (string-match "\\S-" text) | 1990 (if (string-match "\\S-" text) |
1991 ;; Obviously, the pro worked. Make a note that we have it now. | 1991 ;; Obviously, the pro worked. Make a note that we have it now. |
1992 (setq idlwave-idlwave_routine_info-compiled t)) | 1992 (setq idlwave-idlwave_routine_info-compiled t)) |
1993 ;; Match the output lines | 1993 ;; Match the output lines |
2001 file (nth 2 specs) | 2001 file (nth 2 specs) |
2002 cs (nth 3 specs) | 2002 cs (nth 3 specs) |
2003 key (nth 4 specs) | 2003 key (nth 4 specs) |
2004 keys (if (and (stringp key) | 2004 keys (if (and (stringp key) |
2005 (not (string-match "\\` *\\'" key))) | 2005 (not (string-match "\\` *\\'" key))) |
2006 (mapcar 'list | 2006 (mapcar 'list |
2007 (delete "" (idlwave-split-string key " +"))))) | 2007 (delete "" (idlwave-split-string key " +"))))) |
2008 (setq name (idlwave-sintern-routine-or-method name class t) | 2008 (setq name (idlwave-sintern-routine-or-method name class t) |
2009 class (idlwave-sintern-class class t) | 2009 class (idlwave-sintern-class class t) |
2010 file (if (equal file "") nil file) | 2010 file (if (equal file "") nil file) |
2011 keys (mapcar (lambda (x) | 2011 keys (mapcar (lambda (x) |
2012 (list (idlwave-sintern-keyword (car x) t))) keys)) | 2012 (list (idlwave-sintern-keyword (car x) t))) keys)) |
2013 | 2013 |
2014 ;; In the following ignore routines already defined in buffers, | 2014 ;; In the following ignore routines already defined in buffers, |
2015 ;; assuming that if the buffer stuff differs, it is a "new" | 2015 ;; assuming that if the buffer stuff differs, it is a "new" |
2016 ;; version, not yet compiled, and should take precedence. | 2016 ;; version, not yet compiled, and should take precedence. |
2017 ;; We could do the same for the library to avoid duplicates - | 2017 ;; We could do the same for the library to avoid duplicates - |
2018 ;; but I think frequently a user might have several versions of | 2018 ;; but I think frequently a user might have several versions of |
2019 ;; the same function in different programs, and in this case the | 2019 ;; the same function in different programs, and in this case the |
2020 ;; compiled one will be the best guess of all versions. | 2020 ;; compiled one will be the best guess of all versions. |
2021 ;; Therefore, we leave duplicates of library routines in. | 2021 ;; Therefore, we leave duplicates of library routines in. |
2022 (cond ((string= name "$MAIN$")) ; ignore this one | 2022 (cond ((string= name "$MAIN$")) ; ignore this one |
2023 ((and (string= type "PRO") | 2023 ((and (string= type "PRO") |
2024 ;; FIXME: is it OK to make the buffer routines dominate? | 2024 ;; FIXME: is it OK to make the buffer routines dominate? |
2025 (or t (null file) | 2025 (or t (null file) |
2026 (not (idlwave-rinfo-assq name 'pro class | 2026 (not (idlwave-rinfo-assq name 'pro class |
2027 idlwave-buffer-routines))) | 2027 idlwave-buffer-routines))) |
2028 ;; FIXME: is it OK to make the library routines dominate? | 2028 ;; FIXME: is it OK to make the library routines dominate? |
2029 ;;(not (idlwave-rinfo-assq name 'pro class | 2029 ;;(not (idlwave-rinfo-assq name 'pro class |
2030 ;; idlwave-library-routines)) | 2030 ;; idlwave-library-routines)) |
2031 ) | 2031 ) |
2032 (setq entry (list name 'pro class | 2032 (setq entry (list name 'pro class |
2033 (cons 'compiled | |
2034 (if file | |
2035 (list | |
2036 (file-name-nondirectory file) | |
2037 (idlwave-sintern-dir | |
2038 (file-name-directory file))))) | |
2039 cs (cons nil keys))) | |
2040 (if file | |
2041 (push entry idlwave-compiled-routines) | |
2042 (push entry idlwave-unresolved-routines))) | |
2043 | |
2044 ((and (string= type "FUN") | |
2045 ;; FIXME: is it OK to make the buffer routines dominate? | |
2046 (or t (not file) | |
2047 (not (idlwave-rinfo-assq name 'fun class | |
2048 idlwave-buffer-routines))) | |
2049 ;; FIXME: is it OK to make the library routines dominate? | |
2050 ;; (not (idlwave-rinfo-assq name 'fun class | |
2051 ;; idlwave-library-routines)) | |
2052 ) | |
2053 (setq entry (list name 'fun class | |
2054 (cons 'compiled | 2033 (cons 'compiled |
2055 (if file | 2034 (if file |
2056 (list | 2035 (list |
2057 (file-name-nondirectory file) | 2036 (file-name-nondirectory file) |
2058 (idlwave-sintern-dir | 2037 (idlwave-sintern-dir |
2038 (file-name-directory file))))) | |
2039 cs (cons nil keys))) | |
2040 (if file | |
2041 (push entry idlwave-compiled-routines) | |
2042 (push entry idlwave-unresolved-routines))) | |
2043 | |
2044 ((and (string= type "FUN") | |
2045 ;; FIXME: is it OK to make the buffer routines dominate? | |
2046 (or t (not file) | |
2047 (not (idlwave-rinfo-assq name 'fun class | |
2048 idlwave-buffer-routines))) | |
2049 ;; FIXME: is it OK to make the library routines dominate? | |
2050 ;; (not (idlwave-rinfo-assq name 'fun class | |
2051 ;; idlwave-library-routines)) | |
2052 ) | |
2053 (setq entry (list name 'fun class | |
2054 (cons 'compiled | |
2055 (if file | |
2056 (list | |
2057 (file-name-nondirectory file) | |
2058 (idlwave-sintern-dir | |
2059 (file-name-directory file))))) | 2059 (file-name-directory file))))) |
2060 cs (cons nil keys))) | 2060 cs (cons nil keys))) |
2061 (if file | 2061 (if file |
2062 (push entry idlwave-compiled-routines) | 2062 (push entry idlwave-compiled-routines) |
2063 (push entry idlwave-unresolved-routines)))))) | 2063 (push entry idlwave-unresolved-routines)))))) |
2070 Change the default directory for the process buffer to concur." | 2070 Change the default directory for the process buffer to concur." |
2071 (save-excursion | 2071 (save-excursion |
2072 (set-buffer (idlwave-shell-buffer)) | 2072 (set-buffer (idlwave-shell-buffer)) |
2073 (if (string-match ",___cur[\n\r]\\(\\S-*\\) *[\n\r]" | 2073 (if (string-match ",___cur[\n\r]\\(\\S-*\\) *[\n\r]" |
2074 idlwave-shell-command-output) | 2074 idlwave-shell-command-output) |
2075 (let ((dir (substring idlwave-shell-command-output | 2075 (let ((dir (substring idlwave-shell-command-output |
2076 (match-beginning 1) (match-end 1)))) | 2076 (match-beginning 1) (match-end 1)))) |
2077 ; (message "Setting Emacs working dir to %s" dir) | 2077 ; (message "Setting Emacs working dir to %s" dir) |
2078 (setq idlwave-shell-default-directory dir) | 2078 (setq idlwave-shell-default-directory dir) |
2079 (setq default-directory (file-name-as-directory dir)))))) | 2079 (setq default-directory (file-name-as-directory dir)))))) |
2080 | 2080 |
2084 (let ((bos (save-excursion (idlwave-start-of-substatement 'pre) (point))) | 2084 (let ((bos (save-excursion (idlwave-start-of-substatement 'pre) (point))) |
2085 (bol (save-excursion (forward-line 0) (point))) | 2085 (bol (save-excursion (forward-line 0) (point))) |
2086 expression) | 2086 expression) |
2087 (save-excursion | 2087 (save-excursion |
2088 (goto-char apos) | 2088 (goto-char apos) |
2089 (setq expression (buffer-substring | 2089 (setq expression (buffer-substring |
2090 (catch 'exit | 2090 (catch 'exit |
2091 (while t | 2091 (while t |
2092 (if (not (re-search-backward | 2092 (if (not (re-search-backward |
2093 "[^][.A-Za-z0-9_() ]" bos t)) | 2093 "[^][.A-Za-z0-9_() ]" bos t)) |
2094 (throw 'exit bos)) ;ran into bos | 2094 (throw 'exit bos)) ;ran into bos |
2095 (if (not (idlwave-is-pointer-dereference bol)) | 2095 (if (not (idlwave-is-pointer-dereference bol)) |
2096 (throw 'exit (1+ (point)))))) | 2096 (throw 'exit (1+ (point)))))) |
2097 apos))) | 2097 apos))) |
2115 (not (string-match (concat match match "\\s-*^[\n\r]+" | 2115 (not (string-match (concat match match "\\s-*^[\n\r]+" |
2116 "% Syntax error") | 2116 "% Syntax error") |
2117 idlwave-shell-command-output)) | 2117 idlwave-shell-command-output)) |
2118 (string-match (concat match "\\([A-Za-z_0-9]+\\)") | 2118 (string-match (concat match "\\([A-Za-z_0-9]+\\)") |
2119 idlwave-shell-command-output)) | 2119 idlwave-shell-command-output)) |
2120 (setq idlwave-shell-get-object-class | 2120 (setq idlwave-shell-get-object-class |
2121 (match-string 1 idlwave-shell-command-output))))) | 2121 (match-string 1 idlwave-shell-command-output))))) |
2122 | 2122 |
2123 (defvar idlwave-sint-sysvars nil) | 2123 (defvar idlwave-sint-sysvars nil) |
2124 (idlwave-new-sintern-type 'execcomm) | 2124 (idlwave-new-sintern-type 'execcomm) |
2125 | 2125 |
2129 in strings. Otherwise, calls `idlwave-complete' to complete modules and | 2129 in strings. Otherwise, calls `idlwave-complete' to complete modules and |
2130 keywords." | 2130 keywords." |
2131 (interactive "P") | 2131 (interactive "P") |
2132 (let (exec-cmd) | 2132 (let (exec-cmd) |
2133 (cond | 2133 (cond |
2134 ((and | 2134 ((and |
2135 (setq exec-cmd (idlwave-shell-executive-command)) | 2135 (setq exec-cmd (idlwave-shell-executive-command)) |
2136 (cdr exec-cmd) | 2136 (cdr exec-cmd) |
2137 (member (upcase (cdr exec-cmd)) | 2137 (member (upcase (cdr exec-cmd)) |
2138 '(".R" ".RU" ".RUN" ".RN" ".RNE" ".RNEW" | 2138 '(".R" ".RU" ".RUN" ".RN" ".RNE" ".RNEW" |
2139 ".COM" ".COMP" ".COMPI" ".COMPIL" ".COMPILE"))) | 2139 ".COM" ".COMP" ".COMPI" ".COMPIL" ".COMPILE"))) |
2140 ;; We are in a command line with an executive command | 2140 ;; We are in a command line with an executive command |
2141 (idlwave-shell-complete-filename)) | 2141 (idlwave-shell-complete-filename)) |
2142 | 2142 |
2143 ((car-safe exec-cmd) | 2143 ((car-safe exec-cmd) |
2144 (setq idlwave-completion-help-info | 2144 (setq idlwave-completion-help-info |
2145 '(idlwave-shell-complete-execcomm-help)) | 2145 '(idlwave-shell-complete-execcomm-help)) |
2146 (idlwave-complete-in-buffer 'execcomm 'execcomm | 2146 (idlwave-complete-in-buffer 'execcomm 'execcomm |
2147 idlwave-executive-commands-alist nil | 2147 idlwave-executive-commands-alist nil |
2148 "Select an executive command" | 2148 "Select an executive command" |
2149 "system variable")) | 2149 "system variable")) |
2158 (save-excursion | 2158 (save-excursion |
2159 (beginning-of-line) | 2159 (beginning-of-line) |
2160 (let ((case-fold-search t)) | 2160 (let ((case-fold-search t)) |
2161 (not (looking-at ".*obj_new"))))) | 2161 (not (looking-at ".*obj_new"))))) |
2162 (idlwave-shell-complete-filename)) | 2162 (idlwave-shell-complete-filename)) |
2163 | 2163 |
2164 (t | 2164 (t |
2165 ;; Default completion of modules and keywords | 2165 ;; Default completion of modules and keywords |
2166 (idlwave-complete arg))))) | 2166 (idlwave-complete arg))))) |
2167 | 2167 |
2168 ;; Get rid of opaque dynamic variable passing of link? | 2168 ;; Get rid of opaque dynamic variable passing of link? |
2180 (defun idlwave-shell-complete-filename (&optional arg) | 2180 (defun idlwave-shell-complete-filename (&optional arg) |
2181 "Complete a file name at point if after a file name. | 2181 "Complete a file name at point if after a file name. |
2182 We assume that we are after a file name when completing one of the | 2182 We assume that we are after a file name when completing one of the |
2183 args of an executive .run, .rnew or .compile." | 2183 args of an executive .run, .rnew or .compile." |
2184 ;; CWD might have changed, resync, to set default directory | 2184 ;; CWD might have changed, resync, to set default directory |
2185 (idlwave-shell-resync-dirs) | 2185 (idlwave-shell-resync-dirs) |
2186 (let ((comint-file-name-chars idlwave-shell-file-name-chars)) | 2186 (let ((comint-file-name-chars idlwave-shell-file-name-chars)) |
2187 (comint-dynamic-complete-as-filename))) | 2187 (comint-dynamic-complete-as-filename))) |
2188 | 2188 |
2189 (defun idlwave-shell-executive-command () | 2189 (defun idlwave-shell-executive-command () |
2190 "Return the name of the current executive command, if any." | 2190 "Return the name of the current executive command, if any." |
2221 ;; Debugging Commands ------------------------------------------------------ | 2221 ;; Debugging Commands ------------------------------------------------------ |
2222 (defvar idlwave-shell-electric-debug-mode) ; defined by easy-mmode | 2222 (defvar idlwave-shell-electric-debug-mode) ; defined by easy-mmode |
2223 | 2223 |
2224 (defun idlwave-shell-redisplay (&optional hide) | 2224 (defun idlwave-shell-redisplay (&optional hide) |
2225 "Tries to resync the display with where execution has stopped. | 2225 "Tries to resync the display with where execution has stopped. |
2226 Issues a \"help,/trace\" command followed by a call to | 2226 Issues a \"help,/trace\" command followed by a call to |
2227 `idlwave-shell-display-line'. Also updates the breakpoint | 2227 `idlwave-shell-display-line'. Also updates the breakpoint |
2228 overlays." | 2228 overlays." |
2229 (interactive) | 2229 (interactive) |
2230 (setq idlwave-shell-calling-stack-index 0) | 2230 (setq idlwave-shell-calling-stack-index 0) |
2231 (idlwave-shell-send-command | 2231 (idlwave-shell-send-command |
2234 (idlwave-shell-pc-frame)) | 2234 (idlwave-shell-pc-frame)) |
2235 hide) | 2235 hide) |
2236 (idlwave-shell-bp-query)) | 2236 (idlwave-shell-bp-query)) |
2237 | 2237 |
2238 (defun idlwave-shell-display-level-in-calling-stack (&optional hide) | 2238 (defun idlwave-shell-display-level-in-calling-stack (&optional hide) |
2239 (idlwave-shell-send-command | 2239 (idlwave-shell-send-command |
2240 "help,/trace" | 2240 "help,/trace" |
2241 `(progn | 2241 `(progn |
2242 ;; scanning for the state will reset the stack level - restore it | 2242 ;; scanning for the state will reset the stack level - restore it |
2243 (setq idlwave-shell-calling-stack-index | 2243 (setq idlwave-shell-calling-stack-index |
2244 ,idlwave-shell-calling-stack-index) | 2244 ,idlwave-shell-calling-stack-index) |
2265 ((< idlwave-shell-calling-stack-index nmin) | 2265 ((< idlwave-shell-calling-stack-index nmin) |
2266 (ding) | 2266 (ding) |
2267 (setq idlwave-shell-calling-stack-index nmin | 2267 (setq idlwave-shell-calling-stack-index nmin |
2268 message (format "%d is the current calling stack level - can't go further down" | 2268 message (format "%d is the current calling stack level - can't go further down" |
2269 (- nmin))))) | 2269 (- nmin))))) |
2270 (setq idlwave-shell-calling-stack-routine | 2270 (setq idlwave-shell-calling-stack-routine |
2271 (nth 2 (nth idlwave-shell-calling-stack-index stack))) | 2271 (nth 2 (nth idlwave-shell-calling-stack-index stack))) |
2272 | 2272 |
2273 ;; only edebug if in that mode already | 2273 ;; only edebug if in that mode already |
2274 (idlwave-shell-display-line | 2274 (idlwave-shell-display-line |
2275 (nth idlwave-shell-calling-stack-index stack) nil | 2275 (nth idlwave-shell-calling-stack-index stack) nil |
2276 (unless idlwave-shell-electric-debug-mode 'no-debug)) | 2276 (unless idlwave-shell-electric-debug-mode 'no-debug)) |
2277 (message (or message | 2277 (message (or message |
2278 (format "In routine %s (stack level %d)" | 2278 (format "In routine %s (stack level %d)" |
2279 idlwave-shell-calling-stack-routine | 2279 idlwave-shell-calling-stack-routine |
2280 (- idlwave-shell-calling-stack-index)))))) | 2280 (- idlwave-shell-calling-stack-index)))))) |
2281 | 2281 |
2282 (defun idlwave-shell-stack-up () | 2282 (defun idlwave-shell-stack-up () |
2303 (goto-line (nth 1 frame))))) | 2303 (goto-line (nth 1 frame))))) |
2304 | 2304 |
2305 (defun idlwave-shell-pc-frame () | 2305 (defun idlwave-shell-pc-frame () |
2306 "Returns the frame for IDL execution." | 2306 "Returns the frame for IDL execution." |
2307 (and idlwave-shell-halt-frame | 2307 (and idlwave-shell-halt-frame |
2308 (list (nth 0 idlwave-shell-halt-frame) | 2308 (list (nth 0 idlwave-shell-halt-frame) |
2309 (nth 1 idlwave-shell-halt-frame) | 2309 (nth 1 idlwave-shell-halt-frame) |
2310 (nth 2 idlwave-shell-halt-frame)))) | 2310 (nth 2 idlwave-shell-halt-frame)))) |
2311 | 2311 |
2312 (defun idlwave-shell-valid-frame (frame) | 2312 (defun idlwave-shell-valid-frame (frame) |
2313 "Check that frame is for an existing file." | 2313 "Check that frame is for an existing file." |
2321 FRAME is nil then remove overlay. If COL is set, move point to that | 2321 FRAME is nil then remove overlay. If COL is set, move point to that |
2322 column in the line. If NO-DEBUG is non-nil, do *not* toggle the electric | 2322 column in the line. If NO-DEBUG is non-nil, do *not* toggle the electric |
2323 debug mode." | 2323 debug mode." |
2324 (if (not frame) | 2324 (if (not frame) |
2325 ;; Remove stop-line overlay from old position | 2325 ;; Remove stop-line overlay from old position |
2326 (progn | 2326 (progn |
2327 (setq overlay-arrow-string nil) | 2327 (setq overlay-arrow-string nil) |
2328 (setq idlwave-shell-mode-line-info nil) | 2328 (setq idlwave-shell-mode-line-info nil) |
2329 (setq idlwave-shell-is-stopped nil) | 2329 (setq idlwave-shell-is-stopped nil) |
2330 (if idlwave-shell-stop-line-overlay | 2330 (if idlwave-shell-stop-line-overlay |
2331 (delete-overlay idlwave-shell-stop-line-overlay)) | 2331 (delete-overlay idlwave-shell-stop-line-overlay)) |
2338 ;; have never encountered this one. | 2338 ;; have never encountered this one. |
2339 (error (concat "Invalid frame - unable to access file: " (car frame))) | 2339 (error (concat "Invalid frame - unable to access file: " (car frame))) |
2340 ;;; | 2340 ;;; |
2341 ;;; buffer : the buffer to display a line in. | 2341 ;;; buffer : the buffer to display a line in. |
2342 ;;; select-shell: current buffer is the shell. | 2342 ;;; select-shell: current buffer is the shell. |
2343 ;;; | 2343 ;;; |
2344 (setq idlwave-shell-mode-line-info | 2344 (setq idlwave-shell-mode-line-info |
2345 (if (nth 2 frame) | 2345 (if (nth 2 frame) |
2346 (format "[%d:%s]" | 2346 (format "[%d:%s]" |
2347 (- idlwave-shell-calling-stack-index) | 2347 (- idlwave-shell-calling-stack-index) |
2348 (nth 2 frame)))) | 2348 (nth 2 frame)))) |
2349 (let* ((buffer (idlwave-find-file-noselect (car frame) 'shell)) | 2349 (let* ((buffer (idlwave-find-file-noselect (car frame) 'shell)) |
2350 (select-shell (equal (buffer-name) (idlwave-shell-buffer))) | 2350 (select-shell (equal (buffer-name) (idlwave-shell-buffer))) |
2351 window pos electric) | 2351 window pos electric) |
2365 (widen) | 2365 (widen) |
2366 (goto-line (nth 1 frame)) | 2366 (goto-line (nth 1 frame)) |
2367 (forward-line 0) | 2367 (forward-line 0) |
2368 (setq pos (point)) | 2368 (setq pos (point)) |
2369 (setq idlwave-shell-is-stopped t) | 2369 (setq idlwave-shell-is-stopped t) |
2370 | 2370 |
2371 (if idlwave-shell-stop-line-overlay | 2371 (if idlwave-shell-stop-line-overlay |
2372 ;; Move overlay | 2372 ;; Move overlay |
2373 (move-overlay idlwave-shell-stop-line-overlay | 2373 (move-overlay idlwave-shell-stop-line-overlay |
2374 (point) (save-excursion (end-of-line) (point)) | 2374 (point) (save-excursion (end-of-line) (point)) |
2375 (current-buffer)) | 2375 (current-buffer)) |
2387 (goto-char pos))) | 2387 (goto-char pos))) |
2388 | 2388 |
2389 ;; If we have the column of the error, move the cursor there. | 2389 ;; If we have the column of the error, move the cursor there. |
2390 (if col (move-to-column col)) | 2390 (if col (move-to-column col)) |
2391 (setq pos (point)) | 2391 (setq pos (point)) |
2392 | 2392 |
2393 ;; Enter electric debug mode, if not prohibited and not in | 2393 ;; Enter electric debug mode, if not prohibited and not in |
2394 ;; it already | 2394 ;; it already |
2395 (when (and (or | 2395 (when (and (or |
2396 (eq idlwave-shell-automatic-electric-debug t) | 2396 (eq idlwave-shell-automatic-electric-debug t) |
2397 (and | 2397 (and |
2398 (eq idlwave-shell-automatic-electric-debug 'breakpoint) | 2398 (eq idlwave-shell-automatic-electric-debug 'breakpoint) |
2399 (not (eq idlwave-shell-current-state 'error)))) | 2399 (not (eq idlwave-shell-current-state 'error)))) |
2400 (not no-debug) | 2400 (not no-debug) |
2401 (not idlwave-shell-suppress-electric-debug) | 2401 (not idlwave-shell-suppress-electric-debug) |
2402 (not idlwave-shell-electric-debug-mode)) | 2402 (not idlwave-shell-electric-debug-mode)) |
2403 (idlwave-shell-electric-debug-mode) | 2403 (idlwave-shell-electric-debug-mode) |
2404 (setq electric t))) | 2404 (setq electric t))) |
2405 | 2405 |
2406 ;; Make sure pos is really displayed in the window. | 2406 ;; Make sure pos is really displayed in the window. |
2407 (set-window-point window pos) | 2407 (set-window-point window pos) |
2408 | 2408 |
2409 ;; If we came from the shell, go back there. Otherwise select | 2409 ;; If we came from the shell, go back there. Otherwise select |
2410 ;; the window where the error is displayed. | 2410 ;; the window where the error is displayed. |
2411 (if (or (and idlwave-shell-electric-zap-to-file electric) | 2411 (if (or (and idlwave-shell-electric-zap-to-file electric) |
2412 (and (equal (buffer-name) (idlwave-shell-buffer)) | 2412 (and (equal (buffer-name) (idlwave-shell-buffer)) |
2413 (not select-shell))) | 2413 (not select-shell))) |
2414 (select-window window)))))) | 2414 (select-window window)))))) |
2415 | 2415 |
2416 | 2416 |
2417 (defun idlwave-shell-step (arg) | 2417 (defun idlwave-shell-step (arg) |
2418 "Step one source line. If given prefix argument ARG, step ARG source lines." | 2418 "Step one source line. If given prefix argument ARG, step ARG source lines." |
2419 (interactive "p") | 2419 (interactive "p") |
2420 (or (not arg) (< arg 1) | 2420 (or (not arg) (< arg 1) |
2421 (setq arg 1)) | 2421 (setq arg 1)) |
2422 (idlwave-shell-send-command | 2422 (idlwave-shell-send-command |
2423 (concat ".s " (if (integerp arg) (int-to-string arg) arg)) | 2423 (concat ".s " (if (integerp arg) (int-to-string arg) arg)) |
2424 nil (if (idlwave-shell-hide-p 'debug) 'mostly) nil t)) | 2424 nil (if (idlwave-shell-hide-p 'debug) 'mostly) nil t)) |
2425 | 2425 |
2426 (defun idlwave-shell-stepover (arg) | 2426 (defun idlwave-shell-stepover (arg) |
2427 "Stepover one source line. | 2427 "Stepover one source line. |
2428 If given prefix argument ARG, step ARG source lines. | 2428 If given prefix argument ARG, step ARG source lines. |
2429 Uses IDL's stepover executive command which does not enter called functions." | 2429 Uses IDL's stepover executive command which does not enter called functions." |
2430 (interactive "p") | 2430 (interactive "p") |
2431 (or (not arg) (< arg 1) | 2431 (or (not arg) (< arg 1) |
2432 (setq arg 1)) | 2432 (setq arg 1)) |
2433 (idlwave-shell-send-command | 2433 (idlwave-shell-send-command |
2434 (concat ".so " (if (integerp arg) (int-to-string arg) arg)) | 2434 (concat ".so " (if (integerp arg) (int-to-string arg) arg)) |
2435 nil (if (idlwave-shell-hide-p 'debug) 'mostly) nil t)) | 2435 nil (if (idlwave-shell-hide-p 'debug) 'mostly) nil t)) |
2436 | 2436 |
2437 (defun idlwave-shell-break-here (&optional count cmd condition no-show) | 2437 (defun idlwave-shell-break-here (&optional count cmd condition no-show) |
2438 "Set breakpoint at current line. | 2438 "Set breakpoint at current line. |
2439 | 2439 |
2440 If Count is nil then an ordinary breakpoint is set. We treat a count | 2440 If Count is nil then an ordinary breakpoint is set. We treat a count |
2441 of 1 as a temporary breakpoint using the ONCE keyword. Counts greater | 2441 of 1 as a temporary breakpoint using the ONCE keyword. Counts greater |
2442 than 1 use the IDL AFTER=count keyword to break only after reaching | 2442 than 1 use the IDL AFTER=count keyword to break only after reaching |
2443 the statement count times. | 2443 the statement count times. |
2444 | 2444 |
2445 Optional argument CMD is a list or function to evaluate upon reaching | 2445 Optional argument CMD is a list or function to evaluate upon reaching |
2446 the breakpoint." | 2446 the breakpoint." |
2447 | 2447 |
2448 (interactive "P") | 2448 (interactive "P") |
2449 (when (listp count) | 2449 (when (listp count) |
2450 (if (equal (car count) 4) | 2450 (if (equal (car count) 4) |
2451 (setq condition (read-string "Break Condition: "))) | 2451 (setq condition (read-string "Break Condition: "))) |
2452 (setq count nil)) | 2452 (setq count nil)) |
2453 (idlwave-shell-set-bp | 2453 (idlwave-shell-set-bp |
2454 ;; Create breakpoint | 2454 ;; Create breakpoint |
2455 (idlwave-shell-bp (idlwave-shell-current-frame) | 2455 (idlwave-shell-bp (idlwave-shell-current-frame) |
2468 idlwave-shell-command-output)) | 2468 idlwave-shell-command-output)) |
2469 ;; Offer to recompile | 2469 ;; Offer to recompile |
2470 (progn | 2470 (progn |
2471 (if (progn | 2471 (if (progn |
2472 (beep) | 2472 (beep) |
2473 (y-or-n-p | 2473 (y-or-n-p |
2474 (concat "Okay to recompile file " | 2474 (concat "Okay to recompile file " |
2475 (idlwave-shell-bp-get bp 'file) " "))) | 2475 (idlwave-shell-bp-get bp 'file) " "))) |
2476 ;; Recompile | 2476 ;; Recompile |
2477 (progn | 2477 (progn |
2478 ;; Clean up before retrying | 2478 ;; Clean up before retrying |
2479 (idlwave-shell-command-failure) | 2479 (idlwave-shell-command-failure) |
2480 (idlwave-shell-send-command | 2480 (idlwave-shell-send-command |
2481 (concat ".run " (idlwave-shell-bp-get bp 'file)) nil | 2481 (concat ".run " (idlwave-shell-bp-get bp 'file)) nil |
2482 (if (idlwave-shell-hide-p 'run) 'mostly) nil t) | 2482 (if (idlwave-shell-hide-p 'run) 'mostly) nil t) |
2483 ;; Try setting breakpoint again | 2483 ;; Try setting breakpoint again |
2484 (idlwave-shell-set-bp bp)) | 2484 (idlwave-shell-set-bp bp)) |
2485 (beep) | 2485 (beep) |
2486 (message "Unable to set breakpoint.") | 2486 (message "Unable to set breakpoint.") |
2500 (setq idlwave-shell-pending-commands nil)) | 2500 (setq idlwave-shell-pending-commands nil)) |
2501 | 2501 |
2502 (defun idlwave-shell-cont (&optional no-show) | 2502 (defun idlwave-shell-cont (&optional no-show) |
2503 "Continue executing." | 2503 "Continue executing." |
2504 (interactive) | 2504 (interactive) |
2505 (idlwave-shell-send-command ".c" (unless no-show | 2505 (idlwave-shell-send-command ".c" (unless no-show |
2506 '(idlwave-shell-redisplay 'hide)) | 2506 '(idlwave-shell-redisplay 'hide)) |
2507 (if (idlwave-shell-hide-p 'debug) 'mostly) | 2507 (if (idlwave-shell-hide-p 'debug) 'mostly) |
2508 nil t)) | 2508 nil t)) |
2509 | 2509 |
2510 (defun idlwave-shell-go () | 2510 (defun idlwave-shell-go () |
2511 "Run .GO. This starts the main program of the last compiled file." | 2511 "Run .GO. This starts the main program of the last compiled file." |
2512 (interactive) | 2512 (interactive) |
2583 (disabled (idlwave-shell-bp-get bp 'disabled))) | 2583 (disabled (idlwave-shell-bp-get bp 'disabled))) |
2584 (cond ((eq force 'disable) (setq disabled nil)) | 2584 (cond ((eq force 'disable) (setq disabled nil)) |
2585 ((eq force 'enable) (setq disabled t))) | 2585 ((eq force 'enable) (setq disabled t))) |
2586 (when bp | 2586 (when bp |
2587 (setf (nth 3 (cdr (cdr bp))) (not disabled)) | 2587 (setf (nth 3 (cdr (cdr bp))) (not disabled)) |
2588 (idlwave-shell-send-command | 2588 (idlwave-shell-send-command |
2589 (concat "breakpoint," | 2589 (concat "breakpoint," |
2590 (if disabled "/enable," "/disable,") | 2590 (if disabled "/enable," "/disable,") |
2591 (int-to-string (idlwave-shell-bp-get bp))) | 2591 (int-to-string (idlwave-shell-bp-get bp))) |
2592 nil (idlwave-shell-hide-p 'breakpoint) nil t) | 2592 nil (idlwave-shell-hide-p 'breakpoint) nil t) |
2593 (unless no-update (idlwave-shell-bp-query))))) | 2593 (unless no-update (idlwave-shell-bp-query))))) |
2597 If ENABLE is non-nil, enable them instead." | 2597 If ENABLE is non-nil, enable them instead." |
2598 (let ((bpl (or bpl idlwave-shell-bp-alist)) disabled modified) | 2598 (let ((bpl (or bpl idlwave-shell-bp-alist)) disabled modified) |
2599 (while bpl | 2599 (while bpl |
2600 (setq disabled (idlwave-shell-bp-get (car bpl) 'disabled)) | 2600 (setq disabled (idlwave-shell-bp-get (car bpl) 'disabled)) |
2601 (when (idlwave-xor (not disabled) (eq enable 'enable)) | 2601 (when (idlwave-xor (not disabled) (eq enable 'enable)) |
2602 (idlwave-shell-toggle-enable-current-bp | 2602 (idlwave-shell-toggle-enable-current-bp |
2603 (car bpl) (if (eq enable 'enable) 'enable 'disable) no-update) | 2603 (car bpl) (if (eq enable 'enable) 'enable 'disable) no-update) |
2604 (push (car bpl) modified)) | 2604 (push (car bpl) modified)) |
2605 (setq bpl (cdr bpl))) | 2605 (setq bpl (cdr bpl))) |
2606 (unless no-update (idlwave-shell-bp-query)) | 2606 (unless no-update (idlwave-shell-bp-query)) |
2607 modified)) | 2607 modified)) |
2608 | 2608 |
2609 (defun idlwave-shell-to-here () | 2609 (defun idlwave-shell-to-here () |
2610 "Set a breakpoint with count 1 then continue." | 2610 "Set a breakpoint with count 1 then continue." |
2611 (interactive) | 2611 (interactive) |
2612 (let ((disabled (idlwave-shell-enable-all-bp 'disable 'no-update))) | 2612 (let ((disabled (idlwave-shell-enable-all-bp 'disable 'no-update))) |
2613 (idlwave-shell-break-here 1 nil nil 'no-show) | 2613 (idlwave-shell-break-here 1 nil nil 'no-show) |
2641 'hide))) | 2641 'hide))) |
2642 | 2642 |
2643 (defun idlwave-shell-set-bp-in-module (module) | 2643 (defun idlwave-shell-set-bp-in-module (module) |
2644 "Set breakpoint in module. Assumes that `idlwave-shell-sources-alist' | 2644 "Set breakpoint in module. Assumes that `idlwave-shell-sources-alist' |
2645 contains an entry for that module." | 2645 contains an entry for that module." |
2646 (let ((source-file (car-safe | 2646 (let ((source-file (car-safe |
2647 (cdr-safe | 2647 (cdr-safe |
2648 (assoc (upcase module) | 2648 (assoc (upcase module) |
2649 idlwave-shell-sources-alist)))) | 2649 idlwave-shell-sources-alist)))) |
2650 buf) | 2650 buf) |
2651 (if (or (not source-file) | 2651 (if (or (not source-file) |
2660 (save-excursion | 2660 (save-excursion |
2661 (set-buffer buf) | 2661 (set-buffer buf) |
2662 (save-excursion | 2662 (save-excursion |
2663 (goto-char (point-min)) | 2663 (goto-char (point-min)) |
2664 (let ((case-fold-search t)) | 2664 (let ((case-fold-search t)) |
2665 (if (re-search-forward | 2665 (if (re-search-forward |
2666 (concat "^[ \t]*\\(pro\\|function\\)[ \t]+" | 2666 (concat "^[ \t]*\\(pro\\|function\\)[ \t]+" |
2667 (downcase module) | 2667 (downcase module) |
2668 "[ \t\n,]") nil t) | 2668 "[ \t\n,]") nil t) |
2669 (progn | 2669 (progn |
2670 (goto-char (match-beginning 1)) | 2670 (goto-char (match-beginning 1)) |
2702 | 2702 |
2703 (defun idlwave-shell-out () | 2703 (defun idlwave-shell-out () |
2704 "Attempt to run until this procedure exits. | 2704 "Attempt to run until this procedure exits. |
2705 Runs to the last statement and then steps 1 statement. Use the .out command." | 2705 Runs to the last statement and then steps 1 statement. Use the .out command." |
2706 (interactive) | 2706 (interactive) |
2707 (idlwave-shell-send-command ".o" nil | 2707 (idlwave-shell-send-command ".o" nil |
2708 (if (idlwave-shell-hide-p 'debug) 'mostly) | 2708 (if (idlwave-shell-hide-p 'debug) 'mostly) |
2709 nil t)) | 2709 nil t)) |
2710 | 2710 |
2711 (defun idlwave-shell-goto-previous-bp () | 2711 (defun idlwave-shell-goto-previous-bp () |
2712 "Move to the previous breakpoint in the buffer." | 2712 "Move to the previous breakpoint in the buffer." |
2749 `(lambda (event) | 2749 `(lambda (event) |
2750 "Expansion function for expression examination." | 2750 "Expansion function for expression examination." |
2751 (interactive "e") | 2751 (interactive "e") |
2752 (let ((transient-mark-mode t) | 2752 (let ((transient-mark-mode t) |
2753 (zmacs-regions t) | 2753 (zmacs-regions t) |
2754 (tracker (if (featurep 'xemacs) | 2754 (tracker (if (featurep 'xemacs) |
2755 (if (fboundp 'default-mouse-track-event-is-with-button) | 2755 (if (fboundp 'default-mouse-track-event-is-with-button) |
2756 'idlwave-xemacs-hack-mouse-track | 2756 'idlwave-xemacs-hack-mouse-track |
2757 'mouse-track) | 2757 'mouse-track) |
2758 'mouse-drag-region))) | 2758 'mouse-drag-region))) |
2759 (funcall tracker event) | 2759 (funcall tracker event) |
2767 | 2767 |
2768 (defun idlwave-xemacs-hack-mouse-track (event) | 2768 (defun idlwave-xemacs-hack-mouse-track (event) |
2769 (let ((oldfunc (symbol-function 'default-mouse-track-event-is-with-button))) | 2769 (let ((oldfunc (symbol-function 'default-mouse-track-event-is-with-button))) |
2770 (unwind-protect | 2770 (unwind-protect |
2771 (progn | 2771 (progn |
2772 (fset 'default-mouse-track-event-is-with-button | 2772 (fset 'default-mouse-track-event-is-with-button |
2773 'idlwave-default-mouse-track-event-is-with-button) | 2773 'idlwave-default-mouse-track-event-is-with-button) |
2774 (mouse-track event)) | 2774 (mouse-track event)) |
2775 (fset 'default-mouse-track-event-is-with-button oldfunc)))) | 2775 (fset 'default-mouse-track-event-is-with-button oldfunc)))) |
2776 ;;; End terrible hack section | 2776 ;;; End terrible hack section |
2777 | 2777 |
2799 (defvar idlwave-shell-examine-label nil | 2799 (defvar idlwave-shell-examine-label nil |
2800 "Label to include with examine text if in a separate buffer.") | 2800 "Label to include with examine text if in a separate buffer.") |
2801 (defvar idlwave-shell-examine-completion-list nil) | 2801 (defvar idlwave-shell-examine-completion-list nil) |
2802 | 2802 |
2803 (defun idlwave-shell-print (arg &optional help ev complete-help-type) | 2803 (defun idlwave-shell-print (arg &optional help ev complete-help-type) |
2804 "Print current expression. | 2804 "Print current expression. |
2805 | 2805 |
2806 With HELP non-nil, show help on expression. If HELP is a string, | 2806 With HELP non-nil, show help on expression. If HELP is a string, |
2807 the expression will be put in place of ___, e.g.: | 2807 the expression will be put in place of ___, e.g.: |
2808 | 2808 |
2809 print,size(___,/DIMENSIONS) | 2809 print,size(___,/DIMENSIONS) |
2832 idlw-shell-examine-alist via mini-buffer shortcut key." | 2832 idlw-shell-examine-alist via mini-buffer shortcut key." |
2833 (interactive "P") | 2833 (interactive "P") |
2834 (save-excursion | 2834 (save-excursion |
2835 (let* ((process (get-buffer-process (current-buffer))) | 2835 (let* ((process (get-buffer-process (current-buffer))) |
2836 (process-mark (if process (process-mark process))) | 2836 (process-mark (if process (process-mark process))) |
2837 (stack-label | 2837 (stack-label |
2838 (if (and (integerp idlwave-shell-calling-stack-index) | 2838 (if (and (integerp idlwave-shell-calling-stack-index) |
2839 (> idlwave-shell-calling-stack-index 0)) | 2839 (> idlwave-shell-calling-stack-index 0)) |
2840 (format " [-%d:%s]" | 2840 (format " [-%d:%s]" |
2841 idlwave-shell-calling-stack-index | 2841 idlwave-shell-calling-stack-index |
2842 idlwave-shell-calling-stack-routine))) | 2842 idlwave-shell-calling-stack-routine))) |
2843 expr beg end cmd examine-hook) | 2843 expr beg end cmd examine-hook) |
2844 (cond | 2844 (cond |
2845 ((equal arg '(16)) | 2845 ((equal arg '(16)) |
2846 (setq expr (read-string "Expression: "))) | 2846 (setq expr (read-string "Expression: "))) |
2866 (forward-sexp) | 2866 (forward-sexp) |
2867 (while (looking-at "\\>[[(]\\|\\.") | 2867 (while (looking-at "\\>[[(]\\|\\.") |
2868 ;; an array | 2868 ;; an array |
2869 (forward-sexp)) | 2869 (forward-sexp)) |
2870 (setq end (point))))) | 2870 (setq end (point))))) |
2871 | 2871 |
2872 ;; Get expression, but first move the begin mark if a | 2872 ;; Get expression, but first move the begin mark if a |
2873 ;; process-mark is inside the region, to keep the overlay from | 2873 ;; process-mark is inside the region, to keep the overlay from |
2874 ;; wandering in the Shell. | 2874 ;; wandering in the Shell. |
2875 (when (and beg end) | 2875 (when (and beg end) |
2876 (if (and process-mark (> process-mark beg) (< process-mark end)) | 2876 (if (and process-mark (> process-mark beg) (< process-mark end)) |
2877 (setq beg (marker-position process-mark))) | 2877 (setq beg (marker-position process-mark))) |
2878 (setq expr (buffer-substring beg end))) | 2878 (setq expr (buffer-substring beg end))) |
2879 | 2879 |
2880 ;; Show the overlay(s) and attach any necessary hooks and filters | 2880 ;; Show the overlay(s) and attach any necessary hooks and filters |
2881 (when (and beg end idlwave-shell-expression-overlay) | 2881 (when (and beg end idlwave-shell-expression-overlay) |
2882 (move-overlay idlwave-shell-expression-overlay beg end | 2882 (move-overlay idlwave-shell-expression-overlay beg end |
2883 (current-buffer)) | 2883 (current-buffer)) |
2884 (add-hook 'pre-command-hook | 2884 (add-hook 'pre-command-hook |
2885 'idlwave-shell-delete-expression-overlay)) | 2885 'idlwave-shell-delete-expression-overlay)) |
2886 (setq examine-hook | 2886 (setq examine-hook |
2887 (if idlwave-shell-separate-examine-output | 2887 (if idlwave-shell-separate-examine-output |
2888 'idlwave-shell-examine-display | 2888 'idlwave-shell-examine-display |
2889 'idlwave-shell-examine-highlight)) | 2889 'idlwave-shell-examine-highlight)) |
2890 (add-hook 'pre-command-hook | 2890 (add-hook 'pre-command-hook |
2891 'idlwave-shell-delete-output-overlay) | 2891 'idlwave-shell-delete-output-overlay) |
2892 | 2892 |
2893 ;; Remove empty or comment-only lines | 2893 ;; Remove empty or comment-only lines |
2894 (while (string-match "\n[ \t]*\\(;.*\\)?\r*\n" expr) | 2894 (while (string-match "\n[ \t]*\\(;.*\\)?\r*\n" expr) |
2895 (setq expr (replace-match "\n" t t expr))) | 2895 (setq expr (replace-match "\n" t t expr))) |
2896 ;; Concatenate continuation lines | 2896 ;; Concatenate continuation lines |
2897 (while (string-match "[ \t]*\\$.*\\(;.*\\)?\\(\n[ \t]*\\|$\\)" expr) | 2897 (while (string-match "[ \t]*\\$.*\\(;.*\\)?\\(\n[ \t]*\\|$\\)" expr) |
2898 (setq expr (replace-match "" t t expr))) | 2898 (setq expr (replace-match "" t t expr))) |
2899 ;; Remove final newline | 2899 ;; Remove final newline |
2900 (if (string-match "\n[ \t\r]*\\'" expr) | 2900 (if (string-match "\n[ \t\r]*\\'" expr) |
2901 (setq expr (replace-match "" t t expr))) | 2901 (setq expr (replace-match "" t t expr))) |
2902 | 2902 |
2903 (catch 'exit | 2903 (catch 'exit |
2904 ;; Pop-up or complete on the examine selection list, if appropriate | 2904 ;; Pop-up or complete on the examine selection list, if appropriate |
2905 (if (or | 2905 (if (or |
2906 complete-help-type | 2906 complete-help-type |
2907 (and ev idlwave-shell-examine-alist) | 2907 (and ev idlwave-shell-examine-alist) |
2908 (consp help)) | 2908 (consp help)) |
2909 (let ((help-cons | 2909 (let ((help-cons |
2910 (if (consp help) help | 2910 (if (consp help) help |
2911 (assoc | 2911 (assoc |
2912 ;; A cons from either a pop-up or mini-buffer completion | 2912 ;; A cons from either a pop-up or mini-buffer completion |
2913 (if complete-help-type | 2913 (if complete-help-type |
2914 (idlwave-one-key-select 'idlwave-shell-examine-alist | 2914 (idlwave-one-key-select 'idlwave-shell-examine-alist |
2915 "Examine with: " 1.5) | 2915 "Examine with: " 1.5) |
2916 ;; (idlwave-completing-read | 2916 ;; (idlwave-completing-read |
2917 ;; "Examine with: " | 2917 ;; "Examine with: " |
2918 ;; idlwave-shell-examine-alist nil nil nil | 2918 ;; idlwave-shell-examine-alist nil nil nil |
2919 ;; 'idlwave-shell-examine-completion-list | 2919 ;; 'idlwave-shell-examine-completion-list |
2920 ;; "Print") | 2920 ;; "Print") |
2921 (idlwave-popup-select | 2921 (idlwave-popup-select |
2922 ev | 2922 ev |
2923 (mapcar 'car idlwave-shell-examine-alist) | 2923 (mapcar 'car idlwave-shell-examine-alist) |
2924 "Examine with")) | 2924 "Examine with")) |
2925 idlwave-shell-examine-alist)))) | 2925 idlwave-shell-examine-alist)))) |
2926 (setq help (cdr help-cons)) | 2926 (setq help (cdr help-cons)) |
2927 (if (null help) (throw 'exit nil)) | 2927 (if (null help) (throw 'exit nil)) |
2928 (if idlwave-shell-separate-examine-output | 2928 (if idlwave-shell-separate-examine-output |
2929 (setq idlwave-shell-examine-label | 2929 (setq idlwave-shell-examine-label |
2930 (concat | 2930 (concat |
2931 (format "==>%s<==\n%s:" expr (car help-cons)) | 2931 (format "==>%s<==\n%s:" expr (car help-cons)) |
2932 stack-label "\n")))) | 2932 stack-label "\n")))) |
2933 ;; The regular help label (no popups, cons cells, etc.) | 2933 ;; The regular help label (no popups, cons cells, etc.) |
2934 (setq idlwave-shell-examine-label | 2934 (setq idlwave-shell-examine-label |
2935 (concat | 2935 (concat |
2936 (format "==>%s<==\n%s:" expr | 2936 (format "==>%s<==\n%s:" expr |
2937 (cond ((null help) "print") | 2937 (cond ((null help) "print") |
2938 ((stringp help) help) | 2938 ((stringp help) help) |
2939 (t (symbol-name help)))) | 2939 (t (symbol-name help)))) |
2940 stack-label "\n"))) | 2940 stack-label "\n"))) |
2941 | 2941 |
2944 (setq expr (idlwave-retrieve-expression-from-level | 2944 (setq expr (idlwave-retrieve-expression-from-level |
2945 expr | 2945 expr |
2946 idlwave-shell-calling-stack-index))) | 2946 idlwave-shell-calling-stack-index))) |
2947 (setq cmd (idlwave-shell-help-statement help expr)) | 2947 (setq cmd (idlwave-shell-help-statement help expr)) |
2948 ;;(idlwave-shell-recenter-shell-window) | 2948 ;;(idlwave-shell-recenter-shell-window) |
2949 (idlwave-shell-send-command | 2949 (idlwave-shell-send-command |
2950 cmd | 2950 cmd |
2951 examine-hook | 2951 examine-hook |
2952 (if idlwave-shell-separate-examine-output 'hide)))))) | 2952 (if idlwave-shell-separate-examine-output 'hide)))))) |
2953 | 2953 |
2954 (defvar idlwave-shell-examine-window-alist nil | 2954 (defvar idlwave-shell-examine-window-alist nil |
2955 "Variable to hold the win/height pairs for all *Examine* windows.") | 2955 "Variable to hold the win/height pairs for all *Examine* windows.") |
2956 | 2956 |
2973 (insert idlwave-shell-command-output) | 2973 (insert idlwave-shell-command-output) |
2974 ;; Just take the last bit between the prompts (if more than one). | 2974 ;; Just take the last bit between the prompts (if more than one). |
2975 (let* ((end (or | 2975 (let* ((end (or |
2976 (re-search-backward idlwave-shell-prompt-pattern nil t) | 2976 (re-search-backward idlwave-shell-prompt-pattern nil t) |
2977 (point-max))) | 2977 (point-max))) |
2978 (beg (progn | 2978 (beg (progn |
2979 (goto-char | 2979 (goto-char |
2980 (or (progn (if (re-search-backward | 2980 (or (progn (if (re-search-backward |
2981 idlwave-shell-prompt-pattern nil t) | 2981 idlwave-shell-prompt-pattern nil t) |
2982 (match-end 0))) | 2982 (match-end 0))) |
2983 (point-min))) | 2983 (point-min))) |
2984 (re-search-forward "\n"))) | 2984 (re-search-forward "\n"))) |
2985 (str (buffer-substring beg end))) | 2985 (str (buffer-substring beg end))) |
2992 (setq cur-beg (point-min) | 2992 (setq cur-beg (point-min) |
2993 cur-end (point-max)) | 2993 cur-end (point-max)) |
2994 (setq buffer-read-only t) | 2994 (setq buffer-read-only t) |
2995 (move-overlay idlwave-shell-output-overlay cur-beg cur-end | 2995 (move-overlay idlwave-shell-output-overlay cur-beg cur-end |
2996 (current-buffer)) | 2996 (current-buffer)) |
2997 | 2997 |
2998 ;; Look for the examine buffer in all windows. If one is | 2998 ;; Look for the examine buffer in all windows. If one is |
2999 ;; found in a frame all by itself, use that, otherwise, switch | 2999 ;; found in a frame all by itself, use that, otherwise, switch |
3000 ;; to or create an examine window in this frame, and resize if | 3000 ;; to or create an examine window in this frame, and resize if |
3001 ;; it's a newly created window | 3001 ;; it's a newly created window |
3002 (let* ((winlist (get-buffer-window-list "*Examine*" nil 'visible))) | 3002 (let* ((winlist (get-buffer-window-list "*Examine*" nil 'visible))) |
3003 (setq win (idlwave-display-buffer | 3003 (setq win (idlwave-display-buffer |
3004 "*Examine*" | 3004 "*Examine*" |
3005 nil | 3005 nil |
3006 (let ((list winlist) thiswin) | 3006 (let ((list winlist) thiswin) |
3007 (catch 'exit | 3007 (catch 'exit |
3008 (save-selected-window | 3008 (save-selected-window |
3009 (while (setq thiswin (pop list)) | 3009 (while (setq thiswin (pop list)) |
3010 (select-window thiswin) | 3010 (select-window thiswin) |
3011 (if (one-window-p) | 3011 (if (one-window-p) |
3012 (throw 'exit (window-frame thiswin))))))))) | 3012 (throw 'exit (window-frame thiswin))))))))) |
3013 (set-window-start win (point-min)) ; Ensure the point is visible. | 3013 (set-window-start win (point-min)) ; Ensure the point is visible. |
3014 (save-selected-window | 3014 (save-selected-window |
3015 (select-window win) | 3015 (select-window win) |
3016 (let ((elt (assoc win idlwave-shell-examine-window-alist))) | 3016 (let ((elt (assoc win idlwave-shell-examine-window-alist))) |
3027 (mapcar (lambda (x) (if (window-live-p (car x)) x)) | 3027 (mapcar (lambda (x) (if (window-live-p (car x)) x)) |
3028 idlwave-shell-examine-window-alist))) | 3028 idlwave-shell-examine-window-alist))) |
3029 ;; And add the new value. | 3029 ;; And add the new value. |
3030 (if (setq elt (assoc win idlwave-shell-examine-window-alist)) | 3030 (if (setq elt (assoc win idlwave-shell-examine-window-alist)) |
3031 (setcdr elt (window-height)) | 3031 (setcdr elt (window-height)) |
3032 (add-to-list 'idlwave-shell-examine-window-alist | 3032 (add-to-list 'idlwave-shell-examine-window-alist |
3033 (cons win (window-height))))))))) | 3033 (cons win (window-height))))))))) |
3034 ;; Recenter for maximum output, after widened | 3034 ;; Recenter for maximum output, after widened |
3035 (save-selected-window | 3035 (save-selected-window |
3036 (select-window win) | 3036 (select-window win) |
3037 (goto-char (point-max)) | 3037 (goto-char (point-max)) |
3045 (delete-frame (window-frame win)) | 3045 (delete-frame (window-frame win)) |
3046 (delete-window win)))) | 3046 (delete-window win)))) |
3047 | 3047 |
3048 (defun idlwave-shell-examine-display-clear () | 3048 (defun idlwave-shell-examine-display-clear () |
3049 (interactive) | 3049 (interactive) |
3050 (save-excursion | 3050 (save-excursion |
3051 (let ((buf (get-buffer "*Examine*"))) | 3051 (let ((buf (get-buffer "*Examine*"))) |
3052 (when (bufferp buf) | 3052 (when (bufferp buf) |
3053 (set-buffer buf) | 3053 (set-buffer buf) |
3054 (setq buffer-read-only nil) | 3054 (setq buffer-read-only nil) |
3055 (erase-buffer) | 3055 (erase-buffer) |
3073 ;; FIXME: In the following we try to find the variables in expression | 3073 ;; FIXME: In the following we try to find the variables in expression |
3074 ;; This is quite empirical - I don't know in what situations this will | 3074 ;; This is quite empirical - I don't know in what situations this will |
3075 ;; break. We will look for identifiers and exclude cases where we | 3075 ;; break. We will look for identifiers and exclude cases where we |
3076 ;; know it is not a variable. To distinguish array references from | 3076 ;; know it is not a variable. To distinguish array references from |
3077 ;; function calls, we require that arrays use [] instead of () | 3077 ;; function calls, we require that arrays use [] instead of () |
3078 | 3078 |
3079 (while (string-match | 3079 (while (string-match |
3080 "\\(\\`\\|[^a-zA-Z0-9$_][ \t]*\\)\\([a-zA-Z][a-zA-Z0-9$_]*\\)\\([ \t]*[^a-zA-Z0-9$_]\\|\\'\\)" expr start) | 3080 "\\(\\`\\|[^a-zA-Z0-9$_][ \t]*\\)\\([a-zA-Z][a-zA-Z0-9$_]*\\)\\([ \t]*[^a-zA-Z0-9$_]\\|\\'\\)" expr start) |
3081 (setq var (match-string 2 expr) | 3081 (setq var (match-string 2 expr) |
3082 start (match-beginning 2) | 3082 start (match-beginning 2) |
3083 pre (substring expr 0 (match-beginning 2)) | 3083 pre (substring expr 0 (match-beginning 2)) |
3089 (string-match "\\`[ \t]*=" post))) ;; a `=' KEYWORD | 3089 (string-match "\\`[ \t]*=" post))) ;; a `=' KEYWORD |
3090 ((string-match "\\`(" post)) ;; a function | 3090 ((string-match "\\`(" post)) ;; a function |
3091 ((string-match "->[ \t]*\\'" pre)) ;; a method | 3091 ((string-match "->[ \t]*\\'" pre)) ;; a method |
3092 ((string-match "\\.\\'" pre)) ;; structure member | 3092 ((string-match "\\.\\'" pre)) ;; structure member |
3093 ((and (string-match "\\([\"\']\\)[^\1]*$" pre) | 3093 ((and (string-match "\\([\"\']\\)[^\1]*$" pre) |
3094 (string-match (concat "^[^" (match-string 1 pre) "]*" | 3094 (string-match (concat "^[^" (match-string 1 pre) "]*" |
3095 (match-string 1 pre)) post))) | 3095 (match-string 1 pre)) post))) |
3096 (t ;; seems to be a variable - replace its name in the | 3096 (t ;; seems to be a variable - replace its name in the |
3097 ;; expression with the fetch. | 3097 ;; expression with the fetch. |
3098 (setq rnvar (format "(routine_names('%s',fetch=%d))" var fetch) | 3098 (setq rnvar (format "(routine_names('%s',fetch=%d))" var fetch) |
3099 expr (concat pre rnvar post) | 3099 expr (concat pre rnvar post) |
3107 HELP can be non-nil for `help,', nil for 'print,' or any string into which | 3107 HELP can be non-nil for `help,', nil for 'print,' or any string into which |
3108 to insert expression in place of the marker ___, e.g.: print, | 3108 to insert expression in place of the marker ___, e.g.: print, |
3109 size(___,/DIMENSIONS)" | 3109 size(___,/DIMENSIONS)" |
3110 (cond | 3110 (cond |
3111 ((null help) (concat "print, " expr)) | 3111 ((null help) (concat "print, " expr)) |
3112 ((stringp help) | 3112 ((stringp help) |
3113 (if (string-match "\\(^\\|[^_]\\)\\(___\\)\\([^_]\\|$\\)" help) | 3113 (if (string-match "\\(^\\|[^_]\\)\\(___\\)\\([^_]\\|$\\)" help) |
3114 (concat (substring help 0 (match-beginning 2)) | 3114 (concat (substring help 0 (match-beginning 2)) |
3115 expr | 3115 expr |
3116 (substring help (match-end 2))))) | 3116 (substring help (match-end 2))))) |
3117 (t (concat "help, " expr)))) | 3117 (t (concat "help, " expr)))) |
3118 | 3118 |
3119 | 3119 |
3120 (defun idlwave-shell-examine-highlight () | 3120 (defun idlwave-shell-examine-highlight () |
3121 "Highlight the most recent IDL output." | 3121 "Highlight the most recent IDL output." |
3122 (let* ((buffer (get-buffer (idlwave-shell-buffer))) | 3122 (let* ((buffer (get-buffer (idlwave-shell-buffer))) |
3123 (process (get-buffer-process buffer)) | 3123 (process (get-buffer-process buffer)) |
3124 (process-mark (if process (process-mark process))) | 3124 (process-mark (if process (process-mark process))) |
3125 output-begin output-end) | 3125 output-begin output-end) |
3126 (save-excursion | 3126 (save-excursion |
3127 (set-buffer buffer) | 3127 (set-buffer buffer) |
3128 (goto-char process-mark) | 3128 (goto-char process-mark) |
3129 (beginning-of-line) | 3129 (beginning-of-line) |
3130 (setq output-end (point)) | 3130 (setq output-end (point)) |
3131 (re-search-backward idlwave-shell-prompt-pattern nil t) | 3131 (re-search-backward idlwave-shell-prompt-pattern nil t) |
3132 (beginning-of-line 2) | 3132 (beginning-of-line 2) |
3133 (setq output-begin (point))) | 3133 (setq output-begin (point))) |
3134 | 3134 |
3135 ;; First make sure the shell window is visible | 3135 ;; First make sure the shell window is visible |
3136 (idlwave-display-buffer (idlwave-shell-buffer) | 3136 (idlwave-display-buffer (idlwave-shell-buffer) |
3137 nil (idlwave-shell-shell-frame)) | 3137 nil (idlwave-shell-shell-frame)) |
3138 (if (and idlwave-shell-output-overlay process-mark) | 3138 (if (and idlwave-shell-output-overlay process-mark) |
3139 (move-overlay idlwave-shell-output-overlay | 3139 (move-overlay idlwave-shell-output-overlay |
3140 output-begin output-end buffer)))) | 3140 output-begin output-end buffer)))) |
3141 | 3141 |
3142 (defun idlwave-shell-delete-output-overlay () | 3142 (defun idlwave-shell-delete-output-overlay () |
3143 (unless (or (eq this-command 'idlwave-shell-mouse-nop) | 3143 (unless (or (eq this-command 'idlwave-shell-mouse-nop) |
3144 (eq this-command 'handle-switch-frame)) | 3144 (eq this-command 'handle-switch-frame)) |
3145 (condition-case nil | 3145 (condition-case nil |
3146 (if idlwave-shell-output-overlay | 3146 (if idlwave-shell-output-overlay |
3147 (delete-overlay idlwave-shell-output-overlay)) | 3147 (delete-overlay idlwave-shell-output-overlay)) |
3148 (error nil)) | 3148 (error nil)) |
3149 (remove-hook 'pre-command-hook 'idlwave-shell-delete-output-overlay))) | 3149 (remove-hook 'pre-command-hook 'idlwave-shell-delete-output-overlay))) |
3150 | 3150 |
3151 (defun idlwave-shell-delete-expression-overlay () | 3151 (defun idlwave-shell-delete-expression-overlay () |
3152 (unless (or (eq this-command 'idlwave-shell-mouse-nop) | 3152 (unless (or (eq this-command 'idlwave-shell-mouse-nop) |
3153 (eq this-command 'handle-switch-frame)) | 3153 (eq this-command 'handle-switch-frame)) |
3154 (condition-case nil | 3154 (condition-case nil |
3155 (if idlwave-shell-expression-overlay | 3155 (if idlwave-shell-expression-overlay |
3174 contains four items: | 3174 contains four items: |
3175 | 3175 |
3176 count - number of times to execute breakpoint. When count reaches 0 | 3176 count - number of times to execute breakpoint. When count reaches 0 |
3177 the breakpoint is cleared and removed from the alist. | 3177 the breakpoint is cleared and removed from the alist. |
3178 | 3178 |
3179 command - command to execute when breakpoint is reached, either a | 3179 command - command to execute when breakpoint is reached, either a |
3180 lisp function to be called with `funcall' with no arguments or a | 3180 lisp function to be called with `funcall' with no arguments or a |
3181 list to be evaluated with `eval'. | 3181 list to be evaluated with `eval'. |
3182 | 3182 |
3183 condition - any condition to apply to the breakpoint. | 3183 condition - any condition to apply to the breakpoint. |
3184 | 3184 |
3207 (idlwave-previous-statement) | 3207 (idlwave-previous-statement) |
3208 (idlwave-look-at "\\<end\\>"))) | 3208 (idlwave-look-at "\\<end\\>"))) |
3209 (insert "\nend\n")) | 3209 (insert "\nend\n")) |
3210 (save-buffer 0))) | 3210 (save-buffer 0))) |
3211 (idlwave-shell-send-command (concat ".run " idlwave-shell-temp-pro-file) | 3211 (idlwave-shell-send-command (concat ".run " idlwave-shell-temp-pro-file) |
3212 nil | 3212 nil |
3213 (if (idlwave-shell-hide-p 'run) 'mostly) | 3213 (if (idlwave-shell-hide-p 'run) 'mostly) |
3214 nil t) | 3214 nil t) |
3215 (if n | 3215 (if n |
3216 (idlwave-display-buffer (idlwave-shell-buffer) | 3216 (idlwave-display-buffer (idlwave-shell-buffer) |
3217 nil (idlwave-shell-shell-frame)))) | 3217 nil (idlwave-shell-shell-frame)))) |
3218 | 3218 |
3219 (defun idlwave-shell-evaluate-region (beg end &optional n) | 3219 (defun idlwave-shell-evaluate-region (beg end &optional n) |
3220 "Send region to the IDL process. | 3220 "Send region to the IDL process. |
3221 If there is a prefix argument, display IDL process. | 3221 If there is a prefix argument, display IDL process. |
3222 Does not work for a region with multiline blocks - use | 3222 Does not work for a region with multiline blocks - use |
3223 `idlwave-shell-run-region' for this." | 3223 `idlwave-shell-run-region' for this." |
3224 (interactive "r\nP") | 3224 (interactive "r\nP") |
3225 (idlwave-shell-send-command (buffer-substring beg end)) | 3225 (idlwave-shell-send-command (buffer-substring beg end)) |
3226 (if n | 3226 (if n |
3227 (idlwave-display-buffer (idlwave-shell-buffer) | 3227 (idlwave-display-buffer (idlwave-shell-buffer) |
3228 nil (idlwave-shell-shell-frame)))) | 3228 nil (idlwave-shell-shell-frame)))) |
3229 | 3229 |
3230 (defun idlwave-shell-delete-temp-files () | 3230 (defun idlwave-shell-delete-temp-files () |
3231 "Delete the temporary files and kill associated buffers." | 3231 "Delete the temporary files and kill associated buffers." |
3232 (if (stringp idlwave-shell-temp-pro-file) | 3232 (if (stringp idlwave-shell-temp-pro-file) |
3277 `(progn | 3277 `(progn |
3278 (idlwave-shell-filter-bp (quote ,no-show))) | 3278 (idlwave-shell-filter-bp (quote ,no-show))) |
3279 'hide)) | 3279 'hide)) |
3280 | 3280 |
3281 (defun idlwave-shell-bp-get (bp &optional item) | 3281 (defun idlwave-shell-bp-get (bp &optional item) |
3282 "Get a value for a breakpoint. | 3282 "Get a value for a breakpoint. |
3283 BP has the form of elements in idlwave-shell-bp-alist. Optional | 3283 BP has the form of elements in idlwave-shell-bp-alist. Optional |
3284 second arg ITEM is the particular value to retrieve. ITEM can be | 3284 second arg ITEM is the particular value to retrieve. ITEM can be |
3285 'file, 'line, 'index, 'module, 'count, 'cmd, 'condition, 'disabled or | 3285 'file, 'line, 'index, 'module, 'count, 'cmd, 'condition, 'disabled or |
3286 'data. 'data returns a list of 'count, 'cmd and 'condition. Defaults | 3286 'data. 'data returns a list of 'count, 'cmd and 'condition. Defaults |
3287 to 'index." | 3287 to 'index." |
3312 (goto-char (point-min)) | 3312 (goto-char (point-min)) |
3313 (let ((old-bp-alist idlwave-shell-bp-alist) | 3313 (let ((old-bp-alist idlwave-shell-bp-alist) |
3314 ;; Searching the breakpoints | 3314 ;; Searching the breakpoints |
3315 ;; In IDL 5.5, the breakpoint reporting format changed. | 3315 ;; In IDL 5.5, the breakpoint reporting format changed. |
3316 (bp-re54 "^[ \t]*\\([0-9]+\\)[ \t]+\\(\\S-+\\)?[ \t]+\\([0-9]+\\)[ \t]+\\(\\S-+\\)") | 3316 (bp-re54 "^[ \t]*\\([0-9]+\\)[ \t]+\\(\\S-+\\)?[ \t]+\\([0-9]+\\)[ \t]+\\(\\S-+\\)") |
3317 (bp-re55 | 3317 (bp-re55 |
3318 (concat | 3318 (concat |
3319 "^\\s-*\\([0-9]+\\)" ; 1 index | 3319 "^\\s-*\\([0-9]+\\)" ; 1 index |
3320 "\\s-+\\([0-9]+\\)" ; 2 line number | 3320 "\\s-+\\([0-9]+\\)" ; 2 line number |
3321 "\\s-+\\(Uncompiled\\|" ; 3-6 either uncompiled or routine name | 3321 "\\s-+\\(Uncompiled\\|" ; 3-6 either uncompiled or routine name |
3322 "\\(\\(Func=\\|Pro=\\)\\(\\$?[a-zA-Z][a-zA-Z0-9$_:]*\\$?\\)\\)\\)" | 3322 "\\(\\(Func=\\|Pro=\\)\\(\\$?[a-zA-Z][a-zA-Z0-9$_:]*\\$?\\)\\)\\)" |
3323 "\\(\\s-*,\\s-*After=[0-9]+/\\([0-9]+\\)?\\)?" ; 7-8 After part | 3323 "\\(\\s-*,\\s-*After=[0-9]+/\\([0-9]+\\)?\\)?" ; 7-8 After part |
3328 file line index module | 3328 file line index module |
3329 count condition disabled | 3329 count condition disabled |
3330 bp-re indmap) | 3330 bp-re indmap) |
3331 (setq idlwave-shell-bp-alist (list nil)) | 3331 (setq idlwave-shell-bp-alist (list nil)) |
3332 ;; Search for either header type, and set the correct regexp | 3332 ;; Search for either header type, and set the correct regexp |
3333 (when (or | 3333 (when (or |
3334 (if (re-search-forward "^\\s-*Index.*\n\\s-*-" nil t) | 3334 (if (re-search-forward "^\\s-*Index.*\n\\s-*-" nil t) |
3335 (setq bp-re bp-re54 ; versions <= 5.4 | 3335 (setq bp-re bp-re54 ; versions <= 5.4 |
3336 indmap '(1 2 3 4))) ;index module line file | 3336 indmap '(1 2 3 4))) ;index module line file |
3337 (if (re-search-forward | 3337 (if (re-search-forward |
3338 "^\\s-*Index\\s-*Line\\s-*Attributes\\s-*File" nil t) | 3338 "^\\s-*Index\\s-*Line\\s-*Attributes\\s-*File" nil t) |
3339 (setq bp-re bp-re55 ; versions >= 5.5 | 3339 (setq bp-re bp-re55 ; versions >= 5.5 |
3340 indmap '(1 6 2 16)))) ; index module line file | 3340 indmap '(1 6 2 16)))) ; index module line file |
3341 ;; There seems to be a breakpoint listing here, parse breakpoint lines. | 3341 ;; There seems to be a breakpoint listing here, parse breakpoint lines. |
3342 (while (re-search-forward bp-re nil t) | 3342 (while (re-search-forward bp-re nil t) |
3343 (setq index (string-to-int (match-string (nth 0 indmap))) | 3343 (setq index (string-to-number (match-string (nth 0 indmap))) |
3344 module (match-string (nth 1 indmap)) | 3344 module (match-string (nth 1 indmap)) |
3345 line (string-to-int (match-string (nth 2 indmap))) | 3345 line (string-to-number (match-string (nth 2 indmap))) |
3346 file (idlwave-shell-file-name (match-string (nth 3 indmap)))) | 3346 file (idlwave-shell-file-name (match-string (nth 3 indmap)))) |
3347 (if (eq bp-re bp-re55) | 3347 (if (eq bp-re bp-re55) |
3348 (setq count (if (match-string 10) 1 | 3348 (setq count (if (match-string 10) 1 |
3349 (if (match-string 8) | 3349 (if (match-string 8) |
3350 (string-to-int (match-string 8)))) | 3350 (string-to-number (match-string 8)))) |
3351 condition (match-string 13) | 3351 condition (match-string 13) |
3352 disabled (not (null (match-string 15))))) | 3352 disabled (not (null (match-string 15))))) |
3353 | 3353 |
3354 ;; Add the breakpoint info to the list | 3354 ;; Add the breakpoint info to the list |
3355 (nconc idlwave-shell-bp-alist | 3355 (nconc idlwave-shell-bp-alist |
3356 (list (cons (list file line) | 3356 (list (cons (list file line) |
3357 (list | 3357 (list |
3358 (list index module) | 3358 (list index module) |
3359 ;; bp data: count, command, condition, disabled | 3359 ;; bp data: count, command, condition, disabled |
3360 count nil condition disabled)))))) | 3360 count nil condition disabled)))))) |
3361 (setq idlwave-shell-bp-alist (cdr idlwave-shell-bp-alist)) | 3361 (setq idlwave-shell-bp-alist (cdr idlwave-shell-bp-alist)) |
3362 ;; Update breakpoint data | 3362 ;; Update breakpoint data |
3363 (if (eq bp-re bp-re54) | 3363 (if (eq bp-re bp-re54) |
3364 (mapcar 'idlwave-shell-update-bp old-bp-alist) | 3364 (mapcar 'idlwave-shell-update-bp old-bp-alist) |
3365 (mapcar 'idlwave-shell-update-bp-command-only old-bp-alist)))) | 3365 (mapcar 'idlwave-shell-update-bp-command-only old-bp-alist)))) |
3366 ;; Update the breakpoint overlays | 3366 ;; Update the breakpoint overlays |
3367 (unless no-show (idlwave-shell-update-bp-overlays)) | 3367 (unless no-show (idlwave-shell-update-bp-overlays)) |
3368 ;; Return the new list | 3368 ;; Return the new list |
3373 | 3373 |
3374 (defun idlwave-shell-update-bp (bp &optional command-only) | 3374 (defun idlwave-shell-update-bp (bp &optional command-only) |
3375 "Update BP data in breakpoint list. | 3375 "Update BP data in breakpoint list. |
3376 If BP frame is in `idlwave-shell-bp-alist' updates the breakpoint data." | 3376 If BP frame is in `idlwave-shell-bp-alist' updates the breakpoint data." |
3377 (let ((match (assoc (car bp) idlwave-shell-bp-alist))) | 3377 (let ((match (assoc (car bp) idlwave-shell-bp-alist))) |
3378 (if match | 3378 (if match |
3379 (if command-only | 3379 (if command-only |
3380 (setf (nth 1 (cdr (cdr match))) (nth 1 (cdr (cdr match)))) | 3380 (setf (nth 1 (cdr (cdr match))) (nth 1 (cdr (cdr match)))) |
3381 (setcdr (cdr match) (cdr (cdr bp))))))) | 3381 (setcdr (cdr match) (cdr (cdr bp))))))) |
3382 | 3382 |
3383 (defun idlwave-shell-set-bp-data (bp data) | 3383 (defun idlwave-shell-set-bp-data (bp data) |
3384 "Set the data of BP to DATA." | 3384 "Set the data of BP to DATA." |
3399 If an equivalency is found, return the IDL internal source name. | 3399 If an equivalency is found, return the IDL internal source name. |
3400 Otherwise return the filename in bp." | 3400 Otherwise return the filename in bp." |
3401 (let* | 3401 (let* |
3402 ((bp-file (idlwave-shell-bp-get bp 'file)) | 3402 ((bp-file (idlwave-shell-bp-get bp 'file)) |
3403 (bp-module (idlwave-shell-bp-get bp 'module)) | 3403 (bp-module (idlwave-shell-bp-get bp 'module)) |
3404 (internal-file-list | 3404 (internal-file-list |
3405 (cdr (assoc bp-module idlwave-shell-sources-alist)))) | 3405 (cdr (assoc bp-module idlwave-shell-sources-alist)))) |
3406 (if (and internal-file-list | 3406 (if (and internal-file-list |
3407 (equal bp-file (nth 0 internal-file-list))) | 3407 (equal bp-file (nth 0 internal-file-list))) |
3408 (nth 1 internal-file-list) | 3408 (nth 1 internal-file-list) |
3409 bp-file))) | 3409 bp-file))) |
3410 | 3410 |
3411 (defun idlwave-shell-set-bp (bp &optional no-show) | 3411 (defun idlwave-shell-set-bp (bp &optional no-show) |
3412 "Try to set a breakpoint BP. | 3412 "Try to set a breakpoint BP. |
3413 The breakpoint will be placed at the beginning of the statement on the | 3413 The breakpoint will be placed at the beginning of the statement on the |
3414 line specified by BP or at the next IDL statement if that line is not | 3414 line specified by BP or at the next IDL statement if that line is not |
3415 a statement. Determines IDL's internal representation for the | 3415 a statement. Determines IDL's internal representation for the |
3416 breakpoint, which may have occurred at a different line than | 3416 breakpoint, which may have occurred at a different line than |
3417 specified. If NO-SHOW is non-nil, don't do any updating." | 3417 specified. If NO-SHOW is non-nil, don't do any updating." |
3418 ;; Get and save the old breakpoints | 3418 ;; Get and save the old breakpoints |
3419 (idlwave-shell-send-command | 3419 (idlwave-shell-send-command |
3420 idlwave-shell-bp-query | 3420 idlwave-shell-bp-query |
3421 `(progn | 3421 `(progn |
3422 (idlwave-shell-filter-bp (quote ,no-show)) | 3422 (idlwave-shell-filter-bp (quote ,no-show)) |
3423 (setq idlwave-shell-old-bp idlwave-shell-bp-alist)) | 3423 (setq idlwave-shell-old-bp idlwave-shell-bp-alist)) |
3424 'hide) | 3424 'hide) |
3432 'hide)) | 3432 'hide)) |
3433 | 3433 |
3434 (defun idlwave-shell-set-bp2 (bp &optional no-show) | 3434 (defun idlwave-shell-set-bp2 (bp &optional no-show) |
3435 "Use results of breakpoint and sources query to set bp. | 3435 "Use results of breakpoint and sources query to set bp. |
3436 Use the count argument with IDLs breakpoint command. | 3436 Use the count argument with IDLs breakpoint command. |
3437 We treat a count of 1 as a temporary breakpoint. | 3437 We treat a count of 1 as a temporary breakpoint. |
3438 Counts greater than 1 use the IDL AFTER=count keyword to break | 3438 Counts greater than 1 use the IDL AFTER=count keyword to break |
3439 only after reaching the statement count times." | 3439 only after reaching the statement count times." |
3440 (let* | 3440 (let* |
3441 ((arg (idlwave-shell-bp-get bp 'count)) | 3441 ((arg (idlwave-shell-bp-get bp 'count)) |
3442 (key (cond | 3442 (key (cond |
3444 ((= arg 1) | 3444 ((= arg 1) |
3445 ",/once") | 3445 ",/once") |
3446 ((> arg 1) | 3446 ((> arg 1) |
3447 (format ",after=%d" arg)))) | 3447 (format ",after=%d" arg)))) |
3448 (condition (idlwave-shell-bp-get bp 'condition)) | 3448 (condition (idlwave-shell-bp-get bp 'condition)) |
3449 (key (concat key | 3449 (key (concat key |
3450 (if condition (concat ",CONDITION=\"" condition "\"")))) | 3450 (if condition (concat ",CONDITION=\"" condition "\"")))) |
3451 (line (idlwave-shell-bp-get bp 'line))) | 3451 (line (idlwave-shell-bp-get bp 'line))) |
3452 (idlwave-shell-send-command | 3452 (idlwave-shell-send-command |
3453 (concat "breakpoint,'" | 3453 (concat "breakpoint,'" |
3454 (idlwave-shell-sources-bp bp) "'," | 3454 (idlwave-shell-sources-bp bp) "'," |
3455 (if (integerp line) (setq line (int-to-string line))) | 3455 (if (integerp line) (setq line (int-to-string line))) |
3456 key) | 3456 key) |
3457 ;; Check for failure and look for breakpoint in IDL's list | 3457 ;; Check for failure and look for breakpoint in IDL's list |
3458 `(progn | 3458 `(progn |
3532 (use-glyph (and (memq idlwave-shell-mark-breakpoints '(t glyph)) | 3532 (use-glyph (and (memq idlwave-shell-mark-breakpoints '(t glyph)) |
3533 idlwave-shell-bp-glyph)) | 3533 idlwave-shell-bp-glyph)) |
3534 ov ov-list bp buf old-buffers win) | 3534 ov ov-list bp buf old-buffers win) |
3535 | 3535 |
3536 ;; Delete the old overlays from their buffers | 3536 ;; Delete the old overlays from their buffers |
3537 (if ov-alist | 3537 (if ov-alist |
3538 (while (setq ov-list (pop ov-alist)) | 3538 (while (setq ov-list (pop ov-alist)) |
3539 (while (setq ov (pop (cdr ov-list))) | 3539 (while (setq ov (pop (cdr ov-list))) |
3540 (add-to-list 'old-buffers (overlay-buffer ov)) | 3540 (add-to-list 'old-buffers (overlay-buffer ov)) |
3541 (delete-overlay ov)))) | 3541 (delete-overlay ov)))) |
3542 | 3542 |
3543 (setq ov-alist idlwave-shell-bp-overlays | 3543 (setq ov-alist idlwave-shell-bp-overlays |
3544 idlwave-shell-bp-overlays | 3544 idlwave-shell-bp-overlays |
3545 (if idlwave-shell-bp-glyph | 3545 (if idlwave-shell-bp-glyph |
3546 (mapcar 'list (mapcar 'car idlwave-shell-bp-glyph)) | 3546 (mapcar 'list (mapcar 'car idlwave-shell-bp-glyph)) |
3547 (list (list 'bp)))) | 3547 (list (list 'bp)))) |
3548 (while (setq bp (pop bp-list)) | 3548 (while (setq bp (pop bp-list)) |
3549 (save-excursion | 3549 (save-excursion |
3563 (intern | 3563 (intern |
3564 (concat "bp-" (number-to-string count)))) | 3564 (concat "bp-" (number-to-string count)))) |
3565 (t 'bp-n))) | 3565 (t 'bp-n))) |
3566 (t 'bp)) | 3566 (t 'bp)) |
3567 'bp)) | 3567 'bp)) |
3568 (help-list | 3568 (help-list |
3569 (delq nil | 3569 (delq nil |
3570 (list | 3570 (list |
3571 (if count | 3571 (if count |
3572 (concat "n=" (int-to-string count))) | 3572 (concat "n=" (int-to-string count))) |
3573 (if condition | 3573 (if condition |
3574 (concat "condition: " condition)) | 3574 (concat "condition: " condition)) |
3575 (if disabled "disabled")))) | 3575 (if disabled "disabled")))) |
3576 (help-text (if help-list | 3576 (help-text (if help-list |
3577 (mapconcat 'identity help-list ","))) | 3577 (mapconcat 'identity help-list ","))) |
3578 (full-type (if disabled | 3578 (full-type (if disabled |
3579 (intern (concat (symbol-name type) | 3579 (intern (concat (symbol-name type) |
3580 "-disabled")) | 3580 "-disabled")) |
3581 type)) | 3581 type)) |
3582 (ov-existing (assq full-type ov-alist)) | 3582 (ov-existing (assq full-type ov-alist)) |
3583 (ov (or (and (cdr ov-existing) | 3583 (ov (or (and (cdr ov-existing) |
3584 (pop (cdr ov-existing))) | 3584 (pop (cdr ov-existing))) |
3585 (idlwave-shell-make-new-bp-overlay | 3585 (idlwave-shell-make-new-bp-overlay |
3586 type disabled help-text))) | 3586 type disabled help-text))) |
3587 match) | 3587 match) |
3588 (move-overlay ov beg end) | 3588 (move-overlay ov beg end) |
3589 (if (setq match (assq full-type idlwave-shell-bp-overlays)) | 3589 (if (setq match (assq full-type idlwave-shell-bp-overlays)) |
3590 (push ov (cdr match)) | 3590 (push ov (cdr match)) |
3591 (nconc idlwave-shell-bp-overlays | 3591 (nconc idlwave-shell-bp-overlays |
3592 (list (list full-type ov))))) | 3592 (list (list full-type ov))))) |
3593 ;; Take care of margins if using a glyph | 3593 ;; Take care of margins if using a glyph |
3594 (when use-glyph | 3594 (when use-glyph |
3595 (if old-buffers | 3595 (if old-buffers |
3596 (setq old-buffers (delq (current-buffer) old-buffers))) | 3596 (setq old-buffers (delq (current-buffer) old-buffers))) |
3597 (if (fboundp 'set-specifier) ;; XEmacs | 3597 (if (fboundp 'set-specifier) ;; XEmacs |
3598 (set-specifier left-margin-width (cons (current-buffer) 2)) | 3598 (set-specifier left-margin-width (cons (current-buffer) 2)) |
3599 (setq left-margin-width 2)) | 3599 (setq left-margin-width 2)) |
3600 (if (setq win (get-buffer-window (current-buffer) t)) | 3600 (if (setq win (get-buffer-window (current-buffer) t)) |
3608 (if (setq win (get-buffer-window buf t)) | 3608 (if (setq win (get-buffer-window buf t)) |
3609 (set-window-buffer win buf)))))))) | 3609 (set-window-buffer win buf)))))))) |
3610 | 3610 |
3611 | 3611 |
3612 (defun idlwave-shell-make-new-bp-overlay (&optional type disabled help) | 3612 (defun idlwave-shell-make-new-bp-overlay (&optional type disabled help) |
3613 "Make a new overlay for highlighting breakpoints. | 3613 "Make a new overlay for highlighting breakpoints. |
3614 | 3614 |
3615 This stuff is strongly dependant upon the version of Emacs. If TYPE | 3615 This stuff is strongly dependant upon the version of Emacs. If TYPE |
3616 is passed, make an overlay of that type ('bp or 'bp-cond, currently | 3616 is passed, make an overlay of that type ('bp or 'bp-cond, currently |
3617 only for glyphs). If HELP is set, use it to make a tooltip with that | 3617 only for glyphs). If HELP is set, use it to make a tooltip with that |
3618 text popup." | 3618 text popup." |
3619 (let ((ov (make-overlay 1 1)) | 3619 (let ((ov (make-overlay 1 1)) |
3620 (use-glyph (and (memq idlwave-shell-mark-breakpoints '(t glyph)) | 3620 (use-glyph (and (memq idlwave-shell-mark-breakpoints '(t glyph)) |
3621 idlwave-shell-bp-glyph)) | 3621 idlwave-shell-bp-glyph)) |
3622 (type (or type 'bp)) | 3622 (type (or type 'bp)) |
3623 (face (if disabled | 3623 (face (if disabled |
3624 idlwave-shell-disabled-breakpoint-face | 3624 idlwave-shell-disabled-breakpoint-face |
3625 idlwave-shell-breakpoint-face))) | 3625 idlwave-shell-breakpoint-face))) |
3626 (if (featurep 'xemacs) | 3626 (if (featurep 'xemacs) |
3627 ;; This is XEmacs | 3627 ;; This is XEmacs |
3628 (progn | 3628 (progn |
3629 (cond | 3629 (cond |
3630 ;; tty's cannot display glyphs | 3630 ;; tty's cannot display glyphs |
3631 ((eq (console-type) 'tty) | 3631 ((eq (console-type) 'tty) |
3632 (set-extent-property ov 'face face)) | 3632 (set-extent-property ov 'face face)) |
3633 | 3633 |
3634 ;; use the glyph | 3634 ;; use the glyph |
3635 (use-glyph | 3635 (use-glyph |
3636 (let ((glyph (cdr (assq type idlwave-shell-bp-glyph)))) | 3636 (let ((glyph (cdr (assq type idlwave-shell-bp-glyph)))) |
3637 (if disabled (setq glyph (car glyph)) (setq glyph (nth 1 glyph))) | 3637 (if disabled (setq glyph (car glyph)) (setq glyph (nth 1 glyph))) |
3638 (set-extent-property ov 'begin-glyph glyph) | 3638 (set-extent-property ov 'begin-glyph glyph) |
3649 (cond | 3649 (cond |
3650 (window-system | 3650 (window-system |
3651 (if use-glyph | 3651 (if use-glyph |
3652 (let ((image-props (cdr (assq type idlwave-shell-bp-glyph))) | 3652 (let ((image-props (cdr (assq type idlwave-shell-bp-glyph))) |
3653 string) | 3653 string) |
3654 | 3654 |
3655 (if disabled (setq image-props | 3655 (if disabled (setq image-props |
3656 (append image-props | 3656 (append image-props |
3657 (list :conversion 'disabled)))) | 3657 (list :conversion 'disabled)))) |
3658 (setq string | 3658 (setq string |
3659 (propertize "@" | 3659 (propertize "@" |
3660 'display | 3660 'display |
3661 (list (list 'margin 'left-margin) | 3661 (list (list 'margin 'left-margin) |
3662 image-props) | 3662 image-props) |
3663 'mouse-face 'highlight | 3663 'mouse-face 'highlight |
3664 'help-echo help)) | 3664 'help-echo help)) |
3665 (overlay-put ov 'before-string string)) | 3665 (overlay-put ov 'before-string string)) |
3683 (defun idlwave-shell-execute-default-command-line (arg) | 3683 (defun idlwave-shell-execute-default-command-line (arg) |
3684 "Execute a command line. On first use, ask for the command. | 3684 "Execute a command line. On first use, ask for the command. |
3685 Also with prefix arg, ask for the command. You can also use the command | 3685 Also with prefix arg, ask for the command. You can also use the command |
3686 `idlwave-shell-edit-default-command-line' to edit the line." | 3686 `idlwave-shell-edit-default-command-line' to edit the line." |
3687 (interactive "P") | 3687 (interactive "P") |
3688 (cond | 3688 (cond |
3689 ((equal arg '(16)) | 3689 ((equal arg '(16)) |
3690 (setq idlwave-shell-command-line-to-execute nil)) | 3690 (setq idlwave-shell-command-line-to-execute nil)) |
3691 ((equal arg '(4)) | 3691 ((equal arg '(4)) |
3692 (setq idlwave-shell-command-line-to-execute | 3692 (setq idlwave-shell-command-line-to-execute |
3693 (read-string "IDL> " idlwave-shell-command-line-to-execute)))) | 3693 (read-string "IDL> " idlwave-shell-command-line-to-execute)))) |
3694 (idlwave-shell-reset 'hidden) | 3694 (idlwave-shell-reset 'hidden) |
3695 (idlwave-shell-send-command | 3695 (idlwave-shell-send-command |
3696 (or idlwave-shell-command-line-to-execute | 3696 (or idlwave-shell-command-line-to-execute |
3697 (with-current-buffer (idlwave-shell-buffer) | 3697 (with-current-buffer (idlwave-shell-buffer) |
3698 (ring-ref comint-input-ring 0))) | 3698 (ring-ref comint-input-ring 0))) |
3699 '(idlwave-shell-redisplay 'hide))) | 3699 '(idlwave-shell-redisplay 'hide))) |
3700 | 3700 |
3701 (defun idlwave-shell-save-and-run () | 3701 (defun idlwave-shell-save-and-run () |
3702 "Save file and run it in IDL. | 3702 "Save file and run it in IDL. |
3703 Runs `save-buffer' and sends a '.RUN' command for the associated file to IDL. | 3703 Runs `save-buffer' and sends a '.RUN' command for the associated file to IDL. |
3704 When called from the shell buffer, re-run the file which was last handled by | 3704 When called from the shell buffer, re-run the file which was last handled by |
3705 one of the save-and-.. commands." | 3705 one of the save-and-.. commands." |
3706 (interactive) | 3706 (interactive) |
3707 (idlwave-shell-save-and-action 'run)) | 3707 (idlwave-shell-save-and-action 'run)) |
3708 | 3708 |
3709 (defun idlwave-shell-save-and-compile () | 3709 (defun idlwave-shell-save-and-compile () |
3710 "Save file and run it in IDL. | 3710 "Save file and run it in IDL. |
3716 | 3716 |
3717 (defun idlwave-shell-save-and-batch () | 3717 (defun idlwave-shell-save-and-batch () |
3718 "Save file and batch it in IDL. | 3718 "Save file and batch it in IDL. |
3719 Runs `save-buffer' and sends a '@file' command for the associated file to IDL. | 3719 Runs `save-buffer' and sends a '@file' command for the associated file to IDL. |
3720 When called from the shell buffer, re-batch the file which was last handled by | 3720 When called from the shell buffer, re-batch the file which was last handled by |
3721 one of the save-and-.. commands." | 3721 one of the save-and-.. commands." |
3722 (interactive) | 3722 (interactive) |
3723 (idlwave-shell-save-and-action 'batch)) | 3723 (idlwave-shell-save-and-action 'batch)) |
3724 | 3724 |
3725 (defun idlwave-shell-save-and-action (action) | 3725 (defun idlwave-shell-save-and-action (action) |
3726 "Save file and compile it in IDL. | 3726 "Save file and compile it in IDL. |
3756 (t (error "Unknown action %s" action))) | 3756 (t (error "Unknown action %s" action))) |
3757 idlwave-shell-last-save-and-action-file) | 3757 idlwave-shell-last-save-and-action-file) |
3758 'idlwave-shell-maybe-update-routine-info | 3758 'idlwave-shell-maybe-update-routine-info |
3759 (if (idlwave-shell-hide-p 'run) 'mostly) nil t) | 3759 (if (idlwave-shell-hide-p 'run) 'mostly) nil t) |
3760 (idlwave-shell-bp-query)) | 3760 (idlwave-shell-bp-query)) |
3761 (let ((msg (format "No such file %s" | 3761 (let ((msg (format "No such file %s" |
3762 idlwave-shell-last-save-and-action-file))) | 3762 idlwave-shell-last-save-and-action-file))) |
3763 (setq idlwave-shell-last-save-and-action-file nil) | 3763 (setq idlwave-shell-last-save-and-action-file nil) |
3764 (error msg)))) | 3764 (error msg)))) |
3765 | 3765 |
3766 (defun idlwave-shell-maybe-update-routine-info (&optional wait) | 3766 (defun idlwave-shell-maybe-update-routine-info (&optional wait) |
3789 'idlwave-shell-sources-filter | 3789 'idlwave-shell-sources-filter |
3790 'hide)) | 3790 'hide)) |
3791 | 3791 |
3792 (defun idlwave-shell-sources-filter () | 3792 (defun idlwave-shell-sources-filter () |
3793 "Get source files from `idlwave-shell-sources-query' output. | 3793 "Get source files from `idlwave-shell-sources-query' output. |
3794 Create `idlwave-shell-sources-alist' consisting of | 3794 Create `idlwave-shell-sources-alist' consisting of |
3795 list elements of the form: | 3795 list elements of the form: |
3796 (module name . (source-file-truename idlwave-internal-filename))." | 3796 (module name . (source-file-truename idlwave-internal-filename))." |
3797 (save-excursion | 3797 (save-excursion |
3798 (set-buffer (get-buffer-create idlwave-shell-bp-buffer)) | 3798 (set-buffer (get-buffer-create idlwave-shell-bp-buffer)) |
3799 (erase-buffer) | 3799 (erase-buffer) |
3874 (progn | 3874 (progn |
3875 (setq frame | 3875 (setq frame |
3876 (list | 3876 (list |
3877 (save-match-data | 3877 (save-match-data |
3878 (idlwave-shell-file-name | 3878 (idlwave-shell-file-name |
3879 (buffer-substring (match-beginning 1 ) | 3879 (buffer-substring (match-beginning 1 ) |
3880 (match-end 1)))) | 3880 (match-end 1)))) |
3881 (string-to-int | 3881 (string-to-number |
3882 (buffer-substring (match-beginning 2) | 3882 (buffer-substring (match-beginning 2) |
3883 (match-end 2))))) | 3883 (match-end 2))))) |
3884 ;; Try to find the column of the error | 3884 ;; Try to find the column of the error |
3885 (save-excursion | 3885 (save-excursion |
3886 (setq col | 3886 (setq col |
3941 (define-key idlwave-mode-map "\C-c\C-y" 'idlwave-shell-char-mode-loop) | 3941 (define-key idlwave-mode-map "\C-c\C-y" 'idlwave-shell-char-mode-loop) |
3942 (define-key idlwave-mode-map "\C-c\C-x" 'idlwave-shell-send-char) | 3942 (define-key idlwave-mode-map "\C-c\C-x" 'idlwave-shell-send-char) |
3943 | 3943 |
3944 ;; The mouse bindings for PRINT and HELP | 3944 ;; The mouse bindings for PRINT and HELP |
3945 (idlwave-shell-define-key-both | 3945 (idlwave-shell-define-key-both |
3946 (if (featurep 'xemacs) | 3946 (if (featurep 'xemacs) |
3947 [(shift button2)] | 3947 [(shift button2)] |
3948 [(shift down-mouse-2)]) | 3948 [(shift down-mouse-2)]) |
3949 'idlwave-shell-mouse-print) | 3949 'idlwave-shell-mouse-print) |
3950 (idlwave-shell-define-key-both | 3950 (idlwave-shell-define-key-both |
3951 (if (featurep 'xemacs) | 3951 (if (featurep 'xemacs) |
3952 [(control meta button2)] | 3952 [(control meta button2)] |
3953 [(control meta down-mouse-2)]) | 3953 [(control meta down-mouse-2)]) |
3954 'idlwave-shell-mouse-help) | 3954 'idlwave-shell-mouse-help) |
3955 (idlwave-shell-define-key-both | 3955 (idlwave-shell-define-key-both |
3956 (if (featurep 'xemacs) | 3956 (if (featurep 'xemacs) |
3957 [(control shift button2)] | 3957 [(control shift button2)] |
3958 [(control shift down-mouse-2)]) | 3958 [(control shift down-mouse-2)]) |
3959 'idlwave-shell-examine-select) | 3959 'idlwave-shell-examine-select) |
3960 ;; Add this one from the idlwave-mode-map | 3960 ;; Add this one from the idlwave-mode-map |
3961 (define-key idlwave-shell-mode-map | 3961 (define-key idlwave-shell-mode-map |
3962 (if (featurep 'xemacs) | 3962 (if (featurep 'xemacs) |
3963 [(shift button3)] | 3963 [(shift button3)] |
3964 [(shift mouse-3)]) | 3964 [(shift mouse-3)]) |
3965 'idlwave-mouse-context-help) | 3965 'idlwave-mouse-context-help) |
3966 | 3966 |
3967 ;; For Emacs, we need to turn off the button release events. | 3967 ;; For Emacs, we need to turn off the button release events. |
3968 (defun idlwave-shell-mouse-nop (event) | 3968 (defun idlwave-shell-mouse-nop (event) |
3969 (interactive "e")) | 3969 (interactive "e")) |
3970 (unless (featurep 'xemacs) | 3970 (unless (featurep 'xemacs) |
3971 (idlwave-shell-define-key-both | 3971 (idlwave-shell-define-key-both |
3972 [(shift mouse-2)] 'idlwave-shell-mouse-nop) | 3972 [(shift mouse-2)] 'idlwave-shell-mouse-nop) |
3973 (idlwave-shell-define-key-both | 3973 (idlwave-shell-define-key-both |
3974 [(shift control mouse-2)] 'idlwave-shell-mouse-nop) | 3974 [(shift control mouse-2)] 'idlwave-shell-mouse-nop) |
3975 (idlwave-shell-define-key-both | 3975 (idlwave-shell-define-key-both |
3976 [(control meta mouse-2)] 'idlwave-shell-mouse-nop)) | 3976 [(control meta mouse-2)] 'idlwave-shell-mouse-nop)) |
3977 | 3977 |
3978 | 3978 |
3979 ;; The following set of bindings is used to bind the debugging keys. | 3979 ;; The following set of bindings is used to bind the debugging keys. |
3980 ;; If `idlwave-shell-activate-prefix-keybindings' is non-nil, the | 3980 ;; If `idlwave-shell-activate-prefix-keybindings' is non-nil, the |
3981 ;; first key in the list gets bound the C-c C-d prefix map. If | 3981 ;; first key in the list gets bound the C-c C-d prefix map. If |
3982 ;; `idlwave-shell-debug-modifiers' is non-nil, the second key in the | 3982 ;; `idlwave-shell-debug-modifiers' is non-nil, the second key in the |
3983 ;; list gets bound with the specified modifiers in both | 3983 ;; list gets bound with the specified modifiers in both |
3984 ;; `idlwave-mode-map' and `idlwave-shell-mode-map'. The next list | 3984 ;; `idlwave-mode-map' and `idlwave-shell-mode-map'. The next list |
3985 ;; item, if non-nil, means to bind this as a single key in the | 3985 ;; item, if non-nil, means to bind this as a single key in the |
3986 ;; electric-debug-mode-map. | 3986 ;; electric-debug-mode-map. |
3987 ;; | 3987 ;; |
3988 ;; [C-c C-d]-binding debug-modifier-key command bind-electric-debug buf-only | 3988 ;; [C-c C-d]-binding debug-modifier-key command bind-electric-debug buf-only |
3989 ;; Used keys: abcdef hijklmnopqrstuvwxyz | 3989 ;; Used keys: abcdef hijklmnopqrstuvwxyz |
3990 ;; Unused keys: g | 3990 ;; Unused keys: g |
3991 (let* ((specs | 3991 (let* ((specs |
3992 '(([(control ?b)] ?b idlwave-shell-break-here t t) | 3992 '(([(control ?b)] ?b idlwave-shell-break-here t t) |
3993 ([(control ?i)] ?i idlwave-shell-break-in t t) | 3993 ([(control ?i)] ?i idlwave-shell-break-in t t) |
3994 ([(control ?j)] ?j idlwave-shell-break-this-module t t) | 3994 ([(control ?j)] ?j idlwave-shell-break-this-module t t) |
3995 ([(control ?d)] ?d idlwave-shell-clear-current-bp t) | 3995 ([(control ?d)] ?d idlwave-shell-clear-current-bp t) |
4035 c2 (nth 1 s) | 4035 c2 (nth 1 s) |
4036 cmd (nth 2 s) | 4036 cmd (nth 2 s) |
4037 electric (nth 3 s) | 4037 electric (nth 3 s) |
4038 only-buffer (nth 4 s) | 4038 only-buffer (nth 4 s) |
4039 cannotshift (and shift (char-valid-p c2) (eq c2 (upcase c2)))) | 4039 cannotshift (and shift (char-valid-p c2) (eq c2 (upcase c2)))) |
4040 | 4040 |
4041 ;; The regular prefix keymap. | 4041 ;; The regular prefix keymap. |
4042 (when (and idlwave-shell-activate-prefix-keybindings k1) | 4042 (when (and idlwave-shell-activate-prefix-keybindings k1) |
4043 (unless only-buffer | 4043 (unless only-buffer |
4044 (define-key idlwave-shell-mode-prefix-map k1 cmd)) | 4044 (define-key idlwave-shell-mode-prefix-map k1 cmd)) |
4045 (define-key idlwave-mode-prefix-map k1 cmd)) | 4045 (define-key idlwave-mode-prefix-map k1 cmd)) |
4046 ;; The debug modifier map | 4046 ;; The debug modifier map |
4047 (when (and mod window-system) | 4047 (when (and mod window-system) |
4048 (if (char-or-string-p c2) | 4048 (if (char-or-string-p c2) |
4052 (unless cannotshift | 4052 (unless cannotshift |
4053 (define-key idlwave-mode-map k2 cmd) | 4053 (define-key idlwave-mode-map k2 cmd) |
4054 (unless only-buffer (define-key idlwave-shell-mode-map k2 cmd)))) | 4054 (unless only-buffer (define-key idlwave-shell-mode-map k2 cmd)))) |
4055 ;; The electric debug single-keystroke map | 4055 ;; The electric debug single-keystroke map |
4056 (if (and electric (char-or-string-p c2)) | 4056 (if (and electric (char-or-string-p c2)) |
4057 (define-key idlwave-shell-electric-debug-mode-map (char-to-string c2) | 4057 (define-key idlwave-shell-electric-debug-mode-map (char-to-string c2) |
4058 cmd)))) | 4058 cmd)))) |
4059 | 4059 |
4060 ;; A few extras in the electric debug map | 4060 ;; A few extras in the electric debug map |
4061 (define-key idlwave-shell-electric-debug-mode-map " " 'idlwave-shell-step) | 4061 (define-key idlwave-shell-electric-debug-mode-map " " 'idlwave-shell-step) |
4062 (define-key idlwave-shell-electric-debug-mode-map "+" 'idlwave-shell-stack-up) | 4062 (define-key idlwave-shell-electric-debug-mode-map "+" 'idlwave-shell-stack-up) |
4063 (define-key idlwave-shell-electric-debug-mode-map "=" 'idlwave-shell-stack-up) | 4063 (define-key idlwave-shell-electric-debug-mode-map "=" 'idlwave-shell-stack-up) |
4064 (define-key idlwave-shell-electric-debug-mode-map "-" | 4064 (define-key idlwave-shell-electric-debug-mode-map "-" |
4065 'idlwave-shell-stack-down) | 4065 'idlwave-shell-stack-down) |
4066 (define-key idlwave-shell-electric-debug-mode-map "_" | 4066 (define-key idlwave-shell-electric-debug-mode-map "_" |
4067 'idlwave-shell-stack-down) | 4067 'idlwave-shell-stack-down) |
4068 (define-key idlwave-shell-electric-debug-mode-map "q" 'idlwave-shell-retall) | 4068 (define-key idlwave-shell-electric-debug-mode-map "q" 'idlwave-shell-retall) |
4069 (define-key idlwave-shell-electric-debug-mode-map "t" | 4069 (define-key idlwave-shell-electric-debug-mode-map "t" |
4070 '(lambda () (interactive) (idlwave-shell-send-command "help,/TRACE"))) | 4070 '(lambda () (interactive) (idlwave-shell-send-command "help,/TRACE"))) |
4071 (define-key idlwave-shell-electric-debug-mode-map [(control ??)] | 4071 (define-key idlwave-shell-electric-debug-mode-map [(control ??)] |
4072 'idlwave-shell-electric-debug-help) | 4072 'idlwave-shell-electric-debug-help) |
4073 (define-key idlwave-shell-electric-debug-mode-map "x" | 4073 (define-key idlwave-shell-electric-debug-mode-map "x" |
4074 '(lambda (arg) (interactive "P") | 4074 '(lambda (arg) (interactive "P") |
4075 (idlwave-shell-print arg nil nil t))) | 4075 (idlwave-shell-print arg nil nil t))) |
4076 | 4076 |
4077 | 4077 |
4078 ; Enter the prefix map in two places. | 4078 ; Enter the prefix map in two places. |
4079 (fset 'idlwave-debug-map idlwave-mode-prefix-map) | 4079 (fset 'idlwave-debug-map idlwave-mode-prefix-map) |
4090 (if idlwave-shell-electric-debug-mode | 4090 (if idlwave-shell-electric-debug-mode |
4091 (setq idlwave-shell-suppress-electric-debug t) | 4091 (setq idlwave-shell-suppress-electric-debug t) |
4092 (setq idlwave-shell-suppress-electric-debug nil)) | 4092 (setq idlwave-shell-suppress-electric-debug nil)) |
4093 (idlwave-shell-electric-debug-mode)) | 4093 (idlwave-shell-electric-debug-mode)) |
4094 | 4094 |
4095 (defvar idlwave-shell-electric-debug-read-only) | 4095 (defvar idlwave-shell-electric-debug-read-only) |
4096 (defvar idlwave-shell-electric-debug-buffers nil) | 4096 (defvar idlwave-shell-electric-debug-buffers nil) |
4097 | 4097 |
4098 (easy-mmode-define-minor-mode idlwave-shell-electric-debug-mode | 4098 (easy-mmode-define-minor-mode idlwave-shell-electric-debug-mode |
4099 "Toggle Electric Debug mode. | 4099 "Toggle Electric Debug mode. |
4100 With no argument, this command toggles the mode. | 4100 With no argument, this command toggles the mode. |
4101 Non-null prefix argument turns on the mode. | 4101 Non-null prefix argument turns on the mode. |
4102 Null prefix argument turns off the mode. | 4102 Null prefix argument turns off the mode. |
4103 | 4103 |
4104 When Electric Debug mode is enabled, the many debugging commands are | 4104 When Electric Debug mode is enabled, the many debugging commands are |
4105 available as single key sequences." | 4105 available as single key sequences." |
4106 nil | 4106 nil |
4107 " *Debugging*" | 4107 " *Debugging*" |
4108 idlwave-shell-electric-debug-mode-map) | 4108 idlwave-shell-electric-debug-mode-map) |
4109 | 4109 |
4110 (add-hook | 4110 (add-hook |
4111 'idlwave-shell-electric-debug-mode-on-hook | 4111 'idlwave-shell-electric-debug-mode-on-hook |
4112 (lambda () | 4112 (lambda () |
4113 (set (make-local-variable 'idlwave-shell-electric-debug-read-only) | 4113 (set (make-local-variable 'idlwave-shell-electric-debug-read-only) |
4114 buffer-read-only) | 4114 buffer-read-only) |
4115 (setq buffer-read-only t) | 4115 (setq buffer-read-only t) |
4116 (add-to-list 'idlwave-shell-electric-debug-buffers (current-buffer)) | 4116 (add-to-list 'idlwave-shell-electric-debug-buffers (current-buffer)) |
4117 (if idlwave-shell-stop-line-overlay | 4117 (if idlwave-shell-stop-line-overlay |
4118 (overlay-put idlwave-shell-stop-line-overlay 'face | 4118 (overlay-put idlwave-shell-stop-line-overlay 'face |
4119 idlwave-shell-electric-stop-line-face)) | 4119 idlwave-shell-electric-stop-line-face)) |
4120 (if (facep 'fringe) | 4120 (if (facep 'fringe) |
4121 (set-face-foreground 'fringe idlwave-shell-electric-stop-color | 4121 (set-face-foreground 'fringe idlwave-shell-electric-stop-color |
4122 (selected-frame))))) | 4122 (selected-frame))))) |
4123 | 4123 |
4124 (add-hook | 4124 (add-hook |
4125 'idlwave-shell-electric-debug-mode-off-hook | 4125 'idlwave-shell-electric-debug-mode-off-hook |
4126 (lambda () | 4126 (lambda () |
4127 ;; Return to previous read-only state | 4127 ;; Return to previous read-only state |
4128 (setq buffer-read-only (if (boundp 'idlwave-shell-electric-debug-read-only) | 4128 (setq buffer-read-only (if (boundp 'idlwave-shell-electric-debug-read-only) |
4129 idlwave-shell-electric-debug-read-only)) | 4129 idlwave-shell-electric-debug-read-only)) |
4130 (setq idlwave-shell-electric-debug-buffers | 4130 (setq idlwave-shell-electric-debug-buffers |
4131 (delq (current-buffer) idlwave-shell-electric-debug-buffers)) | 4131 (delq (current-buffer) idlwave-shell-electric-debug-buffers)) |
4132 (if idlwave-shell-stop-line-overlay | 4132 (if idlwave-shell-stop-line-overlay |
4133 (overlay-put idlwave-shell-stop-line-overlay 'face | 4133 (overlay-put idlwave-shell-stop-line-overlay 'face |
4134 idlwave-shell-stop-line-face) | 4134 idlwave-shell-stop-line-face) |
4135 (if (facep 'fringe) | 4135 (if (facep 'fringe) |
4136 (set-face-foreground 'fringe (face-foreground 'default)))))) | 4136 (set-face-foreground 'fringe (face-foreground 'default)))))) |
4137 | 4137 |
4138 ;; easy-mmode defines electric-debug-mode for us, so we need to advise it. | 4138 ;; easy-mmode defines electric-debug-mode for us, so we need to advise it. |
4159 (setq idlwave-shell-electric-debug-buffers nil)) | 4159 (setq idlwave-shell-electric-debug-buffers nil)) |
4160 | 4160 |
4161 ;; Show the help text | 4161 ;; Show the help text |
4162 (defun idlwave-shell-electric-debug-help () | 4162 (defun idlwave-shell-electric-debug-help () |
4163 (interactive) | 4163 (interactive) |
4164 (with-output-to-temp-buffer "*IDLWAVE Electric Debug Help*" | 4164 (with-output-to-temp-buffer "*IDLWAVE Electric Debug Help*" |
4165 (princ idlwave-shell-electric-debug-help)) | 4165 (princ idlwave-shell-electric-debug-help)) |
4166 (let* ((current-window (selected-window)) | 4166 (let* ((current-window (selected-window)) |
4167 (window (get-buffer-window "*IDLWAVE Electric Debug Help*")) | 4167 (window (get-buffer-window "*IDLWAVE Electric Debug Help*")) |
4168 (window-lines (window-height window))) | 4168 (window-lines (window-height window))) |
4169 (select-window window) | 4169 (select-window window) |
4174 ;; The Menus -------------------------------------------------------------- | 4174 ;; The Menus -------------------------------------------------------------- |
4175 (defvar idlwave-shell-menu-def | 4175 (defvar idlwave-shell-menu-def |
4176 `("Debug" | 4176 `("Debug" |
4177 ["Electric Debug Mode" | 4177 ["Electric Debug Mode" |
4178 idlwave-shell-electric-debug-mode | 4178 idlwave-shell-electric-debug-mode |
4179 :style toggle :selected idlwave-shell-electric-debug-mode | 4179 :style toggle :selected idlwave-shell-electric-debug-mode |
4180 :included (eq major-mode 'idlwave-mode) :keys "C-c C-d C-v"] | 4180 :included (eq major-mode 'idlwave-mode) :keys "C-c C-d C-v"] |
4181 "--" | 4181 "--" |
4182 ("Compile & Run" | 4182 ("Compile & Run" |
4183 ["Save and .RUN" idlwave-shell-save-and-run | 4183 ["Save and .RUN" idlwave-shell-save-and-run |
4184 (or (eq major-mode 'idlwave-mode) | 4184 (or (eq major-mode 'idlwave-mode) |
4190 (or (eq major-mode 'idlwave-mode) | 4190 (or (eq major-mode 'idlwave-mode) |
4191 idlwave-shell-last-save-and-action-file)] | 4191 idlwave-shell-last-save-and-action-file)] |
4192 "--" | 4192 "--" |
4193 ["Goto Next Error" idlwave-shell-goto-next-error t] | 4193 ["Goto Next Error" idlwave-shell-goto-next-error t] |
4194 "--" | 4194 "--" |
4195 ["Compile and Run Region" idlwave-shell-run-region | 4195 ["Compile and Run Region" idlwave-shell-run-region |
4196 (eq major-mode 'idlwave-mode)] | 4196 (eq major-mode 'idlwave-mode)] |
4197 ["Evaluate Region" idlwave-shell-evaluate-region | 4197 ["Evaluate Region" idlwave-shell-evaluate-region |
4198 (eq major-mode 'idlwave-mode)] | 4198 (eq major-mode 'idlwave-mode)] |
4199 "--" | 4199 "--" |
4200 ["Execute Default Cmd" idlwave-shell-execute-default-command-line t] | 4200 ["Execute Default Cmd" idlwave-shell-execute-default-command-line t] |
4201 ["Edit Default Cmd" idlwave-shell-edit-default-command-line t]) | 4201 ["Edit Default Cmd" idlwave-shell-edit-default-command-line t]) |
4202 ("Breakpoints" | 4202 ("Breakpoints" |
4203 ["Set Breakpoint" idlwave-shell-break-here | 4203 ["Set Breakpoint" idlwave-shell-break-here |
4204 :keys "C-c C-d C-c" :active (eq major-mode 'idlwave-mode)] | 4204 :keys "C-c C-d C-c" :active (eq major-mode 'idlwave-mode)] |
4205 ("Set Special Breakpoint" | 4205 ("Set Special Breakpoint" |
4206 ["Set After Count Breakpoint" | 4206 ["Set After Count Breakpoint" |
4207 (progn | 4207 (progn |
4208 (let ((count (string-to-int (read-string "Break after count: ")))) | 4208 (let ((count (string-to-number (read-string "Break after count: ")))) |
4209 (if (integerp count) (idlwave-shell-break-here count)))) | 4209 (if (integerp count) (idlwave-shell-break-here count)))) |
4210 :active (eq major-mode 'idlwave-mode)] | 4210 :active (eq major-mode 'idlwave-mode)] |
4211 ["Set Condition Breakpoint" | 4211 ["Set Condition Breakpoint" |
4212 (idlwave-shell-break-here '(4)) | 4212 (idlwave-shell-break-here '(4)) |
4213 :active (eq major-mode 'idlwave-mode)]) | 4213 :active (eq major-mode 'idlwave-mode)]) |
4214 ["Break in Module" idlwave-shell-break-in | 4214 ["Break in Module" idlwave-shell-break-in |
4215 :keys "C-c C-d C-i" :active (eq major-mode 'idlwave-mode)] | 4215 :keys "C-c C-d C-i" :active (eq major-mode 'idlwave-mode)] |
4216 ["Break in this Module" idlwave-shell-break-this-module | 4216 ["Break in this Module" idlwave-shell-break-this-module |
4217 :keys "C-c C-d C-j" :active (eq major-mode 'idlwave-mode)] | 4217 :keys "C-c C-d C-j" :active (eq major-mode 'idlwave-mode)] |
4218 ["Clear Breakpoint" idlwave-shell-clear-current-bp t] | 4218 ["Clear Breakpoint" idlwave-shell-clear-current-bp t] |
4219 ["Clear All Breakpoints" idlwave-shell-clear-all-bp t] | 4219 ["Clear All Breakpoints" idlwave-shell-clear-all-bp t] |
4220 ["Disable/Enable Breakpoint" idlwave-shell-toggle-enable-current-bp t] | 4220 ["Disable/Enable Breakpoint" idlwave-shell-toggle-enable-current-bp t] |
4221 ["Goto Previous Breakpoint" idlwave-shell-goto-previous-bp | 4221 ["Goto Previous Breakpoint" idlwave-shell-goto-previous-bp |
4222 :keys "C-c C-d [" :active (eq major-mode 'idlwave-mode)] | 4222 :keys "C-c C-d [" :active (eq major-mode 'idlwave-mode)] |
4223 ["Goto Next Breakpoint" idlwave-shell-goto-next-bp | 4223 ["Goto Next Breakpoint" idlwave-shell-goto-next-bp |
4224 :keys "C-c C-d ]" :active (eq major-mode 'idlwave-mode)] | 4224 :keys "C-c C-d ]" :active (eq major-mode 'idlwave-mode)] |
4225 ["List All Breakpoints" idlwave-shell-list-all-bp t] | 4225 ["List All Breakpoints" idlwave-shell-list-all-bp t] |
4226 ["Resync Breakpoints" idlwave-shell-bp-query t]) | 4226 ["Resync Breakpoints" idlwave-shell-bp-query t]) |
4227 ("Continue/Step" | 4227 ("Continue/Step" |
4228 ["Step (into)" idlwave-shell-step t] | 4228 ["Step (into)" idlwave-shell-step t] |
4250 ["Stack Down" idlwave-shell-stack-down t] | 4250 ["Stack Down" idlwave-shell-stack-down t] |
4251 "--" | 4251 "--" |
4252 ["Redisplay and Sync" idlwave-shell-redisplay t]) | 4252 ["Redisplay and Sync" idlwave-shell-redisplay t]) |
4253 ("Show Commands" | 4253 ("Show Commands" |
4254 ["Everything" (if (eq idlwave-shell-show-commands 'everything) | 4254 ["Everything" (if (eq idlwave-shell-show-commands 'everything) |
4255 (progn | 4255 (progn |
4256 (setq idlwave-shell-show-commands | 4256 (setq idlwave-shell-show-commands |
4257 (get 'idlwave-shell-show-commands 'last-val)) | 4257 (get 'idlwave-shell-show-commands 'last-val)) |
4258 (put 'idlwave-shell-show-commands 'last-val nil)) | 4258 (put 'idlwave-shell-show-commands 'last-val nil)) |
4259 (put 'idlwave-shell-show-commands 'last-val | 4259 (put 'idlwave-shell-show-commands 'last-val |
4260 idlwave-shell-show-commands) | 4260 idlwave-shell-show-commands) |
4261 (setq idlwave-shell-show-commands 'everything)) | 4261 (setq idlwave-shell-show-commands 'everything)) |
4262 :style toggle :selected (and (not (listp idlwave-shell-show-commands)) | 4262 :style toggle :selected (and (not (listp idlwave-shell-show-commands)) |
4263 (eq idlwave-shell-show-commands | 4263 (eq idlwave-shell-show-commands |
4264 'everything))] | 4264 'everything))] |
4265 "--" | 4265 "--" |
4266 ["Compiling Commands" (idlwave-shell-add-or-remove-show 'run) | 4266 ["Compiling Commands" (idlwave-shell-add-or-remove-show 'run) |
4267 :style toggle | 4267 :style toggle |
4268 :selected (not (idlwave-shell-hide-p | 4268 :selected (not (idlwave-shell-hide-p |
4269 'run | 4269 'run |
4270 (get 'idlwave-shell-show-commands 'last-val))) | 4270 (get 'idlwave-shell-show-commands 'last-val))) |
4271 :active (not (eq idlwave-shell-show-commands 'everything))] | 4271 :active (not (eq idlwave-shell-show-commands 'everything))] |
4272 ["Breakpoint Commands" (idlwave-shell-add-or-remove-show 'breakpoint) | 4272 ["Breakpoint Commands" (idlwave-shell-add-or-remove-show 'breakpoint) |
4273 :style toggle | 4273 :style toggle |
4274 :selected (not (idlwave-shell-hide-p | 4274 :selected (not (idlwave-shell-hide-p |
4275 'breakpoint | 4275 'breakpoint |
4276 (get 'idlwave-shell-show-commands 'last-val))) | 4276 (get 'idlwave-shell-show-commands 'last-val))) |
4277 :active (not (eq idlwave-shell-show-commands 'everything))] | 4277 :active (not (eq idlwave-shell-show-commands 'everything))] |
4278 ["Debug Commands" (idlwave-shell-add-or-remove-show 'debug) | 4278 ["Debug Commands" (idlwave-shell-add-or-remove-show 'debug) |
4279 :style toggle | 4279 :style toggle |
4280 :selected (not (idlwave-shell-hide-p | 4280 :selected (not (idlwave-shell-hide-p |
4281 'debug | 4281 'debug |
4282 (get 'idlwave-shell-show-commands 'last-val))) | 4282 (get 'idlwave-shell-show-commands 'last-val))) |
4283 :active (not (eq idlwave-shell-show-commands 'everything))] | 4283 :active (not (eq idlwave-shell-show-commands 'everything))] |
4284 ["Miscellaneous Commands" (idlwave-shell-add-or-remove-show 'misc) | 4284 ["Miscellaneous Commands" (idlwave-shell-add-or-remove-show 'misc) |
4285 :style toggle | 4285 :style toggle |
4286 :selected (not (idlwave-shell-hide-p | 4286 :selected (not (idlwave-shell-hide-p |
4287 'misc | 4287 'misc |
4288 (get 'idlwave-shell-show-commands 'last-val))) | 4288 (get 'idlwave-shell-show-commands 'last-val))) |
4289 :active (not (eq idlwave-shell-show-commands 'everything))]) | 4289 :active (not (eq idlwave-shell-show-commands 'everything))]) |
4290 ("Input Mode" | 4290 ("Input Mode" |
4291 ["Send one char" idlwave-shell-send-char t] | 4291 ["Send one char" idlwave-shell-send-char t] |
4295 (setq idlwave-shell-use-input-mode-magic | 4295 (setq idlwave-shell-use-input-mode-magic |
4296 (not idlwave-shell-use-input-mode-magic)) | 4296 (not idlwave-shell-use-input-mode-magic)) |
4297 :style toggle :selected idlwave-shell-use-input-mode-magic]) | 4297 :style toggle :selected idlwave-shell-use-input-mode-magic]) |
4298 "--" | 4298 "--" |
4299 ["Update Working Dir" idlwave-shell-resync-dirs t] | 4299 ["Update Working Dir" idlwave-shell-resync-dirs t] |
4300 ["Save Path Info" | 4300 ["Save Path Info" |
4301 (idlwave-shell-send-command idlwave-shell-path-query | 4301 (idlwave-shell-send-command idlwave-shell-path-query |
4302 'idlwave-shell-get-path-info | 4302 'idlwave-shell-get-path-info |
4303 'hide) | 4303 'hide) |
4304 t] | 4304 t] |
4305 ["Reset IDL" idlwave-shell-reset t] | 4305 ["Reset IDL" idlwave-shell-reset t] |
4307 ["Toggle Toolbar" idlwave-shell-toggle-toolbar t] | 4307 ["Toggle Toolbar" idlwave-shell-toggle-toolbar t] |
4308 ["Exit IDL" idlwave-shell-quit t])) | 4308 ["Exit IDL" idlwave-shell-quit t])) |
4309 | 4309 |
4310 (if (or (featurep 'easymenu) (load "easymenu" t)) | 4310 (if (or (featurep 'easymenu) (load "easymenu" t)) |
4311 (progn | 4311 (progn |
4312 (easy-menu-define | 4312 (easy-menu-define |
4313 idlwave-mode-debug-menu idlwave-mode-map "IDL debugging menus" | 4313 idlwave-mode-debug-menu idlwave-mode-map "IDL debugging menus" |
4314 idlwave-shell-menu-def) | 4314 idlwave-shell-menu-def) |
4315 (easy-menu-define | 4315 (easy-menu-define |
4316 idlwave-shell-mode-menu idlwave-shell-mode-map "IDL shell menus" | 4316 idlwave-shell-mode-menu idlwave-shell-mode-map "IDL shell menus" |
4317 idlwave-shell-menu-def) | 4317 idlwave-shell-menu-def) |
4327 ;; The Breakpoint Glyph ------------------------------------------------------- | 4327 ;; The Breakpoint Glyph ------------------------------------------------------- |
4328 | 4328 |
4329 (defvar idlwave-shell-bp-glyph nil | 4329 (defvar idlwave-shell-bp-glyph nil |
4330 "The glyphs to mark breakpoint lines in the source code.") | 4330 "The glyphs to mark breakpoint lines in the source code.") |
4331 | 4331 |
4332 (let ((image-alist | 4332 (let ((image-alist |
4333 '((bp . "/* XPM */ | 4333 '((bp . "/* XPM */ |
4334 static char * file[] = { | 4334 static char * file[] = { |
4335 \"14 12 3 1\", | 4335 \"14 12 3 1\", |
4336 \" c None s backgroundColor\", | 4336 \" c None s backgroundColor\", |
4337 \". c #4B4B4B4B4B4B\", | 4337 \". c #4B4B4B4B4B4B\", |
4460 \" .XXoXXoXX. \", | 4460 \" .XXoXXoXX. \", |
4461 \" .XoXXoX. \", | 4461 \" .XoXXoX. \", |
4462 \" .XXXX. \", | 4462 \" .XXXX. \", |
4463 \" .... \", | 4463 \" .... \", |
4464 \" \"};"))) im-cons im) | 4464 \" \"};"))) im-cons im) |
4465 | 4465 |
4466 (while (setq im-cons (pop image-alist)) | 4466 (while (setq im-cons (pop image-alist)) |
4467 (setq im (cond ((and (featurep 'xemacs) | 4467 (setq im (cond ((and (featurep 'xemacs) |
4468 (featurep 'xpm)) | 4468 (featurep 'xpm)) |
4469 (list | 4469 (list |
4470 (let ((data (cdr im-cons))) | 4470 (let ((data (cdr im-cons))) |
4473 (make-glyph data)) | 4473 (make-glyph data)) |
4474 (make-glyph (cdr im-cons)))) | 4474 (make-glyph (cdr im-cons)))) |
4475 ((and (not (featurep 'xemacs)) | 4475 ((and (not (featurep 'xemacs)) |
4476 (fboundp 'image-type-available-p) | 4476 (fboundp 'image-type-available-p) |
4477 (image-type-available-p 'xpm)) | 4477 (image-type-available-p 'xpm)) |
4478 (list 'image :type 'xpm :data (cdr im-cons) | 4478 (list 'image :type 'xpm :data (cdr im-cons) |
4479 :ascent 'center)) | 4479 :ascent 'center)) |
4480 (t nil))) | 4480 (t nil))) |
4481 (if im (push (cons (car im-cons) im) idlwave-shell-bp-glyph)))) | 4481 (if im (push (cons (car im-cons) im) idlwave-shell-bp-glyph)))) |
4482 | 4482 |
4483 (provide 'idlw-shell) | 4483 (provide 'idlw-shell) |
4484 (provide 'idlwave-shell) | 4484 (provide 'idlwave-shell) |
4485 | 4485 |
4486 ;;; Load the toolbar when wanted by the user. | 4486 ;;; Load the toolbar when wanted by the user. |
4487 | 4487 |
4488 (autoload 'idlwave-toolbar-toggle "idlw-toolbar" | 4488 (autoload 'idlwave-toolbar-toggle "idlw-toolbar" |
4489 "Toggle the IDLWAVE toolbar") | 4489 "Toggle the IDLWAVE toolbar") |
4490 (autoload 'idlwave-toolbar-add-everywhere "idlw-toolbar" | 4490 (autoload 'idlwave-toolbar-add-everywhere "idlw-toolbar" |
4491 "Add IDLWAVE toolbar") | 4491 "Add IDLWAVE toolbar") |
4492 (defun idlwave-shell-toggle-toolbar () | 4492 (defun idlwave-shell-toggle-toolbar () |
4493 "Toggle the display of the debugging toolbar." | 4493 "Toggle the display of the debugging toolbar." |