aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/progmodes
diff options
context:
space:
mode:
authorMiles Bader2005-05-20 04:22:05 +0000
committerMiles Bader2005-05-20 04:22:05 +0000
commit64e9342958694825be1664890dcd22fffcd50d3a (patch)
treea43e1796f5a49ae7eeec671447d10ac3731a1834 /lisp/progmodes
parent5447510256e5a1b371407b751ddcc461044da5df (diff)
parenta18ff9886771c41186eebf8d7984fee2120dbe36 (diff)
downloademacs-64e9342958694825be1664890dcd22fffcd50d3a.tar.gz
emacs-64e9342958694825be1664890dcd22fffcd50d3a.zip
Revision: miles@gnu.org--gnu-2005/emacs--unicode--0--patch-53
Merge from emacs--cvs-trunk--0 Patches applied: * emacs--cvs-trunk--0 (patch 302-319) - Update from CVS - Merge from gnus--rel--5.10 * gnus--rel--5.10 (patch 69) - Update from CVS
Diffstat (limited to 'lisp/progmodes')
-rw-r--r--lisp/progmodes/ada-xref.el6
-rw-r--r--lisp/progmodes/antlr-mode.el1
-rw-r--r--lisp/progmodes/cc-engine.el3
-rw-r--r--lisp/progmodes/cc-fonts.el2
-rw-r--r--lisp/progmodes/compile.el31
-rw-r--r--lisp/progmodes/cperl-mode.el2
-rw-r--r--lisp/progmodes/delphi.el2
-rw-r--r--lisp/progmodes/ebrowse.el12
-rw-r--r--lisp/progmodes/etags.el16
-rw-r--r--lisp/progmodes/flymake.el2
-rw-r--r--lisp/progmodes/gud.el8
-rw-r--r--lisp/progmodes/idlw-shell.el612
-rw-r--r--lisp/progmodes/inf-lisp.el12
-rw-r--r--lisp/progmodes/make-mode.el557
-rw-r--r--lisp/progmodes/perl-mode.el30
-rw-r--r--lisp/progmodes/prolog.el14
-rw-r--r--lisp/progmodes/ps-mode.el2
-rw-r--r--lisp/progmodes/sh-script.el60
-rw-r--r--lisp/progmodes/tcl.el33
-rw-r--r--lisp/progmodes/vhdl-mode.el8
20 files changed, 848 insertions, 565 deletions
diff --git a/lisp/progmodes/ada-xref.el b/lisp/progmodes/ada-xref.el
index e7eb0657eac..8dba21afe9b 100644
--- a/lisp/progmodes/ada-xref.el
+++ b/lisp/progmodes/ada-xref.el
@@ -672,7 +672,7 @@ file. If none is set, return nil."
672 (not (integerp choice)) 672 (not (integerp choice))
673 (< choice 1) 673 (< choice 1)
674 (> choice (length prj-files))) 674 (> choice (length prj-files)))
675 (setq choice (string-to-int 675 (setq choice (string-to-number
676 (read-from-minibuffer "Enter No. of your choice: ")))) 676 (read-from-minibuffer "Enter No. of your choice: "))))
677 (set 'selected (nth (1- choice) prj-files)))) 677 (set 'selected (nth (1- choice) prj-files))))
678 678
@@ -1800,7 +1800,7 @@ This function is disabled for operators, and only works for identifiers."
1800 (< choice 1) 1800 (< choice 1)
1801 (> choice len)) 1801 (> choice len))
1802 (setq choice 1802 (setq choice
1803 (string-to-int 1803 (string-to-number
1804 (read-from-minibuffer "Enter No. of your choice: ")))) 1804 (read-from-minibuffer "Enter No. of your choice: "))))
1805 ) 1805 )
1806 (set-buffer ali-buffer) 1806 (set-buffer ali-buffer)
@@ -1988,7 +1988,7 @@ is using."
1988 (< choice 1) 1988 (< choice 1)
1989 (> choice (length list))) 1989 (> choice (length list)))
1990 (setq choice 1990 (setq choice
1991 (string-to-int 1991 (string-to-number
1992 (read-from-minibuffer "Enter No. of your choice: ")))) 1992 (read-from-minibuffer "Enter No. of your choice: "))))
1993 ) 1993 )
1994 (set 'choice (1- choice)) 1994 (set 'choice (1- choice))
diff --git a/lisp/progmodes/antlr-mode.el b/lisp/progmodes/antlr-mode.el
index 1a35fe41860..03587577f59 100644
--- a/lisp/progmodes/antlr-mode.el
+++ b/lisp/progmodes/antlr-mode.el
@@ -785,6 +785,7 @@ bound to `antlr-language'. For example, with value
785 \((java-mode \. 2) (c++-mode \. 0)) 785 \((java-mode \. 2) (c++-mode \. 0))
786Java actions are fontified with level 2 and C++ actions are not 786Java actions are fontified with level 2 and C++ actions are not
787fontified at all." 787fontified at all."
788 :group 'antlr
788 :type '(choice (const :tag "None" none) 789 :type '(choice (const :tag "None" none)
789 (const :tag "Inherit" inherit) 790 (const :tag "Inherit" inherit)
790 (const :tag "Default" nil) 791 (const :tag "Default" nil)
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index ea36064412f..0a4cb6c8cd6 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -335,7 +335,8 @@ This function does not do any hidden buffer changes."
335;; locking is in use. This variable is extended with the face in 335;; locking is in use. This variable is extended with the face in
336;; `c-doc-face-name' when fontification is activated in cc-fonts.el. 336;; `c-doc-face-name' when fontification is activated in cc-fonts.el.
337(defvar c-literal-faces 337(defvar c-literal-faces
338 '(font-lock-comment-face font-lock-string-face)) 338 '(font-lock-comment-face font-lock-string-face
339 font-lock-comment-delimiter-face))
339 340
340(defun c-shift-line-indentation (shift-amt) 341(defun c-shift-line-indentation (shift-amt)
341 ;; This function does not do any hidden buffer changes. 342 ;; This function does not do any hidden buffer changes.
diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el
index 74efef4133f..26c0bdaf60f 100644
--- a/lisp/progmodes/cc-fonts.el
+++ b/lisp/progmodes/cc-fonts.el
@@ -673,7 +673,7 @@ casts and declarations are fontified. Used on level 2 and higher."
673 (c-font-lock-objc-iip-decl))) 673 (c-font-lock-objc-iip-decl)))
674 nil)))))) 674 nil))))))
675 675
676 ("!" . font-lock-negation-char-face) 676 ("\\(!\\)[^=]" 1 font-lock-negation-char-face)
677 )) 677 ))
678 678
679(defun c-font-lock-complex-decl-prepare (limit) 679(defun c-font-lock-complex-decl-prepare (limit)
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index f5180b1fb48..ad43228a100 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -119,6 +119,10 @@ nil means compute the name with `(concat \"*\" (downcase major-mode) \"*\")'.")
119It is called with two arguments: the compilation buffer, and a string 119It is called with two arguments: the compilation buffer, and a string
120describing how the process finished.") 120describing how the process finished.")
121 121
122(make-obsolete-variable 'compilation-finish-function
123 "Use `compilation-finish-functions', but it works a little differently."
124 "22.1")
125
122;;;###autoload 126;;;###autoload
123(defvar compilation-finish-functions nil 127(defvar compilation-finish-functions nil
124 "Functions to call when a compilation process finishes. 128 "Functions to call when a compilation process finishes.
@@ -1247,8 +1251,7 @@ Optional argument MINOR indicates this is called from
1247 (make-local-variable 'compilation-messages-start) 1251 (make-local-variable 'compilation-messages-start)
1248 (make-local-variable 'compilation-error-screen-columns) 1252 (make-local-variable 'compilation-error-screen-columns)
1249 (make-local-variable 'overlay-arrow-position) 1253 (make-local-variable 'overlay-arrow-position)
1250 (set (make-local-variable 'overlay-arrow-string) 1254 (set (make-local-variable 'overlay-arrow-string) "")
1251 (if (display-graphic-p) "=>" ""))
1252 (setq next-error-overlay-arrow-position nil) 1255 (setq next-error-overlay-arrow-position nil)
1253 (add-hook 'kill-buffer-hook 1256 (add-hook 'kill-buffer-hook
1254 (lambda () (setq next-error-overlay-arrow-position nil)) nil t) 1257 (lambda () (setq next-error-overlay-arrow-position nil)) nil t)
@@ -1575,9 +1578,12 @@ region and the first line of the next region."
1575 (setcdr loc (list line file marker))) 1578 (setcdr loc (list line file marker)))
1576 loc)) 1579 loc))
1577 1580
1578(defcustom compilation-context-lines 0 1581(defcustom compilation-context-lines nil
1579 "*Display this many lines of leading context before message. 1582 "Display this many lines of leading context before the current message.
1580If nil, don't scroll the compilation output window." 1583If nil and the left fringe is displayed, don't scroll the
1584compilation output window; an arrow in the left fringe points to
1585the current message. If nil and there is no left fringe, the message
1586displays at the top of the window; there is no arrow."
1581 :type '(choice integer (const :tag "No window scrolling" nil)) 1587 :type '(choice integer (const :tag "No window scrolling" nil))
1582 :group 'compilation 1588 :group 'compilation
1583 :version "22.1") 1589 :version "22.1")
@@ -1586,10 +1592,17 @@ If nil, don't scroll the compilation output window."
1586 "Align the compilation output window W with marker MK near top." 1592 "Align the compilation output window W with marker MK near top."
1587 (if (integerp compilation-context-lines) 1593 (if (integerp compilation-context-lines)
1588 (set-window-start w (save-excursion 1594 (set-window-start w (save-excursion
1589 (goto-char mk) 1595 (goto-char mk)
1590 (beginning-of-line (- 1 compilation-context-lines)) 1596 (beginning-of-line
1591 (point)))) 1597 (- 1 compilation-context-lines))
1592 (set-window-point w mk)) 1598 (point)))
1599 ;; If there is no left fringe.
1600 (if (equal (car (window-fringes)) 0)
1601 (set-window-start w (save-excursion
1602 (goto-char mk)
1603 (beginning-of-line 1)
1604 (point)))))
1605 (set-window-point w mk))
1593 1606
1594(defvar next-error-highlight-timer) 1607(defvar next-error-highlight-timer)
1595 1608
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index e32a43ede9e..436bc04d044 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -120,7 +120,7 @@
120 ;; Probably will not work due to some save-excursion??? 120 ;; Probably will not work due to some save-excursion???
121 ;; Or save-file-position? 121 ;; Or save-file-position?
122 ;; (message "Did I get to line %s?" (elt (, elt) 1)) 122 ;; (message "Did I get to line %s?" (elt (, elt) 1))
123 `(goto-line (string-to-int (elt ,elt 1)))) 123 `(goto-line (string-to-number (elt ,elt 1))))
124 ;;) 124 ;;)
125 (defmacro cperl-etags-goto-tag-location (elt) 125 (defmacro cperl-etags-goto-tag-location (elt)
126 `(etags-goto-tag-location ,elt)))) 126 `(etags-goto-tag-location ,elt))))
diff --git a/lisp/progmodes/delphi.el b/lisp/progmodes/delphi.el
index 4ebbc549697..8d3ee554026 100644
--- a/lisp/progmodes/delphi.el
+++ b/lisp/progmodes/delphi.el
@@ -1530,7 +1530,7 @@ before the indent, the point is moved to the indent."
1530 (save-selected-window 1530 (save-selected-window
1531 (switch-to-buffer-other-window to-buffer) 1531 (switch-to-buffer-other-window to-buffer)
1532 (goto-char (point-max)) 1532 (goto-char (point-max))
1533 (set-window-dot (get-buffer-window to-buffer) (point)) 1533 (set-window-point (get-buffer-window to-buffer) (point))
1534 (insert the-msg)))) 1534 (insert the-msg))))
1535 1535
1536;; Debugging helpers: 1536;; Debugging helpers:
diff --git a/lisp/progmodes/ebrowse.el b/lisp/progmodes/ebrowse.el
index 457c00d9008..6dd15897e7b 100644
--- a/lisp/progmodes/ebrowse.el
+++ b/lisp/progmodes/ebrowse.el
@@ -1448,10 +1448,10 @@ Pop to member buffer if no prefix ARG, to tree buffer otherwise."
1448(defun ebrowse-set-tree-indentation () 1448(defun ebrowse-set-tree-indentation ()
1449 "Set the indentation width of the tree display." 1449 "Set the indentation width of the tree display."
1450 (interactive) 1450 (interactive)
1451 (let ((width (string-to-int (read-from-minibuffer 1451 (let ((width (string-to-number (read-from-minibuffer
1452 (concat "Indentation (" 1452 (concat "Indentation ("
1453 (int-to-string ebrowse--indentation) 1453 (int-to-string ebrowse--indentation)
1454 "): "))))) 1454 "): ")))))
1455 (when (plusp width) 1455 (when (plusp width)
1456 (setf ebrowse--indentation width) 1456 (setf ebrowse--indentation width)
1457 (ebrowse-redraw-tree)))) 1457 (ebrowse-redraw-tree))))
@@ -2329,7 +2329,7 @@ With prefix ARG, switch to the tree buffer else pop to it."
2329 "Set the column width of the member display. 2329 "Set the column width of the member display.
2330The new width is read from the minibuffer." 2330The new width is read from the minibuffer."
2331 (interactive) 2331 (interactive)
2332 (let ((width (string-to-int 2332 (let ((width (string-to-number
2333 (read-from-minibuffer 2333 (read-from-minibuffer
2334 (concat "Column width (" 2334 (concat "Column width ("
2335 (int-to-string (if ebrowse--long-display-flag 2335 (int-to-string (if ebrowse--long-display-flag
@@ -4313,7 +4313,7 @@ NUMBER-OF-STATIC-VARIABLES:"
4313 "Select the nth entry in the list by the keys 1..9." 4313 "Select the nth entry in the list by the keys 1..9."
4314 (interactive) 4314 (interactive)
4315 (let* ((maxlin (count-lines (point-min) (point-max))) 4315 (let* ((maxlin (count-lines (point-min) (point-max)))
4316 (n (min maxlin (+ 2 (string-to-int (this-command-keys)))))) 4316 (n (min maxlin (+ 2 (string-to-number (this-command-keys))))))
4317 (goto-line n) 4317 (goto-line n)
4318 (throw 'electric-buffer-menu-select (point)))) 4318 (throw 'electric-buffer-menu-select (point))))
4319 4319
diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 0569d26db61..32ede0e1474 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -1283,16 +1283,16 @@ where they were found."
1283 1283
1284 1284
1285 (if (looking-at "[0-9]") 1285 (if (looking-at "[0-9]")
1286 (setq line (string-to-int (buffer-substring 1286 (setq line (string-to-number (buffer-substring
1287 (point) 1287 (point)
1288 (progn (skip-chars-forward "0-9") 1288 (progn (skip-chars-forward "0-9")
1289 (point)))))) 1289 (point))))))
1290 (search-forward ",") 1290 (search-forward ",")
1291 (if (looking-at "[0-9]") 1291 (if (looking-at "[0-9]")
1292 (setq startpos (string-to-int (buffer-substring 1292 (setq startpos (string-to-number (buffer-substring
1293 (point) 1293 (point)
1294 (progn (skip-chars-forward "0-9") 1294 (progn (skip-chars-forward "0-9")
1295 (point))))))) 1295 (point)))))))
1296 ;; Leave point on the next line of the tags file. 1296 ;; Leave point on the next line of the tags file.
1297 (forward-line 1) 1297 (forward-line 1)
1298 (cons tag-text (cons line startpos)))) 1298 (cons tag-text (cons line startpos))))
diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index a2fa660bff0..5463ee3ffa9 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -1004,7 +1004,7 @@ Return its components if so, nil if no."
1004 (line-idx (nth 2 (car patterns)))) 1004 (line-idx (nth 2 (car patterns))))
1005 1005
1006 (setq raw-file-name (if file-idx (match-string file-idx line) nil)) 1006 (setq raw-file-name (if file-idx (match-string file-idx line) nil))
1007 (setq line-no (if line-idx (string-to-int (match-string line-idx line)) 0)) 1007 (setq line-no (if line-idx (string-to-number (match-string line-idx line)) 0))
1008 (setq err-text (if (> (length (car patterns)) 4) 1008 (setq err-text (if (> (length (car patterns)) 4)
1009 (match-string (nth 4 (car patterns)) line) 1009 (match-string (nth 4 (car patterns)) line)
1010 (flymake-patch-err-text (substring line (match-end 0))))) 1010 (flymake-patch-err-text (substring line (match-end 0)))))
diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el
index 5c81ba7f6f9..4c95fc65d58 100644
--- a/lisp/progmodes/gud.el
+++ b/lisp/progmodes/gud.el
@@ -3215,7 +3215,7 @@ This event can be examined by forms in GUD-TOOLTIP-DISPLAY.")
3215 (add-hook 'tooltip-hook 'gud-tooltip-tips) 3215 (add-hook 'tooltip-hook 'gud-tooltip-tips)
3216 (define-key global-map [mouse-movement] 'gud-tooltip-mouse-motion)) 3216 (define-key global-map [mouse-movement] 'gud-tooltip-mouse-motion))
3217 (unless tooltip-mode (remove-hook 'pre-command-hook 'tooltip-hide) 3217 (unless tooltip-mode (remove-hook 'pre-command-hook 'tooltip-hide)
3218 (remove-hook 'change-major-mode-hook 'tooltip-change-major-mode) 3218 (remove-hook 'change-major-mode-hook 'gud-tooltip-change-major-mode)
3219 (remove-hook 'tooltip-hook 'gud-tooltip-tips) 3219 (remove-hook 'tooltip-hook 'gud-tooltip-tips)
3220 (define-key global-map [mouse-movement] 'ignore))) 3220 (define-key global-map [mouse-movement] 'ignore)))
3221 (gud-tooltip-activate-mouse-motions-if-enabled) 3221 (gud-tooltip-activate-mouse-motions-if-enabled)
@@ -3253,7 +3253,7 @@ If GUD-TOOLTIP-DEREFERENCE is t, also prepend a `*' to EXPR."
3253 (when gud-tooltip-dereference 3253 (when gud-tooltip-dereference
3254 (setq expr (concat "*" expr))) 3254 (setq expr (concat "*" expr)))
3255 (case gud-minor-mode 3255 (case gud-minor-mode
3256 ((gdb gdba) (concat "server print " expr)) 3256 (gdba (concat "server print " expr))
3257 ((dbx gdbmi) (concat "print " expr)) 3257 ((dbx gdbmi) (concat "print " expr))
3258 (xdb (concat "p " expr)) 3258 (xdb (concat "p " expr))
3259 (sdb (concat expr "/")) 3259 (sdb (concat expr "/"))
@@ -3293,6 +3293,10 @@ This function must return nil if it doesn't handle EVENT."
3293 (tooltip-show (cdr define-elt)) 3293 (tooltip-show (cdr define-elt))
3294 expr)))) 3294 expr))))
3295 (let ((cmd (gud-tooltip-print-command expr))) 3295 (let ((cmd (gud-tooltip-print-command expr)))
3296 (when (and gud-tooltip-mode (eq gud-minor-mode 'gdb))
3297 (gud-tooltip-mode -1)
3298 (message-box "Using GUD tooltips in this mode is unsafe\n\
3299so they have been disabled."))
3296 (unless (null cmd) ; CMD can be nil if unknown debugger 3300 (unless (null cmd) ; CMD can be nil if unknown debugger
3297 (if (memq gud-minor-mode '(gdba gdbmi)) 3301 (if (memq gud-minor-mode '(gdba gdbmi))
3298 (if gdb-macro-info 3302 (if gdb-macro-info
diff --git a/lisp/progmodes/idlw-shell.el b/lisp/progmodes/idlw-shell.el
index 221a6f4aebb..77244819f1b 100644
--- a/lisp/progmodes/idlw-shell.el
+++ b/lisp/progmodes/idlw-shell.el
@@ -45,7 +45,7 @@
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:
@@ -58,9 +58,9 @@
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;;
@@ -77,7 +77,7 @@
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;;
@@ -101,12 +101,12 @@
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
@@ -118,10 +118,10 @@
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.
122For example, \"^IDL> \" or \"^WAVE> \". 122For example, \"^IDL> \" or \"^WAVE> \".
123The \"^\" means beginning of line, and is required. 123The \"^\" means beginning of line, and is required.
124This variable is used to initialize `comint-prompt-regexp' in the 124This variable is used to initialize `comint-prompt-regexp' in the
125process buffer. 125process buffer.
126 126
127This is a fine thing to set in your `.emacs' file." 127This is a fine thing to set in your `.emacs' file."
@@ -210,7 +210,7 @@ So by default setting a breakpoint will be on C-c C-d C-b."
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.
214This occurs at a breakpoint or any other halt. The mode is exited 214This occurs at a breakpoint or any other halt. The mode is exited
215upon return to the main level. Can be set to 'breakpoint to enter 215upon return to the main level. Can be set to 'breakpoint to enter
216electric debug mode only when breakpoints are tripped." 216electric debug mode only when breakpoints are tripped."
@@ -295,7 +295,7 @@ The history is only saved if the variable `idlwave-shell-save-command-history'
295is non-nil." 295is 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.
@@ -306,12 +306,12 @@ the copious shell traffic to be displayed."
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")
@@ -322,14 +322,14 @@ the copious shell traffic to be displayed."
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.
326The keys are used in the selection popup created by 326The 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
328a command to the shell, with special sequence `___' replaced by the 328a command to the shell, with special sequence `___' replaced by the
329expression being examined." 329expression 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
@@ -340,7 +340,7 @@ expression being examined."
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)
@@ -403,7 +403,7 @@ strings. Here is some example code which makes use of the default spells.
403 answer = GET_KBRD(1) 403 answer = GET_KBRD(1)
404 404
405Since the IDLWAVE shell defines the system variable `!IDLWAVE_VERSION', 405Since the IDLWAVE shell defines the system variable `!IDLWAVE_VERSION',
406you could actually check if you are running under Emacs before printing 406you could actually check if you are running under Emacs before printing
407the magic strings. Here is a procedure which uses this. 407the magic strings. Here is a procedure which uses this.
408 408
409Usage: 409Usage:
@@ -420,7 +420,7 @@ pro idlwave_char_input,on=on,off=off
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
424end" 424end"
425 :group 'idlwave-shell-command-setup 425 :group 'idlwave-shell-command-setup
426 :type '(list 426 :type '(list
@@ -478,10 +478,10 @@ line where IDL is stopped. See also `idlwave-shell-mark-stop-line'."
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)
@@ -527,7 +527,7 @@ lines which have a breakpoint. See also `idlwave-shell-mark-breakpoints'."
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.
533Allows you to choose the font, color and other properties for 533Allows you to choose the font, color and other properties for
@@ -580,18 +580,18 @@ before use by the shell.")
580 580
581TYPE is either 'pro' or 'rinfo', and `idlwave-shell-temp-pro-file' or 581TYPE 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."
@@ -619,7 +619,7 @@ TYPE is either 'pro' or 'rinfo', and `idlwave-shell-temp-pro-file' or
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
623the directory stack.") 623the 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+'>'"
@@ -627,7 +627,7 @@ the directory stack.")
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.")
@@ -678,7 +678,7 @@ the directory stack.")
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
@@ -686,7 +686,7 @@ the directory stack.")
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
@@ -747,7 +747,7 @@ with `*'s."
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.")
@@ -791,7 +791,7 @@ IDL has currently stepped.")
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.
@@ -817,7 +817,7 @@ IDL has currently stepped.")
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:
@@ -871,18 +871,18 @@ IDL has currently stepped.")
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
8824. Debugging 8824. 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.
@@ -974,8 +974,8 @@ IDL has currently stepped.")
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
@@ -1010,14 +1010,14 @@ IDL has currently stepped.")
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
@@ -1059,8 +1059,8 @@ IDL has currently stepped.")
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
@@ -1081,7 +1081,7 @@ IDL has currently stepped.")
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
@@ -1089,7 +1089,7 @@ IDL has currently stepped.")
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) )
@@ -1125,8 +1125,8 @@ IDL has currently stepped.")
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))
@@ -1144,9 +1144,9 @@ IDL has currently stepped.")
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)'.
@@ -1173,14 +1173,14 @@ See also the variable `idlwave-shell-prompt-pattern'.
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"))
@@ -1207,9 +1207,9 @@ See also the variable `idlwave-shell-prompt-pattern'.
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)
@@ -1240,7 +1240,7 @@ Return either nil or 'hide."
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
@@ -1261,18 +1261,18 @@ 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
1262output to complete and the next prompt to arrive before returning 1262output 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
1264prompt is present and if `idlwave-shell-ready' is non-nil. 1264prompt is present and if `idlwave-shell-ready' is non-nil.
1265 1265
1266If SHOW-IF-ERROR is non-nil, show the output it it contains an error 1266If SHOW-IF-ERROR is non-nil, show the output it it contains an error
1267message, independent of what HIDE is set to." 1267message, 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))
@@ -1300,7 +1300,7 @@ message, independent of what HIDE is set to."
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)))
@@ -1349,7 +1349,7 @@ message, independent of what HIDE is set to."
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
@@ -1390,7 +1390,7 @@ when the IDL prompt gets displayed again after the current IDL command."
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
@@ -1470,14 +1470,14 @@ 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.
1483When the IDL prompt is received executes `idlwave-shell-post-command-hook' 1483When the IDL prompt is received executes `idlwave-shell-post-command-hook'
@@ -1509,20 +1509,20 @@ and then calls `idlwave-shell-send-command' for any pending commands."
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
@@ -1558,16 +1558,16 @@ and then calls `idlwave-shell-send-command' for any pending commands."
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
@@ -1612,7 +1612,7 @@ and then calls `idlwave-shell-send-command' for any pending commands."
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)
@@ -1636,8 +1636,8 @@ and then calls `idlwave-shell-send-command' for any pending commands."
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.
1641The 1st pair matches the file name, the second pair matches the line 1641The 1st pair matches the file name, the second pair matches the line
1642number.") 1642number.")
1643 1643
@@ -1645,16 +1645,16 @@ number.")
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 [..]
@@ -1672,7 +1672,7 @@ number.")
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.
1675The 1st group should match the subroutine name. 1675The 1st group should match the subroutine name.
1676The 3rd group is the line number. 1676The 3rd group is the line number.
1677The 5th group is the file name. 1677The 5th group is the file name.
1678All parts may contain linebreaks surrounded by spaces. This is important 1678All parts may contain linebreaks surrounded by spaces. This is important
@@ -1691,9 +1691,9 @@ the above."
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
@@ -1707,19 +1707,19 @@ the above."
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
@@ -1729,25 +1729,25 @@ the above."
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))
@@ -1760,9 +1760,9 @@ the above."
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)
@@ -1777,7 +1777,7 @@ We need to work hard here to remove the stupid line breaks inserted by
1777IDL5. These line breaks can be right in the middle of procedure 1777IDL5. These line breaks can be right in the middle of procedure
1778or file names. 1778or file names.
1779It is very difficult to come up with a robust solution. This one seems 1779It is very difficult to come up with a robust solution. This one seems
1780to be pretty good though. 1780to be pretty good though.
1781 1781
1782Here is in what ways it improves over the previous solution: 1782Here is in what ways it improves over the previous solution:
1783 1783
@@ -1802,7 +1802,7 @@ statements."
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))
@@ -1811,7 +1811,7 @@ statements."
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))))
@@ -1828,7 +1828,7 @@ The last line of STRING may be garbage - we check which one makes a valid
1828file name." 1828file 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)
@@ -1883,7 +1883,7 @@ file name."
1883The size is given by `idlwave-shell-graphics-window-size'." 1883The 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)))
@@ -1903,16 +1903,16 @@ directory."
1903Also get rid of widget events in the queue." 1903Also 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)
@@ -1928,7 +1928,7 @@ With prefix ARG, exit without confirmation."
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.
1931This issues the following commands: 1931This issues the following commands:
1932RETALL 1932RETALL
1933WIDGET_CONTROL,/RESET 1933WIDGET_CONTROL,/RESET
1934CLOSE, /ALL 1934CLOSE, /ALL
@@ -1978,14 +1978,14 @@ HEAP_GC, /VERBOSE"
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.
@@ -2003,59 +2003,59 @@ HEAP_GC, /VERBOSE"
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 2033 (cons 'compiled
2034 (if file 2034 (if file
2035 (list 2035 (list
2036 (file-name-nondirectory file) 2036 (file-name-nondirectory file)
2037 (idlwave-sintern-dir 2037 (idlwave-sintern-dir
2038 (file-name-directory file))))) 2038 (file-name-directory file)))))
2039 cs (cons nil keys))) 2039 cs (cons nil keys)))
2040 (if file 2040 (if file
2041 (push entry idlwave-compiled-routines) 2041 (push entry idlwave-compiled-routines)
2042 (push entry idlwave-unresolved-routines))) 2042 (push entry idlwave-unresolved-routines)))
2043 2043
2044 ((and (string= type "FUN") 2044 ((and (string= type "FUN")
2045 ;; FIXME: is it OK to make the buffer routines dominate? 2045 ;; FIXME: is it OK to make the buffer routines dominate?
2046 (or t (not file) 2046 (or t (not file)
2047 (not (idlwave-rinfo-assq name 'fun class 2047 (not (idlwave-rinfo-assq name 'fun class
2048 idlwave-buffer-routines))) 2048 idlwave-buffer-routines)))
2049 ;; FIXME: is it OK to make the library routines dominate? 2049 ;; FIXME: is it OK to make the library routines dominate?
2050 ;; (not (idlwave-rinfo-assq name 'fun class 2050 ;; (not (idlwave-rinfo-assq name 'fun class
2051 ;; idlwave-library-routines)) 2051 ;; idlwave-library-routines))
2052 ) 2052 )
2053 (setq entry (list name 'fun class 2053 (setq entry (list name 'fun class
2054 (cons 'compiled 2054 (cons 'compiled
2055 (if file 2055 (if file
2056 (list 2056 (list
2057 (file-name-nondirectory file) 2057 (file-name-nondirectory file)
2058 (idlwave-sintern-dir 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
@@ -2072,7 +2072,7 @@ Change the default directory for the process buffer to concur."
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)
@@ -2086,10 +2086,10 @@ Change the default directory for the process buffer to concur."
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))
@@ -2117,7 +2117,7 @@ Change the default directory for the process buffer to concur."
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)
@@ -2131,7 +2131,7 @@ 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))
@@ -2141,7 +2141,7 @@ keywords."
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
@@ -2160,7 +2160,7 @@ keywords."
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)))))
@@ -2182,7 +2182,7 @@ keywords."
2182We assume that we are after a file name when completing one of the 2182We assume that we are after a file name when completing one of the
2183args of an executive .run, .rnew or .compile." 2183args 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
@@ -2223,7 +2223,7 @@ args of an executive .run, .rnew or .compile."
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.
2226Issues a \"help,/trace\" command followed by a call to 2226Issues 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
2228overlays." 2228overlays."
2229 (interactive) 2229 (interactive)
@@ -2236,7 +2236,7 @@ overlays."
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
@@ -2267,14 +2267,14 @@ overlays."
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))))))
@@ -2305,7 +2305,7 @@ used. Does nothing if the resulting frame is nil."
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
@@ -2323,7 +2323,7 @@ column in the line. If NO-DEBUG is non-nil, do *not* toggle the electric
2323debug mode." 2323debug 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)
@@ -2340,10 +2340,10 @@ debug mode."
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))
@@ -2367,7 +2367,7 @@ debug mode."
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
@@ -2389,12 +2389,12 @@ debug mode."
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)
@@ -2402,14 +2402,14 @@ debug mode."
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
@@ -2419,35 +2419,35 @@ debug mode."
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.
2428If given prefix argument ARG, step ARG source lines. 2428If given prefix argument ARG, step ARG source lines.
2429Uses IDL's stepover executive command which does not enter called functions." 2429Uses 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
2440If Count is nil then an ordinary breakpoint is set. We treat a count 2440If Count is nil then an ordinary breakpoint is set. We treat a count
2441of 1 as a temporary breakpoint using the ONCE keyword. Counts greater 2441of 1 as a temporary breakpoint using the ONCE keyword. Counts greater
2442than 1 use the IDL AFTER=count keyword to break only after reaching 2442than 1 use the IDL AFTER=count keyword to break only after reaching
2443the statement count times. 2443the statement count times.
2444 2444
2445Optional argument CMD is a list or function to evaluate upon reaching 2445Optional argument CMD is a list or function to evaluate upon reaching
2446the breakpoint." 2446the 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
@@ -2470,7 +2470,7 @@ the problem with not being able to set the breakpoint."
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
@@ -2478,7 +2478,7 @@ the problem with not being able to set the breakpoint."
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))
@@ -2502,9 +2502,9 @@ breakpoint can not be set."
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 ()
@@ -2585,7 +2585,7 @@ at a breakpoint."
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)))
@@ -2599,13 +2599,13 @@ If ENABLE is non-nil, enable them instead."
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)
@@ -2643,7 +2643,7 @@ in the current routine."
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'
2645contains an entry for that module." 2645contains 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))))
@@ -2662,7 +2662,7 @@ contains an entry for that module."
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)
@@ -2704,7 +2704,7 @@ Sets a breakpoint with count 1 at end of block, then continues."
2704 "Attempt to run until this procedure exits. 2704 "Attempt to run until this procedure exits.
2705Runs to the last statement and then steps 1 statement. Use the .out command." 2705Runs 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
@@ -2751,7 +2751,7 @@ Runs to the last statement and then steps 1 statement. Use the .out command."
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)
@@ -2769,7 +2769,7 @@ Runs to the last statement and then steps 1 statement. Use the .out command."
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))))
@@ -2801,7 +2801,7 @@ Runs to the last statement and then steps 1 statement. Use the .out command."
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
2806With HELP non-nil, show help on expression. If HELP is a string, 2806With HELP non-nil, show help on expression. If HELP is a string,
2807the expression will be put in place of ___, e.g.: 2807the expression will be put in place of ___, e.g.:
@@ -2834,11 +2834,11 @@ idlw-shell-examine-alist via mini-buffer shortcut key."
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
@@ -2868,7 +2868,7 @@ idlw-shell-examine-alist via mini-buffer shortcut key."
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.
@@ -2879,17 +2879,17 @@ idlw-shell-examine-alist via mini-buffer shortcut key."
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)))
@@ -2899,41 +2899,41 @@ idlw-shell-examine-alist via mini-buffer shortcut key."
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))))
@@ -2946,9 +2946,9 @@ idlw-shell-examine-alist via mini-buffer shortcut key."
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
@@ -2975,9 +2975,9 @@ idlw-shell-examine-alist via mini-buffer shortcut key."
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)))
@@ -2994,21 +2994,21 @@ idlw-shell-examine-alist via mini-buffer shortcut key."
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
@@ -3029,7 +3029,7 @@ idlw-shell-examine-alist via mini-buffer shortcut key."
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
@@ -3047,7 +3047,7 @@ idlw-shell-examine-alist via mini-buffer shortcut key."
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)
@@ -3075,7 +3075,7 @@ versions of IDL."
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)
@@ -3091,7 +3091,7 @@ versions of IDL."
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.
@@ -3109,13 +3109,13 @@ to insert expression in place of the marker ___, e.g.: print,
3109size(___,/DIMENSIONS)" 3109size(___,/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."
@@ -3123,7 +3123,7 @@ size(___,/DIMENSIONS)"
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)
@@ -3131,12 +3131,12 @@ size(___,/DIMENSIONS)"
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 ()
@@ -3147,7 +3147,7 @@ size(___,/DIMENSIONS)"
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))
@@ -3176,7 +3176,7 @@ contains four items:
3176count - number of times to execute breakpoint. When count reaches 0 3176count - 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
3179command - command to execute when breakpoint is reached, either a 3179command - 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
@@ -3209,11 +3209,11 @@ If there is a prefix argument, display IDL process."
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)
@@ -3224,7 +3224,7 @@ Does not work for a region with multiline blocks - use
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 ()
@@ -3279,7 +3279,7 @@ Queries IDL using the string in `idlwave-shell-bp-query'."
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.
3283BP has the form of elements in idlwave-shell-bp-alist. Optional 3283BP has the form of elements in idlwave-shell-bp-alist. Optional
3284second arg ITEM is the particular value to retrieve. ITEM can be 3284second 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
@@ -3314,8 +3314,8 @@ breakpoint overlays."
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
@@ -3330,27 +3330,27 @@ breakpoint overlays."
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)
@@ -3360,7 +3360,7 @@ breakpoint overlays."
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
@@ -3375,8 +3375,8 @@ breakpoint overlays."
3375 "Update BP data in breakpoint list. 3375 "Update BP data in breakpoint list.
3376If BP frame is in `idlwave-shell-bp-alist' updates the breakpoint data." 3376If 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
@@ -3401,7 +3401,7 @@ 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)))
@@ -3409,14 +3409,14 @@ Otherwise return the filename in bp."
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.
3413The breakpoint will be placed at the beginning of the statement on the 3413The breakpoint will be placed at the beginning of the statement on the
3414line specified by BP or at the next IDL statement if that line is not 3414line specified by BP or at the next IDL statement if that line is not
3415a statement. Determines IDL's internal representation for the 3415a statement. Determines IDL's internal representation for the
3416breakpoint, which may have occurred at a different line than 3416breakpoint, which may have occurred at a different line than
3417specified. If NO-SHOW is non-nil, don't do any updating." 3417specified. 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))
@@ -3434,7 +3434,7 @@ specified. If NO-SHOW is non-nil, don't do any updating."
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.
3436Use the count argument with IDLs breakpoint command. 3436Use the count argument with IDLs breakpoint command.
3437We treat a count of 1 as a temporary breakpoint. 3437We treat a count of 1 as a temporary breakpoint.
3438Counts greater than 1 use the IDL AFTER=count keyword to break 3438Counts greater than 1 use the IDL AFTER=count keyword to break
3439only after reaching the statement count times." 3439only after reaching the statement count times."
3440 (let* 3440 (let*
@@ -3446,11 +3446,11 @@ only after reaching the statement count times."
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)
@@ -3534,14 +3534,14 @@ Existing overlays are recycled, in order to minimize consumption."
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))))
@@ -3565,7 +3565,7 @@ Existing overlays are recycled, in order to minimize consumption."
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
@@ -3573,7 +3573,7 @@ Existing overlays are recycled, in order to minimize consumption."
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)
@@ -3582,7 +3582,7 @@ Existing overlays are recycled, in order to minimize consumption."
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)
@@ -3592,7 +3592,7 @@ Existing overlays are recycled, in order to minimize consumption."
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))
@@ -3610,7 +3610,7 @@ Existing overlays are recycled, in order to minimize consumption."
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
3615This stuff is strongly dependant upon the version of Emacs. If TYPE 3615This stuff is strongly dependant upon the version of Emacs. If TYPE
3616is passed, make an overlay of that type ('bp or 'bp-cond, currently 3616is passed, make an overlay of that type ('bp or 'bp-cond, currently
@@ -3620,17 +3620,17 @@ text popup."
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))))
@@ -3651,13 +3651,13 @@ text popup."
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
@@ -3685,14 +3685,14 @@ text popup."
3685Also with prefix arg, ask for the command. You can also use the command 3685Also 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)))
@@ -3702,7 +3702,7 @@ Also with prefix arg, ask for the command. You can also use the command
3702 "Save file and run it in IDL. 3702 "Save file and run it in IDL.
3703Runs `save-buffer' and sends a '.RUN' command for the associated file to IDL. 3703Runs `save-buffer' and sends a '.RUN' command for the associated file to IDL.
3704When called from the shell buffer, re-run the file which was last handled by 3704When called from the shell buffer, re-run the file which was last handled by
3705one of the save-and-.. commands." 3705one 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
@@ -3718,7 +3718,7 @@ one of the save-and-.. commands."
3718 "Save file and batch it in IDL. 3718 "Save file and batch it in IDL.
3719Runs `save-buffer' and sends a '@file' command for the associated file to IDL. 3719Runs `save-buffer' and sends a '@file' command for the associated file to IDL.
3720When called from the shell buffer, re-batch the file which was last handled by 3720When called from the shell buffer, re-batch the file which was last handled by
3721one of the save-and-.. commands." 3721one 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
@@ -3758,7 +3758,7 @@ handled by this command."
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))))
@@ -3791,7 +3791,7 @@ Queries IDL using the string in `idlwave-shell-sources-query'."
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.
3794Create `idlwave-shell-sources-alist' consisting of 3794Create `idlwave-shell-sources-alist' consisting of
3795list elements of the form: 3795list 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
@@ -3876,9 +3876,9 @@ list elements of the form:
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
@@ -3943,13 +3943,13 @@ Otherwise, just expand the file name."
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
@@ -3958,14 +3958,14 @@ Otherwise, just expand the file name."
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
@@ -3975,7 +3975,7 @@ Otherwise, just expand the file name."
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
@@ -3984,10 +3984,10 @@ Otherwise, just expand the file name."
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)
@@ -4037,10 +4037,10 @@ Otherwise, just expand the file name."
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
@@ -4054,24 +4054,24 @@ Otherwise, just expand the file name."
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
@@ -4092,12 +4092,12 @@ Otherwise, just expand the file name."
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.
4100With no argument, this command toggles the mode. 4100With no argument, this command toggles the mode.
4101Non-null prefix argument turns on the mode. 4101Non-null prefix argument turns on the mode.
4102Null prefix argument turns off the mode. 4102Null prefix argument turns off the mode.
4103 4103
@@ -4107,7 +4107,7 @@ nil
4107" *Debugging*" 4107" *Debugging*"
4108idlwave-shell-electric-debug-mode-map) 4108idlwave-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)
@@ -4115,13 +4115,13 @@ idlwave-shell-electric-debug-mode-map)
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
@@ -4130,7 +4130,7 @@ idlwave-shell-electric-debug-mode-map)
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))))))
@@ -4161,7 +4161,7 @@ idlwave-shell-electric-debug-mode-map)
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*"))
@@ -4176,7 +4176,7 @@ idlwave-shell-electric-debug-mode-map)
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"
@@ -4192,35 +4192,35 @@ idlwave-shell-electric-debug-mode-map)
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])
@@ -4252,38 +4252,38 @@ idlwave-shell-electric-debug-mode-map)
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))])
@@ -4297,7 +4297,7 @@ idlwave-shell-electric-debug-mode-map)
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)
@@ -4309,7 +4309,7 @@ idlwave-shell-electric-debug-mode-map)
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
@@ -4329,7 +4329,7 @@ idlwave-shell-electric-debug-mode-map)
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 */
4334static char * file[] = { 4334static char * file[] = {
4335\"14 12 3 1\", 4335\"14 12 3 1\",
@@ -4462,7 +4462,7 @@ static char * file[] = {
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))
@@ -4475,7 +4475,7 @@ static char * file[] = {
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))))
@@ -4485,7 +4485,7 @@ static char * file[] = {
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")
diff --git a/lisp/progmodes/inf-lisp.el b/lisp/progmodes/inf-lisp.el
index 083d87f581c..13bc7f08999 100644
--- a/lisp/progmodes/inf-lisp.el
+++ b/lisp/progmodes/inf-lisp.el
@@ -214,10 +214,8 @@ processes, you can change `inferior-lisp-buffer' to another process
214buffer with \\[set-variable].") 214buffer with \\[set-variable].")
215 215
216;;;###autoload 216;;;###autoload
217(defcustom inferior-lisp-mode-hook '() 217(defvar inferior-lisp-mode-hook '()
218 "*Hook for customising Inferior Lisp mode." 218 "*Hook for customising Inferior Lisp mode.")
219 :type 'hook
220 :group 'inferior-lisp)
221 219
222(put 'inferior-lisp-mode 'mode-class 'special) 220(put 'inferior-lisp-mode 'mode-class 'special)
223 221
@@ -590,10 +588,8 @@ See variable `lisp-describe-sym-command'."
590 588
591;;; Do the user's customisation... 589;;; Do the user's customisation...
592;;;=============================== 590;;;===============================
593(defcustom inferior-lisp-load-hook nil 591(defvar inferior-lisp-load-hook nil
594 "This hook is run when the library `inf-lisp' is loaded." 592 "This hook is run when the library `inf-lisp' is loaded.")
595 :type 'hook
596 :group 'inferior-lisp)
597 593
598(run-hooks 'inferior-lisp-load-hook) 594(run-hooks 'inferior-lisp-load-hook)
599 595
diff --git a/lisp/progmodes/make-mode.el b/lisp/progmodes/make-mode.el
index 7c1ccb25fb0..86002768757 100644
--- a/lisp/progmodes/make-mode.el
+++ b/lisp/progmodes/make-mode.el
@@ -100,12 +100,35 @@
100 :prefix "makefile-") 100 :prefix "makefile-")
101 101
102(defface makefile-space-face 102(defface makefile-space-face
103 '((((class color)) (:background "hotpink")) 103 '((((class color)) (:background "hotpink"))
104 (t (:reverse-video t))) 104 (t (:reverse-video t)))
105 "Face to use for highlighting leading spaces in Font-Lock mode." 105 "Face to use for highlighting leading spaces in Font-Lock mode."
106 :group 'faces 106 :group 'faces
107 :group 'makefile) 107 :group 'makefile)
108 108
109(defface makefile-targets-face
110 ;; This needs to go along both with foreground and background colors (i.e. shell)
111 '((t (:underline t)))
112 "Face to use for additionally highlighting rule targets in Font-Lock mode."
113 :group 'faces
114 :group 'makefile)
115
116(defface makefile-shell-face
117 '((((class color) (background light)) (:background "seashell1"))
118 (((class color) (background dark)) (:background "seashell4"))
119 (t (:reverse-video t)))
120 "Face to use for additionally highlighting Shell commands in Font-Lock mode."
121 :group 'faces
122 :group 'makefile)
123
124(defface makefile-makepp-perl-face
125 '((((class color) (background light)) (:background "LightBlue1")) ; Camel Book
126 (((class color) (background dark)) (:background "DarkBlue"))
127 (t (:reverse-video t)))
128 "Face to use for additionally highlighting Perl code in Font-Lock mode."
129 :group 'faces
130 :group 'makefile)
131
109(defcustom makefile-browser-buffer-name "*Macros and Targets*" 132(defcustom makefile-browser-buffer-name "*Macros and Targets*"
110 "*Name of the macro- and target browser buffer." 133 "*Name of the macro- and target browser buffer."
111 :type 'string 134 :type 'string
@@ -234,17 +257,29 @@ not be enclosed in { } or ( )."
234;; Note that the first big subexpression is used by font lock. Note 257;; Note that the first big subexpression is used by font lock. Note
235;; that if you change this regexp you might have to fix the imenu 258;; that if you change this regexp you might have to fix the imenu
236;; index in makefile-imenu-generic-expression. 259;; index in makefile-imenu-generic-expression.
237(defconst makefile-dependency-regex 260(defvar makefile-dependency-regex
238 "^ *\\([^ \n\t#:=]+\\([ \t]+\\([^ \t\n#:=]+\\|\\$[({][^ \t\n#})]+[})]\\)\\)*\\)[ \t]*:\\([ \t]*$\\|\\([^=\n].*$\\)\\)" 261 ;; Allow for two nested levels $(v1:$(v2:$(v3:a=b)=c)=d)
262 "^ *\\(\\(?: *\\$\\(?:[({]\\(?:\\$\\(?:[({]\\(?:\\$\\(?:[^({]\\|.[^\n$#})]+?[})]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\| *[^ \n$#:=]+\\)+?\\)[ \t]*\\(:\\)\\(?:[ \t]*$\\|[^=\n]\\(?:[^#\n]*?;[ \t]*\\(.+\\)\\)?\\)"
239 "Regex used to find dependency lines in a makefile.") 263 "Regex used to find dependency lines in a makefile.")
240 264
241;; Note that the first subexpression is used by font lock. Note 265(defvar makefile-dependency-skip "^:"
242;; that if you change this regexp you might have to fix the imenu 266 "Characters to skip to find a line that might be a dependency.")
243;; index in makefile-imenu-generic-expression. 267
268(defvar makefile-rule-action-regex
269 "^\t[ \t]*\\([-@]*\\)[ \t]*\\(\\(?:.+\\\\\n\\)*.+\\)"
270 "Regex used to highlight rule action lines in font lock mode.")
271
272;; Note that the first and second subexpression is used by font lock. Note
273;; that if you change this regexp you might have to fix the imenu index in
274;; makefile-imenu-generic-expression.
244(defconst makefile-macroassign-regex 275(defconst makefile-macroassign-regex
245 "^ *\\([^ \n\t][^:#= \t\n]*\\)[ \t]*[*:+]?[:?]?=" 276 "^ *\\([^ \n\t][^:#= \t\n]*\\)[ \t]*\\(?:!=[ \t]*\\(\\(?:.+\\\\\n\\)*.+\\)\\|[*:+]?[:?]?=[ \t]*\\(\\(?:.+\\\\\n\\)*.+\\)\\)"
246 "Regex used to find macro assignment lines in a makefile.") 277 "Regex used to find macro assignment lines in a makefile.")
247 278
279(defconst makefile-var-use-regex
280 "[^$]\\$[({]\\([-a-zA-Z0-9_.]+\\|[@%<?^+*][FD]?\\)"
281 "Regex used to find $(macro) uses in a makefile.")
282
248(defconst makefile-ignored-files-in-pickup-regex 283(defconst makefile-ignored-files-in-pickup-regex
249 "\\(^\\..*\\)\\|\\(.*~$\\)\\|\\(.*,v$\\)\\|\\(\\.[chy]\\)" 284 "\\(^\\..*\\)\\|\\(.*~$\\)\\|\\(.*,v$\\)\\|\\(\\.[chy]\\)"
250 "Regex for filenames that will NOT be included in the target list.") 285 "Regex for filenames that will NOT be included in the target list.")
@@ -254,50 +289,189 @@ not be enclosed in { } or ( )."
254(defvar makefile-space-face 'makefile-space-face 289(defvar makefile-space-face 'makefile-space-face
255 "Face to use for highlighting leading spaces in Font-Lock mode.") 290 "Face to use for highlighting leading spaces in Font-Lock mode.")
256 291
257(defconst makefile-font-lock-keywords 292;; These lists were inspired by the old solution. But they are silly, because
258 (list 293;; you can't differentiate what follows. They need to be split up.
294(defconst makefile-statements '("include")
295 "List of keywords understood by standard make.")
296
297(defconst makefile-automake-statements
298 `("if" "else" "endif" ,@makefile-statements)
299 "List of keywords understood by automake.")
300
301(defconst makefile-gmake-statements
302 `("-sinclude" "sinclude" "override" "vpath"
303 "ifdef" "ifndef" "ifeq" "ifneq" "-include" "define" "endef" "export"
304 "unexport"
305 ,@(cdr makefile-automake-statements))
306 "List of keywords understood by gmake.")
307
308;; These are even more silly, because you can have more spaces in between.
309(defconst makefile-makepp-statements
310 `("and ifdef" "and ifndef" "and ifeq" "and ifneq" "and ifperl"
311 "and ifmakeperl" "and ifsys" "and ifnsys" "build_cache" "build_check"
312 "else ifdef" "else ifndef" "else ifeq" "else ifneq" "else ifperl"
313 "else ifmakeperl" "else ifsys" "else ifnsys" "enddef" "load_makefile"
314 "ifperl" "ifmakeperl" "ifsys" "ifnsys" "_include" "makeperl" "makesub"
315 "no_implicit_load" "perl" "perl-begin" "perl_begin" "perl-end" "perl_end"
316 "prebuild" "or ifdef" "or ifndef" "or ifeq" "or ifneq" "or ifperl"
317 "or ifmakeperl" "or ifsys" "or ifnsys" "register_command_parser"
318 "register_scanner" "repository" "runtime" "signature" "sub"
319 ,@(nthcdr 4 makefile-gmake-statements))
320 "List of keywords understood by gmake.")
321
322(defconst makefile-bsdmake-statements
323 `(".elif" ".elifdef" ".elifmake" ".elifndef" ".elifnmake" ".else" ".endfor"
324 ".endif" ".for" ".if" ".ifdef" ".ifmake" ".ifndef" ".ifnmake" ".undef")
325 "List of keywords understood by BSD make.")
326
327(defun makefile-make-font-lock-keywords (var keywords space
328 &optional negation
329 &rest font-lock-keywords)
330 `(;; Do macro assignments. These get the "variable-name" face.
331 (,makefile-macroassign-regex
332 (1 font-lock-variable-name-face)
333 ;; This is for after !=
334 (2 'makefile-shell-face prepend t)
335 ;; This is for after normal assignment
336 (3 'font-lock-string-face prepend t))
337
338 ;; Rule actions.
339 (makefile-match-action
340 (1 font-lock-type-face)
341 (2 'makefile-shell-face prepend)
342 ;; Only makepp has builtin commands.
343 (3 font-lock-builtin-face prepend t))
344
345 ;; Variable references even in targets/strings/comments.
346 (,var 1 font-lock-variable-name-face prepend)
347
348 ;; Automatic variable references and single character variable references,
349 ;; but not shell variables references.
350 ("[^$]\\$\\([@%<?^+*_]\\|[a-zA-Z0-9]\\>\\)"
351 1 font-lock-constant-face prepend)
352 ("[^$]\\(\\$[@%*]\\)"
353 1 'makefile-targets-face prepend)
259 354
260 ;; Do macro assignments. These get the "variable-name" face rather 355 ;; Fontify conditionals and includes.
261 ;; arbitrarily. 356 (,(concat "^\\(?: [ \t]*\\)?"
262 (list makefile-macroassign-regex 1 'font-lock-variable-name-face) 357 (regexp-opt keywords t)
358 "\\>[ \t]*\\([^: \t\n#]*\\)")
359 (1 font-lock-keyword-face) (2 font-lock-variable-name-face))
263 360
264 ;; Do dependencies. These get the function name face. 361 ,@(if negation
265 (list makefile-dependency-regex 1 'font-lock-function-name-face) 362 `((,negation (1 font-lock-negation-char-face prepend)
363 (2 font-lock-negation-char-face prepend t))))
266 364
267 ;; Variable references even in targets/strings/comments. 365 ,@(if space
268 '("[^$]\\$[({]\\([-a-zA-Z0-9_.]+\\|[@%<?^+*][FD]?\\)[}):]" 366 '(;; Highlight lines that contain just whitespace.
269 1 font-lock-constant-face prepend) 367 ;; They can cause trouble, especially if they start with a tab.
368 ("^[ \t]+$" . makefile-space-face)
270 369
271 ;; Automatic variable references and single character variable references, 370 ;; Highlight shell comments that Make treats as commands,
272 ;; but not shell variables references. 371 ;; since these can fool people.
273 '("[^$]\\$\\([@%<?^+*_]\\|[a-zA-Z0-9]\\>\\)" 372 ("^\t+#" 0 makefile-space-face t)
274 1 font-lock-constant-face prepend)
275 373
276 ;; Fontify conditionals and includes. 374 ;; Highlight spaces that precede tabs.
277 ;; Note that plain `if' is an automake conditional, and not a bug. 375 ;; They can make a tab fail to be effective.
278 (list 376 ("^\\( +\\)\t" 1 makefile-space-face)))
279 (concat "^\\(?: [ \t]*\\)?"
280 (regexp-opt '("-include" "-sinclude" "include" "sinclude" "ifeq"
281 "if" "ifneq" "ifdef" "ifndef" "endif" "else"
282 "define" "endef" "override"
283 "export" "unexport" "vpath") t)
284 "\\>[ \t]*\\([^: \t\n#]*\\)")
285 '(1 font-lock-keyword-face) '(2 font-lock-variable-name-face))
286 377
287 '("^\\(?: [ \t]*\\)?if\\(n\\)\\(?:def\\|eq\\)\\>" 378 ,@font-lock-keywords
288 1 font-lock-negation-char-face prepend)
289 379
290 ;; Highlight lines that contain just whitespace. 380 ;; Do dependencies.
291 ;; They can cause trouble, especially if they start with a tab. 381 (makefile-match-dependency
292 '("^[ \t]+$" . makefile-space-face) 382 (1 'makefile-targets-face prepend)
383 (3 'makefile-shell-face prepend t))))
293 384
294 ;; Highlight shell comments that Make treats as commands, 385(defconst makefile-font-lock-keywords
295 ;; since these can fool people. 386 (makefile-make-font-lock-keywords
296 '("^\t+#" 0 makefile-space-face t) 387 makefile-var-use-regex
388 makefile-statements
389 t))
390
391(defconst makefile-automake-font-lock-keywords
392 (makefile-make-font-lock-keywords
393 makefile-var-use-regex
394 makefile-automake-statements
395 t))
396
397(defconst makefile-gmake-font-lock-keywords
398 (makefile-make-font-lock-keywords
399 makefile-var-use-regex
400 makefile-gmake-statements
401 t
402 "^\\(?: [ \t]*\\)?if\\(n\\)\\(?:def\\|eq\\)\\>"
403
404 '("[^$]\\(\\$[({][@%*][DF][})]\\)"
405 1 'makefile-targets-face prepend)
406
407 ;; $(function ...) ${function ...}
408 '("[^$]\\$[({]\\([-a-zA-Z0-9_.]+\\s \\)"
409 1 font-lock-function-name-face prepend)
410
411 ;; $(shell ...) ${shell ...}
412 '("[^$]\\$\\([({]\\)shell[ \t]+"
413 makefile-match-function-end nil nil
414 (1 'makefile-shell-face prepend t))))
415
416(defconst makefile-makepp-font-lock-keywords
417 (makefile-make-font-lock-keywords
418 makefile-var-use-regex
419 makefile-makepp-statements
420 nil
421 "^\\(?: [ \t]*\\)?\\(?:and[ \t]+\\|else[ \t]+\\|or[ \t]+\\)?if\\(n\\)\\(?:def\\|eq\\|sys\\)\\>"
422
423 '("[^$]\\(\\$[({]\\(?:target\\|output\\)s?\\_>.*?[})]\\)"
424 1 'makefile-targets-face prepend)
425
426 ;; Colon modifier keywords.
427 '("\\(:\\s *\\)\\(build_c\\(?:ache\\|heck\\)\\|env\\(?:ironment\\)?\\|foreach\\|signature\\|scanner\\|quickscan\\|smartscan\\)\\>\\([^:\n]*\\)"
428 (1 font-lock-type-face t)
429 (2 font-lock-keyword-face t)
430 (3 font-lock-variable-name-face t))
431
432 ;; $(function ...) $((function ...)) ${function ...} ${{function ...}}
433 '("[^$]\\$\\(?:((?\\|{{?\\)\\([-a-zA-Z0-9_.]+\\s \\)"
434 1 font-lock-function-name-face prepend)
435
436 ;; $(shell ...) $((shell ...)) ${shell ...} ${{shell ...}}
437 '("[^$]\\$\\(((?\\|{{?\\)shell\\(?:[-_]\\(?:global[-_]\\)?once\\)?[ \t]+"
438 makefile-match-function-end nil nil
439 (1 'makefile-shell-face prepend t))
440
441 ;; $(perl ...) $((perl ...)) ${perl ...} ${{perl ...}}
442 '("[^$]\\$\\(((?\\|{{?\\)makeperl[ \t]+"
443 makefile-match-function-end nil nil
444 (1 'makefile-makepp-perl-face prepend t))
445 '("[^$]\\$\\(((?\\|{{?\\)perl[ \t]+"
446 makefile-match-function-end nil nil
447 (1 'makefile-makepp-perl-face t t))
448
449 ;; Can we unify these with (if (match-end 1) 'prepend t)?
450 '("ifmakeperl\\s +\\(.*\\)" 1 'makefile-makepp-perl-face prepend)
451 '("ifperl\\s +\\(.*\\)" 1 'makefile-makepp-perl-face t)
452
453 ;; Perl block single- or multiline, as statement or rule action.
454 ;; Don't know why the initial newline in 2nd variant of group 2 doesn't get skipped.
455 '("\\<make\\(?:perl\\|sub\\s +\\S +\\)\\s *\n?\\s *{\\(?:{\\s *\n?\\(\\(?:.*\n\\)+?\\)\\s *}\\|\\s *\\(\\(?:.*?\\|\n?\\(?:.*\n\\)+?\\)\\)\\)}"
456 (1 'makefile-makepp-perl-face prepend t)
457 (2 'makefile-makepp-perl-face prepend t))
458 '("\\<\\(?:perl\\|sub\\s +\\S +\\)\\s *\n?\\s *{\\(?:{\\s *\n?\\(\\(?:.*\n\\)+?\\)\\s *}\\|\\s *\\(\\(?:.*?\\|\n?\\(?:.*\n\\)+?\\)\\)\\)}"
459 (1 'makefile-makepp-perl-face t t)
460 (2 'makefile-makepp-perl-face t t))
461
462 ;; Statement style perl block.
463 '("perl[-_]begin\\s *\\(?:\\s #.*\\)?\n\\(\\(?:.*\n\\)+?\\)\\s *perl[-_]end\\>"
464 1 'makefile-makepp-perl-face t)))
465
466(defconst makefile-bsdmake-font-lock-keywords
467 (makefile-make-font-lock-keywords
468 ;; A lot more could be done for variables here:
469 makefile-var-use-regex
470 makefile-bsdmake-statements
471 t
472 "^\\(?: [ \t]*\\)?\\.\\(?:el\\)?if\\(n?\\)\\(?:def\\|make\\)?\\>[ \t]*\\(!?\\)"
473 '("^[ \t]*\\.for[ \t].+[ \t]\\(in\\)\\>" 1 font-lock-keyword-face)))
297 474
298 ;; Highlight spaces that precede tabs.
299 ;; They can make a tab fail to be effective.
300 '("^\\( +\\)\t" 1 makefile-space-face)))
301 475
302(defconst makefile-font-lock-syntactic-keywords 476(defconst makefile-font-lock-syntactic-keywords
303 ;; From sh-script.el. 477 ;; From sh-script.el.
@@ -310,9 +484,8 @@ not be enclosed in { } or ( )."
310 ("\\\\\n" 0 "."))) 484 ("\\\\\n" 0 ".")))
311 485
312(defvar makefile-imenu-generic-expression 486(defvar makefile-imenu-generic-expression
313 (list 487 `(("Dependencies" ,makefile-dependency-regex 1)
314 (list "Dependencies" makefile-dependency-regex 1) 488 ("Macro Assignment" ,makefile-macroassign-regex 1))
315 (list "Macro Assignment" makefile-macroassign-regex 1))
316 "Imenu generic expression for Makefile mode. See `imenu-generic-expression'.") 489 "Imenu generic expression for Makefile mode. See `imenu-generic-expression'.")
317 490
318;;; ------------------------------------------------------------ 491;;; ------------------------------------------------------------
@@ -371,47 +544,50 @@ The function must satisfy this calling convention:
371 () 544 ()
372 (define-abbrev-table 'makefile-mode-abbrev-table ())) 545 (define-abbrev-table 'makefile-mode-abbrev-table ()))
373 546
374(defvar makefile-mode-map nil 547(defvar makefile-mode-map
548 (let ((map (make-sparse-keymap)))
549 ;; set up the keymap
550 (define-key map "\C-c:" 'makefile-insert-target-ref)
551 (if makefile-electric-keys
552 (progn
553 (define-key map "$" 'makefile-insert-macro-ref)
554 (define-key map ":" 'makefile-electric-colon)
555 (define-key map "=" 'makefile-electric-equal)
556 (define-key map "." 'makefile-electric-dot)))
557 (define-key map "\C-c\C-f" 'makefile-pickup-filenames-as-targets)
558 (define-key map "\C-c\C-b" 'makefile-switch-to-browser)
559 (define-key map "\C-c\C-c" 'comment-region)
560 (define-key map "\C-c\C-p" 'makefile-pickup-everything)
561 (define-key map "\C-c\C-u" 'makefile-create-up-to-date-overview)
562 (define-key map "\C-c\C-i" 'makefile-insert-gmake-function)
563 (define-key map "\C-c\C-\\" 'makefile-backslash-region)
564 (define-key map "\C-c\C-m\C-a" 'makefile-automake-mode)
565 (define-key map "\C-c\C-m\C-b" 'makefile-bsdmake-mode)
566 (define-key map "\C-c\C-m\C-g" 'makefile-gmake-mode)
567 (define-key map "\C-c\C-m\C-m" 'makefile-mode)
568 (define-key map "\C-c\C-m\C-p" 'makefile-makepp-mode)
569 (define-key map "\M-p" 'makefile-previous-dependency)
570 (define-key map "\M-n" 'makefile-next-dependency)
571 (define-key map "\e\t" 'makefile-complete)
572
573 ;; Make menus.
574 (define-key map [menu-bar makefile-mode]
575 (cons "Makefile" (make-sparse-keymap "Makefile")))
576
577 (define-key map [menu-bar makefile-mode browse]
578 '("Pop up Makefile Browser" . makefile-switch-to-browser))
579 (define-key map [menu-bar makefile-mode complete]
580 '("Complete Target or Macro" . makefile-complete))
581 (define-key map [menu-bar makefile-mode pickup]
582 '("Find Targets and Macros" . makefile-pickup-everything))
583
584 (define-key map [menu-bar makefile-mode prev]
585 '("Move to Previous Dependency" . makefile-previous-dependency))
586 (define-key map [menu-bar makefile-mode next]
587 '("Move to Next Dependency" . makefile-next-dependency))
588 map)
375 "The keymap that is used in Makefile mode.") 589 "The keymap that is used in Makefile mode.")
376 590
377(if makefile-mode-map
378 ()
379 (setq makefile-mode-map (make-sparse-keymap))
380 ;; set up the keymap
381 (define-key makefile-mode-map "\C-c:" 'makefile-insert-target-ref)
382 (if makefile-electric-keys
383 (progn
384 (define-key makefile-mode-map "$" 'makefile-insert-macro-ref)
385 (define-key makefile-mode-map ":" 'makefile-electric-colon)
386 (define-key makefile-mode-map "=" 'makefile-electric-equal)
387 (define-key makefile-mode-map "." 'makefile-electric-dot)))
388 (define-key makefile-mode-map "\C-c\C-f" 'makefile-pickup-filenames-as-targets)
389 (define-key makefile-mode-map "\C-c\C-b" 'makefile-switch-to-browser)
390 (define-key makefile-mode-map "\C-c\C-c" 'comment-region)
391 (define-key makefile-mode-map "\C-c\C-p" 'makefile-pickup-everything)
392 (define-key makefile-mode-map "\C-c\C-u" 'makefile-create-up-to-date-overview)
393 (define-key makefile-mode-map "\C-c\C-i" 'makefile-insert-gmake-function)
394 (define-key makefile-mode-map "\C-c\C-\\" 'makefile-backslash-region)
395 (define-key makefile-mode-map "\M-p" 'makefile-previous-dependency)
396 (define-key makefile-mode-map "\M-n" 'makefile-next-dependency)
397 (define-key makefile-mode-map "\e\t" 'makefile-complete)
398
399 ;; Make menus.
400 (define-key makefile-mode-map [menu-bar makefile-mode]
401 (cons "Makefile" (make-sparse-keymap "Makefile")))
402
403 (define-key makefile-mode-map [menu-bar makefile-mode browse]
404 '("Pop up Makefile Browser" . makefile-switch-to-browser))
405 (define-key makefile-mode-map [menu-bar makefile-mode complete]
406 '("Complete Target or Macro" . makefile-complete))
407 (define-key makefile-mode-map [menu-bar makefile-mode pickup]
408 '("Find Targets and Macros" . makefile-pickup-everything))
409
410 (define-key makefile-mode-map [menu-bar makefile-mode prev]
411 '("Move to Previous Dependency" . makefile-previous-dependency))
412 (define-key makefile-mode-map [menu-bar makefile-mode next]
413 '("Move to Next Dependency" . makefile-next-dependency)))
414
415(defvar makefile-browser-map nil 591(defvar makefile-browser-map nil
416 "The keymap that is used in the macro- and target browser.") 592 "The keymap that is used in the macro- and target browser.")
417(if makefile-browser-map 593(if makefile-browser-map
@@ -504,8 +680,19 @@ The function must satisfy this calling convention:
504 680
505;;;###autoload 681;;;###autoload
506(defun makefile-mode () 682(defun makefile-mode ()
507 "Major mode for editing Makefiles. 683 "Major mode for editing standard Makefiles.
508This function ends by invoking the function(s) `makefile-mode-hook'. 684
685If you are editing a file for a different make, try one of the
686variants `makefile-automake-mode', `makefile-gmake-mode',
687`makefile-makepp-mode' or `makefile-bsdmake-mode'. All but the
688last should be correctly chosen based on the file name, except if
689it is *.mk. This function ends by invoking the function(s)
690`makefile-mode-hook'.
691
692It is strongly recommended to use `font-lock-mode', because that
693provides additional parsing information. This is used for
694example to see that a rule action `echo foo: bar' is a not rule
695dependency, despite the colon.
509 696
510\\{makefile-mode-map} 697\\{makefile-mode-map}
511 698
@@ -601,7 +788,8 @@ Makefile mode can be configured by modifying the following variables:
601 nil nil 788 nil nil
602 ((?$ . ".")) 789 ((?$ . "."))
603 backward-paragraph 790 backward-paragraph
604 (font-lock-syntactic-keywords . makefile-font-lock-syntactic-keywords))) 791 (font-lock-syntactic-keywords . makefile-font-lock-syntactic-keywords)
792 (font-lock-support-mode))) ; JIT breaks on long series of continuation lines.
605 793
606 ;; Add-log. 794 ;; Add-log.
607 (make-local-variable 'add-log-current-defun-function) 795 (make-local-variable 'add-log-current-defun-function)
@@ -643,7 +831,45 @@ Makefile mode can be configured by modifying the following variables:
643 831
644 ;; Real TABs are important in makefiles 832 ;; Real TABs are important in makefiles
645 (setq indent-tabs-mode t) 833 (setq indent-tabs-mode t)
646 (run-hooks 'makefile-mode-hook)) 834 (run-mode-hooks 'makefile-mode-hook))
835
836;; These should do more than just differentiate font-lock.
837;;;###autoload
838(define-derived-mode makefile-automake-mode makefile-mode "Makefile.am"
839 "An adapted `makefile-mode' that knows about automake."
840 (setq font-lock-defaults
841 `(makefile-automake-font-lock-keywords ,@(cdr font-lock-defaults))))
842
843;;;###autoload
844(define-derived-mode makefile-gmake-mode makefile-mode "GNUmakefile"
845 "An adapted `makefile-mode' that knows about gmake."
846 (setq font-lock-defaults
847 `(makefile-gmake-font-lock-keywords ,@(cdr font-lock-defaults))))
848
849;;;###autoload
850(define-derived-mode makefile-makepp-mode makefile-mode "Makeppfile"
851 "An adapted `makefile-mode' that knows about makepp."
852 (set (make-local-variable 'makefile-rule-action-regex)
853 ;; Don't care about initial tab, but I don't know how to font-lock correctly without.
854 "^\t[ \t]*\\(\\(?:\\(?:noecho\\|ignore[-_]error\\|[-@]+\\)[ \t]*\\)*\\)\\(\\(&\\S +\\)?\\(?:.+\\\\\n\\)*.+\\)")
855
856 (setq font-lock-defaults
857 `(makefile-makepp-font-lock-keywords ,@(cdr font-lock-defaults))))
858
859;;;###autoload
860(define-derived-mode makefile-bsdmake-mode makefile-mode "BSDmakefile"
861 "An adapted `makefile-mode' that knows about BSD make."
862 (set (make-local-variable 'makefile-dependency-regex)
863 ;; Identical to default, except allows `!' instead of `:'.
864 "^ *\\(\\(?: *\\$\\(?:[({]\\(?:\\$\\(?:[({]\\(?:\\$\\(?:[^({]\\|.[^\n$#})]+?[})]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\| *[^ \n$#:=]+\\)+?\\)[ \t]*\\([:!]\\)\\(?:[ \t]*$\\|[^=\n]\\(?:[^#\n]*?;[ \t]*\\(.+\\)\\)?\\)")
865 (set (make-local-variable 'makefile-dependency-skip) "^:!")
866 (set (make-local-variable 'makefile-rule-action-regex)
867 "^\t[ \t]*\\([-+@]*\\)[ \t]*\\(\\(?:.+\\\\\n\\)*.+\\)")
868 (setq font-lock-defaults
869 `(makefile-bsdmake-font-lock-keywords ,@(cdr font-lock-defaults))
870 imenu-generic-expression
871 `(("Dependencies" ,makefile-dependency-regex 1)
872 ,@(cdr imenu-generic-expression))))
647 873
648 874
649 875
@@ -654,18 +880,27 @@ Makefile mode can be configured by modifying the following variables:
654 (interactive) 880 (interactive)
655 (let ((here (point))) 881 (let ((here (point)))
656 (end-of-line) 882 (end-of-line)
657 (if (re-search-forward makefile-dependency-regex (point-max) t) 883 (if (makefile-match-dependency nil)
658 (progn (beginning-of-line) t) ; indicate success 884 (progn (beginning-of-line) t) ; indicate success
659 (goto-char here) nil))) 885 (goto-char here) nil)))
660 886
661(defun makefile-previous-dependency () 887(defun makefile-previous-dependency ()
662 "Move point to the beginning of the previous dependency line." 888 "Move point to the beginning of the previous dependency line."
663 (interactive) 889 (interactive)
664 (let ((here (point))) 890 (let ((pt (point)))
665 (beginning-of-line) 891 (beginning-of-line)
666 (if (re-search-backward makefile-dependency-regex (point-min) t) 892 ;; makefile-match-dependency done backwards:
667 (progn (beginning-of-line) t) ; indicate success 893 (catch 'found
668 (goto-char here) nil))) 894 (while (progn (skip-chars-backward makefile-dependency-skip)
895 (not (bobp)))
896 (or (prog1 (eq (char-after) ?=)
897 (backward-char))
898 (get-text-property (point) 'face)
899 (beginning-of-line)
900 (if (looking-at makefile-dependency-regex)
901 (throw 'found t))))
902 (goto-char pt)
903 nil)))
669 904
670 905
671 906
@@ -763,74 +998,56 @@ Anywhere else just self-inserts."
763(defun makefile-pickup-targets () 998(defun makefile-pickup-targets ()
764 "Notice names of all target definitions in Makefile." 999 "Notice names of all target definitions in Makefile."
765 (interactive) 1000 (interactive)
766 (if (not makefile-need-target-pickup) 1001 (when makefile-need-target-pickup
767 nil 1002 (setq makefile-need-target-pickup nil
768 (setq makefile-need-target-pickup nil) 1003 makefile-target-table nil
769 (setq makefile-target-table nil) 1004 makefile-has-prereqs nil)
770 (setq makefile-has-prereqs nil)
771 (save-excursion 1005 (save-excursion
772 (goto-char (point-min)) 1006 (goto-char (point-min))
773 (while (re-search-forward makefile-dependency-regex nil t) 1007 (while (makefile-match-dependency nil)
774 (makefile-add-this-line-targets))) 1008 (goto-char (match-beginning 1))
775 (message "Read targets OK."))) 1009 (while (let ((target-name
776 1010 (buffer-substring-no-properties (point)
777(defun makefile-add-this-line-targets () 1011 (progn
778 (save-excursion 1012 (skip-chars-forward "^ \t:#")
779 (beginning-of-line) 1013 (point))))
780 (let ((done-with-line nil)
781 (line-number (1+ (count-lines (point-min) (point)))))
782 (while (not done-with-line)
783 (skip-chars-forward " \t")
784 (if (not (setq done-with-line (or (eolp)
785 (char-equal (char-after (point)) ?:))))
786 (progn
787 (let* ((start-of-target-name (point))
788 (target-name
789 (progn
790 (skip-chars-forward "^ \t:#")
791 (buffer-substring start-of-target-name (point))))
792 (has-prereqs 1014 (has-prereqs
793 (not (looking-at ":[ \t]*$")))) 1015 (not (looking-at ":[ \t]*$"))))
794 (if (makefile-remember-target target-name has-prereqs) 1016 (if (makefile-remember-target target-name has-prereqs)
795 (message "Picked up target \"%s\" from line %d" 1017 (message "Picked up target \"%s\" from line %d"
796 target-name line-number))))))))) 1018 target-name (line-number-at-pos)))
1019 (skip-chars-forward " \t")
1020 (not (or (eolp) (eq (char-after) ?:)))))
1021 (forward-line)))
1022 (message "Read targets OK.")))
797 1023
798(defun makefile-pickup-macros () 1024(defun makefile-pickup-macros ()
799 "Notice names of all macro definitions in Makefile." 1025 "Notice names of all macro definitions in Makefile."
800 (interactive) 1026 (interactive)
801 (if (not makefile-need-macro-pickup) 1027 (when makefile-need-macro-pickup
802 nil 1028 (setq makefile-need-macro-pickup nil
803 (setq makefile-need-macro-pickup nil) 1029 makefile-macro-table nil)
804 (setq makefile-macro-table nil)
805 (save-excursion 1030 (save-excursion
806 (goto-char (point-min)) 1031 (goto-char (point-min))
807 (while (re-search-forward makefile-macroassign-regex nil t) 1032 (while (re-search-forward makefile-macroassign-regex nil t)
808 (makefile-add-this-line-macro) 1033 (goto-char (match-beginning 1))
809 (forward-line 1))) 1034 (let ((macro-name (buffer-substring-no-properties (point)
1035 (progn
1036 (skip-chars-forward "^ \t:#=*")
1037 (point)))))
1038 (if (makefile-remember-macro macro-name)
1039 (message "Picked up macro \"%s\" from line %d"
1040 macro-name (line-number-at-pos))))
1041 (forward-line)))
810 (message "Read macros OK."))) 1042 (message "Read macros OK.")))
811 1043
812(defun makefile-add-this-line-macro ()
813 (save-excursion
814 (beginning-of-line)
815 (skip-chars-forward " \t")
816 (unless (eolp)
817 (let* ((start-of-macro-name (point))
818 (line-number (1+ (count-lines (point-min) (point))))
819 (macro-name (progn
820 (skip-chars-forward "^ \t:#=*")
821 (buffer-substring start-of-macro-name (point)))))
822 (if (makefile-remember-macro macro-name)
823 (message "Picked up macro \"%s\" from line %d"
824 macro-name line-number))))))
825
826(defun makefile-pickup-everything (arg) 1044(defun makefile-pickup-everything (arg)
827 "Notice names of all macros and targets in Makefile. 1045 "Notice names of all macros and targets in Makefile.
828Prefix arg means force pickups to be redone." 1046Prefix arg means force pickups to be redone."
829 (interactive "P") 1047 (interactive "P")
830 (if arg 1048 (if arg
831 (progn 1049 (setq makefile-need-target-pickup t
832 (setq makefile-need-target-pickup t) 1050 makefile-need-macro-pickup t))
833 (setq makefile-need-macro-pickup t)))
834 (makefile-pickup-macros) 1051 (makefile-pickup-macros)
835 (makefile-pickup-targets) 1052 (makefile-pickup-targets)
836 (if makefile-pickup-everything-picks-up-filenames-p 1053 (if makefile-pickup-everything-picks-up-filenames-p
@@ -841,17 +1058,12 @@ Prefix arg means force pickups to be redone."
841Checks each filename against `makefile-ignored-files-in-pickup-regex' 1058Checks each filename against `makefile-ignored-files-in-pickup-regex'
842and adds all qualifying names to the list of known targets." 1059and adds all qualifying names to the list of known targets."
843 (interactive) 1060 (interactive)
844 (let* ((dir (file-name-directory (buffer-file-name))) 1061 (mapc (lambda (name)
845 (raw-filename-list (if dir 1062 (or (file-directory-p name)
846 (file-name-all-completions "" dir) 1063 (string-match makefile-ignored-files-in-pickup-regex name)
847 (file-name-all-completions "" "")))) 1064 (if (makefile-remember-target name)
848 (mapcar (lambda (name) 1065 (message "Picked up file \"%s\" as target" name))))
849 (if (and (not (file-directory-p name)) 1066 (file-name-all-completions "" (or (file-name-directory (buffer-file-name)) ""))))
850 (not (string-match makefile-ignored-files-in-pickup-regex
851 name)))
852 (if (makefile-remember-target name)
853 (message "Picked up file \"%s\" as target" name))))
854 raw-filename-list)))
855 1067
856 1068
857 1069
@@ -1453,6 +1665,41 @@ Then prompts for all required parameters."
1453;;; Utility functions 1665;;; Utility functions
1454;;; ------------------------------------------------------------ 1666;;; ------------------------------------------------------------
1455 1667
1668(defun makefile-match-function-end (end)
1669 "To be called as an anchored matcher by font-lock.
1670The anchor must have matched the opening parens in the first group."
1671 (let ((s (match-string-no-properties 1)))
1672 (setq s (cond ((string= s "(") "\\(.*?\\)[ \t]*)")
1673 ((string= s "{") "\\(.*?\\)[ \t]*}")
1674 ((string= s "((") "\\(.*?\\)[ \t]*))")
1675 ((string= s "{{") "\\(.*?\\)[ \t]*}}")))
1676 (if s (looking-at s))))
1677
1678(defun makefile-match-dependency (bound)
1679 "Search for `makefile-dependency-regex' up to BOUND.
1680Checks that the colon has not already been fontified, else we
1681matched in a rule action."
1682 (catch 'found
1683 (let ((pt (point)))
1684 (while (progn (skip-chars-forward makefile-dependency-skip bound)
1685 (not (eobp)))
1686 (forward-char)
1687 (or (eq (char-after) ?=)
1688 (get-text-property (1- (point)) 'face)
1689 (when (save-excursion
1690 (beginning-of-line)
1691 (looking-at makefile-dependency-regex))
1692 (end-of-line)
1693 (throw 'found (point)))))
1694 (goto-char pt))
1695 nil))
1696
1697(defun makefile-match-action (bound)
1698 (catch 'found
1699 (while (re-search-forward makefile-rule-action-regex bound t)
1700 (or (eq ?\\ (char-after (- (match-beginning 0) 2)))
1701 (throw 'found t)))))
1702
1456(defun makefile-do-macro-insertion (macro-name) 1703(defun makefile-do-macro-insertion (macro-name)
1457 "Insert a macro reference." 1704 "Insert a macro reference."
1458 (if (not (zerop (length macro-name))) 1705 (if (not (zerop (length macro-name)))
diff --git a/lisp/progmodes/perl-mode.el b/lisp/progmodes/perl-mode.el
index 0febea4450f..f2576ad94db 100644
--- a/lisp/progmodes/perl-mode.el
+++ b/lisp/progmodes/perl-mode.el
@@ -376,33 +376,41 @@ The expansion is entirely correct because it uses the C preprocessor."
376 376
377(defcustom perl-indent-level 4 377(defcustom perl-indent-level 4
378 "*Indentation of Perl statements with respect to containing block." 378 "*Indentation of Perl statements with respect to containing block."
379 :type 'integer) 379 :type 'integer
380 :group 'perl)
380(defcustom perl-continued-statement-offset 4 381(defcustom perl-continued-statement-offset 4
381 "*Extra indent for lines not starting new statements." 382 "*Extra indent for lines not starting new statements."
382 :type 'integer) 383 :type 'integer
384 :group 'perl)
383(defcustom perl-continued-brace-offset -4 385(defcustom perl-continued-brace-offset -4
384 "*Extra indent for substatements that start with open-braces. 386 "*Extra indent for substatements that start with open-braces.
385This is in addition to `perl-continued-statement-offset'." 387This is in addition to `perl-continued-statement-offset'."
386 :type 'integer) 388 :type 'integer
389 :group 'perl)
387(defcustom perl-brace-offset 0 390(defcustom perl-brace-offset 0
388 "*Extra indentation for braces, compared with other text in same context." 391 "*Extra indentation for braces, compared with other text in same context."
389 :type 'integer) 392 :type 'integer
393 :group 'perl)
390(defcustom perl-brace-imaginary-offset 0 394(defcustom perl-brace-imaginary-offset 0
391 "*Imagined indentation of an open brace that actually follows a statement." 395 "*Imagined indentation of an open brace that actually follows a statement."
392 :type 'integer) 396 :type 'integer
397 :group 'perl)
393(defcustom perl-label-offset -2 398(defcustom perl-label-offset -2
394 "*Offset of Perl label lines relative to usual indentation." 399 "*Offset of Perl label lines relative to usual indentation."
395 :type 'integer) 400 :type 'integer
401 :group 'perl)
396(defcustom perl-indent-continued-arguments nil 402(defcustom perl-indent-continued-arguments nil
397 "*If non-nil offset of argument lines relative to usual indentation. 403 "*If non-nil offset of argument lines relative to usual indentation.
398If nil, continued arguments are aligned with the first argument." 404If nil, continued arguments are aligned with the first argument."
399 :type '(choice integer (const nil))) 405 :type '(choice integer (const nil))
406 :group 'perl)
400 407
401(defcustom perl-tab-always-indent tab-always-indent 408(defcustom perl-tab-always-indent tab-always-indent
402 "Non-nil means TAB in Perl mode always indents the current line. 409 "Non-nil means TAB in Perl mode always indents the current line.
403Otherwise it inserts a tab character if you type it past the first 410Otherwise it inserts a tab character if you type it past the first
404nonwhite character on the line." 411nonwhite character on the line."
405 :type 'boolean) 412 :type 'boolean
413 :group 'perl)
406 414
407;; I changed the default to nil for consistency with general Emacs 415;; I changed the default to nil for consistency with general Emacs
408;; conventions -- rms. 416;; conventions -- rms.
@@ -411,11 +419,13 @@ nonwhite character on the line."
411For lines which don't need indenting, TAB either indents an 419For lines which don't need indenting, TAB either indents an
412existing comment, moves to end-of-line, or if at end-of-line already, 420existing comment, moves to end-of-line, or if at end-of-line already,
413create a new comment." 421create a new comment."
414 :type 'boolean) 422 :type 'boolean
423 :group 'perl)
415 424
416(defcustom perl-nochange ";?#\\|\f\\|\\s(\\|\\(\\w\\|\\s_\\)+:[^:]" 425(defcustom perl-nochange ";?#\\|\f\\|\\s(\\|\\(\\w\\|\\s_\\)+:[^:]"
417 "*Lines starting with this regular expression are not auto-indented." 426 "*Lines starting with this regular expression are not auto-indented."
418 :type 'regexp) 427 :type 'regexp
428 :group 'perl)
419 429
420;; Outline support 430;; Outline support
421 431
diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el
index 25bc337a7b2..73450dec61a 100644
--- a/lisp/progmodes/prolog.el
+++ b/lisp/progmodes/prolog.el
@@ -234,8 +234,8 @@ Entry to this mode calls the value of `prolog-mode-hook' with no arguments,
234if that value is non-nil. Likewise with the value of `comint-mode-hook'. 234if that value is non-nil. Likewise with the value of `comint-mode-hook'.
235`prolog-mode-hook' is called after `comint-mode-hook'. 235`prolog-mode-hook' is called after `comint-mode-hook'.
236 236
237You can send text to the inferior Prolog from other buffers 237You can send text to the inferior Prolog from other buffers using the commands
238using the commands `send-region', `send-string' and \\[prolog-consult-region]. 238`process-send-region', `process-send-string' and \\[prolog-consult-region].
239 239
240Commands: 240Commands:
241Tab indents for Prolog; with argument, shifts rest 241Tab indents for Prolog; with argument, shifts rest
@@ -265,12 +265,12 @@ If COMPILE (prefix arg) is not nil, use compile mode rather than consult mode."
265 (interactive "P\nr") 265 (interactive "P\nr")
266 (save-excursion 266 (save-excursion
267 (if compile 267 (if compile
268 (send-string "prolog" prolog-compile-string) 268 (process-send-string "prolog" prolog-compile-string)
269 (send-string "prolog" prolog-consult-string)) 269 (process-send-string "prolog" prolog-consult-string))
270 (send-region "prolog" beg end) 270 (process-send-region "prolog" beg end)
271 (send-string "prolog" "\n") ;May be unnecessary 271 (process-send-string "prolog" "\n") ;May be unnecessary
272 (if prolog-eof-string 272 (if prolog-eof-string
273 (send-string "prolog" prolog-eof-string) 273 (process-send-string "prolog" prolog-eof-string)
274 (process-send-eof "prolog")))) ;Send eof to prolog process. 274 (process-send-eof "prolog")))) ;Send eof to prolog process.
275 275
276(defun prolog-consult-region-and-go (compile beg end) 276(defun prolog-consult-region-and-go (compile beg end)
diff --git a/lisp/progmodes/ps-mode.el b/lisp/progmodes/ps-mode.el
index b3495c74491..2d8f1d80aae 100644
--- a/lisp/progmodes/ps-mode.el
+++ b/lisp/progmodes/ps-mode.el
@@ -1173,7 +1173,7 @@ Use line numbers if `ps-run-error-line-numbers' is not nil"
1173 (let (i) 1173 (let (i)
1174 (setq 1174 (setq
1175 i 1175 i
1176 (string-to-int 1176 (string-to-number
1177 (buffer-substring (match-beginning 0) (match-end 0)))) 1177 (buffer-substring (match-beginning 0) (match-end 0))))
1178 (goto-char p) 1178 (goto-char p)
1179 (pop-to-buffer ps-run-parent) 1179 (pop-to-buffer ps-run-parent)
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el
index f2389d8defa..0173c419b5d 100644
--- a/lisp/progmodes/sh-script.el
+++ b/lisp/progmodes/sh-script.el
@@ -1015,7 +1015,7 @@ Anything else means: whenever we have a \"good guess\" as to the value."
1015 :group 'sh-indentation) 1015 :group 'sh-indentation)
1016 1016
1017(defcustom sh-popup-occur-buffer nil 1017(defcustom sh-popup-occur-buffer nil
1018 "*Controls when `sh-learn-buffer-indent' pops the *indent* buffer. 1018 "*Controls when `sh-learn-buffer-indent' pops the `*indent*' buffer.
1019If t it is always shown. If nil, it is shown only when there 1019If t it is always shown. If nil, it is shown only when there
1020are conflicts." 1020are conflicts."
1021 :type '(choice 1021 :type '(choice
@@ -1044,7 +1044,7 @@ Can be set to a number, or to nil which means leave it as is."
1044 1044
1045(defcustom sh-basic-offset 4 1045(defcustom sh-basic-offset 4
1046 "*The default indentation increment. 1046 "*The default indentation increment.
1047This value is used for the + and - symbols in an indentation variable." 1047This value is used for the `+' and `-' symbols in an indentation variable."
1048 :type 'integer 1048 :type 'integer
1049 :group 'sh-indentation) 1049 :group 'sh-indentation)
1050 1050
@@ -1088,7 +1088,7 @@ a number means align to that column, e.g. 0 means fist column."
1088 :menu-tag "/ Indent left half sh-basic-offset"))) 1088 :menu-tag "/ Indent left half sh-basic-offset")))
1089 1089
1090(defcustom sh-indent-for-else 0 1090(defcustom sh-indent-for-else 0
1091 "*How much to indent an else relative to an if. Usually 0." 1091 "*How much to indent an `else' relative to its `if'. Usually 0."
1092 :type `(choice 1092 :type `(choice
1093 (integer :menu-tag "A number (positive=>indent right)" 1093 (integer :menu-tag "A number (positive=>indent right)"
1094 :tag "A number") 1094 :tag "A number")
@@ -1104,75 +1104,75 @@ a number means align to that column, e.g. 0 means fist column."
1104 sh-symbol-list)) 1104 sh-symbol-list))
1105 1105
1106(defcustom sh-indent-for-fi 0 1106(defcustom sh-indent-for-fi 0
1107 "*How much to indent a fi relative to an if. Usually 0." 1107 "*How much to indent a `fi' relative to its `if'. Usually 0."
1108 :type `(choice ,@ sh-number-or-symbol-list ) 1108 :type `(choice ,@ sh-number-or-symbol-list )
1109 :group 'sh-indentation) 1109 :group 'sh-indentation)
1110 1110
1111(defcustom sh-indent-for-done '0 1111(defcustom sh-indent-for-done 0
1112 "*How much to indent a done relative to its matching stmt. Usually 0." 1112 "*How much to indent a `done' relative to its matching stmt. Usually 0."
1113 :type `(choice ,@ sh-number-or-symbol-list ) 1113 :type `(choice ,@ sh-number-or-symbol-list )
1114 :group 'sh-indentation) 1114 :group 'sh-indentation)
1115 1115
1116(defcustom sh-indent-after-else '+ 1116(defcustom sh-indent-after-else '+
1117 "*How much to indent a statement after an else statement." 1117 "*How much to indent a statement after an `else' statement."
1118 :type `(choice ,@ sh-number-or-symbol-list ) 1118 :type `(choice ,@ sh-number-or-symbol-list )
1119 :group 'sh-indentation) 1119 :group 'sh-indentation)
1120 1120
1121(defcustom sh-indent-after-if '+ 1121(defcustom sh-indent-after-if '+
1122 "*How much to indent a statement after an if statement. 1122 "*How much to indent a statement after an `if' statement.
1123This includes lines after else and elif statements, too, but 1123This includes lines after `else' and `elif' statements, too, but
1124does not affect then else elif or fi statements themselves." 1124does not affect the `else', `elif' or `fi' statements themselves."
1125 :type `(choice ,@ sh-number-or-symbol-list ) 1125 :type `(choice ,@ sh-number-or-symbol-list )
1126 :group 'sh-indentation) 1126 :group 'sh-indentation)
1127 1127
1128(defcustom sh-indent-for-then 0 1128(defcustom sh-indent-for-then 0
1129 "*How much to indent a then relative to an if." 1129 "*How much to indent a `then' relative to its `if'."
1130 :type `(choice ,@ sh-number-or-symbol-list ) 1130 :type `(choice ,@ sh-number-or-symbol-list )
1131 :group 'sh-indentation) 1131 :group 'sh-indentation)
1132 1132
1133(defcustom sh-indent-for-do 0 1133(defcustom sh-indent-for-do 0
1134 "*How much to indent a do statement. 1134 "*How much to indent a `do' statement.
1135This is relative to the statement before the do, i.e. the 1135This is relative to the statement before the `do', typically a
1136while until or for statement." 1136`while', `until', `for', `repeat' or `select' statement."
1137 :type `(choice ,@ sh-number-or-symbol-list) 1137 :type `(choice ,@ sh-number-or-symbol-list)
1138 :group 'sh-indentation) 1138 :group 'sh-indentation)
1139 1139
1140(defcustom sh-indent-after-do '* 1140(defcustom sh-indent-after-do '+
1141 "*How much to indent a line after a do statement. 1141 "*How much to indent a line after a `do' statement.
1142This is used when the do is the first word of the line. 1142This is used when the `do' is the first word of the line.
1143This is relative to the statement before the do, e.g. a 1143This is relative to the statement before the `do', typically a
1144while for repeat or select statement." 1144`while', `until', `for', `repeat' or `select' statement."
1145 :type `(choice ,@ sh-number-or-symbol-list) 1145 :type `(choice ,@ sh-number-or-symbol-list)
1146 :group 'sh-indentation) 1146 :group 'sh-indentation)
1147 1147
1148(defcustom sh-indent-after-loop-construct '+ 1148(defcustom sh-indent-after-loop-construct '+
1149 "*How much to indent a statement after a loop construct. 1149 "*How much to indent a statement after a loop construct.
1150 1150
1151This variable is used when the keyword \"do\" is on the same line as the 1151This variable is used when the keyword `do' is on the same line as the
1152loop statement (e.g. \"until\", \"while\" or \"for\"). 1152loop statement (e.g., `until', `while' or `for').
1153If the do is on a line by itself, then `sh-indent-after-do' is used instead." 1153If the `do' is on a line by itself, then `sh-indent-after-do' is used instead."
1154 :type `(choice ,@ sh-number-or-symbol-list) 1154 :type `(choice ,@ sh-number-or-symbol-list)
1155 :group 'sh-indentation) 1155 :group 'sh-indentation)
1156 1156
1157 1157
1158(defcustom sh-indent-after-done 0 1158(defcustom sh-indent-after-done 0
1159 "*How much to indent a statement after a \"done\" keyword. 1159 "*How much to indent a statement after a `done' keyword.
1160Normally this is 0, which aligns the \"done\" to the matching 1160Normally this is 0, which aligns the `done' to the matching
1161looping construct line. 1161looping construct line.
1162Setting it non-zero allows you to have the \"do\" statement on a line 1162Setting it non-zero allows you to have the `do' statement on a line
1163by itself and align the done under to do." 1163by itself and align the done under to do."
1164 :type `(choice ,@ sh-number-or-symbol-list) 1164 :type `(choice ,@ sh-number-or-symbol-list)
1165 :group 'sh-indentation) 1165 :group 'sh-indentation)
1166 1166
1167(defcustom sh-indent-for-case-label '+ 1167(defcustom sh-indent-for-case-label '+
1168 "*How much to indent a case label statement. 1168 "*How much to indent a case label statement.
1169This is relative to the line containing the case statement." 1169This is relative to the line containing the `case' statement."
1170 :type `(choice ,@ sh-number-or-symbol-list) 1170 :type `(choice ,@ sh-number-or-symbol-list)
1171 :group 'sh-indentation) 1171 :group 'sh-indentation)
1172 1172
1173(defcustom sh-indent-for-case-alt '++ 1173(defcustom sh-indent-for-case-alt '++
1174 "*How much to indent statements after the case label. 1174 "*How much to indent statements after the case label.
1175This is relative to the line containing the case statement." 1175This is relative to the line containing the `case' statement."
1176 :type `(choice ,@ sh-number-or-symbol-list) 1176 :type `(choice ,@ sh-number-or-symbol-list)
1177 :group 'sh-indentation) 1177 :group 'sh-indentation)
1178 1178
@@ -1184,7 +1184,7 @@ This is relative to the line containing the case statement."
1184 1184
1185(defcustom sh-indent-after-open '+ 1185(defcustom sh-indent-after-open '+
1186 "*How much to indent after a line with an opening parenthesis or brace. 1186 "*How much to indent after a line with an opening parenthesis or brace.
1187For an open paren after a function `sh-indent-after-function' is used." 1187For an open paren after a function, `sh-indent-after-function' is used."
1188 :type `(choice ,@ sh-number-or-symbol-list) 1188 :type `(choice ,@ sh-number-or-symbol-list)
1189 :group 'sh-indentation) 1189 :group 'sh-indentation)
1190 1190
@@ -1196,13 +1196,13 @@ For an open paren after a function `sh-indent-after-function' is used."
1196;; These 2 are for the rc shell: 1196;; These 2 are for the rc shell:
1197 1197
1198(defcustom sh-indent-after-switch '+ 1198(defcustom sh-indent-after-switch '+
1199 "*How much to indent a case statement relative to the switch statement. 1199 "*How much to indent a `case' statement relative to the `switch' statement.
1200This is for the rc shell." 1200This is for the rc shell."
1201 :type `(choice ,@ sh-number-or-symbol-list) 1201 :type `(choice ,@ sh-number-or-symbol-list)
1202 :group 'sh-indentation) 1202 :group 'sh-indentation)
1203 1203
1204(defcustom sh-indent-after-case '+ 1204(defcustom sh-indent-after-case '+
1205 "*How much to indent a statement relative to the case statement. 1205 "*How much to indent a statement relative to the `case' statement.
1206This is for the rc shell." 1206This is for the rc shell."
1207 :type `(choice ,@ sh-number-or-symbol-list) 1207 :type `(choice ,@ sh-number-or-symbol-list)
1208 :group 'sh-indentation) 1208 :group 'sh-indentation)
diff --git a/lisp/progmodes/tcl.el b/lisp/progmodes/tcl.el
index 95cfbb15196..a3447befa20 100644
--- a/lisp/progmodes/tcl.el
+++ b/lisp/progmodes/tcl.el
@@ -123,15 +123,18 @@
123 123
124(defcustom tcl-indent-level 4 124(defcustom tcl-indent-level 4
125 "*Indentation of Tcl statements with respect to containing block." 125 "*Indentation of Tcl statements with respect to containing block."
126 :type 'integer) 126 :type 'integer
127 :group 'tcl)
127 128
128(defcustom tcl-continued-indent-level 4 129(defcustom tcl-continued-indent-level 4
129 "*Indentation of continuation line relative to first line of command." 130 "*Indentation of continuation line relative to first line of command."
130 :type 'integer) 131 :type 'integer
132 :group 'tcl)
131 133
132(defcustom tcl-auto-newline nil 134(defcustom tcl-auto-newline nil
133 "*Non-nil means automatically newline before and after braces you insert." 135 "*Non-nil means automatically newline before and after braces you insert."
134 :type 'boolean) 136 :type 'boolean
137 :group 'tcl)
135 138
136(defcustom tcl-tab-always-indent tab-always-indent 139(defcustom tcl-tab-always-indent tab-always-indent
137 "*Control effect of TAB key. 140 "*Control effect of TAB key.
@@ -149,7 +152,8 @@ to take place:
149 6. Move backward to start of comment, indenting if necessary." 152 6. Move backward to start of comment, indenting if necessary."
150 :type '(choice (const :tag "Always" t) 153 :type '(choice (const :tag "Always" t)
151 (const :tag "Beginning only" nil) 154 (const :tag "Beginning only" nil)
152 (const :tag "Maybe move or make or delete comment" 'tcl))) 155 (const :tag "Maybe move or make or delete comment" 'tcl))
156 :group 'tcl)
153 157
154 158
155(defcustom tcl-electric-hash-style nil ;; 'smart 159(defcustom tcl-electric-hash-style nil ;; 'smart
@@ -160,23 +164,28 @@ meaning that the choice between `backslash' and `quote' should be
160made depending on the number of hashes inserted; or nil, meaning that 164made depending on the number of hashes inserted; or nil, meaning that
161no quoting should be done. Any other value for this variable is 165no quoting should be done. Any other value for this variable is
162taken to mean `smart'. The default is nil." 166taken to mean `smart'. The default is nil."
163 :type '(choice (const backslash) (const quote) (const smart) (const nil))) 167 :type '(choice (const backslash) (const quote) (const smart) (const nil))
168 :group 'tcl)
164 169
165(defcustom tcl-help-directory-list nil 170(defcustom tcl-help-directory-list nil
166 "*List of topmost directories containing TclX help files." 171 "*List of topmost directories containing TclX help files."
167 :type '(repeat directory)) 172 :type '(repeat directory)
173 :group 'tcl)
168 174
169(defcustom tcl-use-smart-word-finder t 175(defcustom tcl-use-smart-word-finder t
170 "*If not nil, use smart way to find current word, for Tcl help feature." 176 "*If not nil, use smart way to find current word, for Tcl help feature."
171 :type 'boolean) 177 :type 'boolean
178 :group 'tcl)
172 179
173(defcustom tcl-application "wish" 180(defcustom tcl-application "wish"
174 "*Name of Tcl program to run in inferior Tcl mode." 181 "*Name of Tcl program to run in inferior Tcl mode."
175 :type 'string) 182 :type 'string
183 :group 'tcl)
176 184
177(defcustom tcl-command-switches nil 185(defcustom tcl-command-switches nil
178 "*List of switches to supply to the `tcl-application' program." 186 "*List of switches to supply to the `tcl-application' program."
179 :type '(repeat string)) 187 :type '(repeat string)
188 :group 'tcl)
180 189
181(defcustom tcl-prompt-regexp "^\\(% \\|\\)" 190(defcustom tcl-prompt-regexp "^\\(% \\|\\)"
182 "*If not nil, a regexp that will match the prompt in the inferior process. 191 "*If not nil, a regexp that will match the prompt in the inferior process.
@@ -184,7 +193,8 @@ If nil, the prompt is the name of the application with \">\" appended.
184 193
185The default is \"^\\(% \\|\\)\", which will match the default primary 194The default is \"^\\(% \\|\\)\", which will match the default primary
186and secondary prompts for tclsh and wish." 195and secondary prompts for tclsh and wish."
187 :type 'regexp) 196 :type 'regexp
197 :group 'tcl)
188 198
189(defcustom inferior-tcl-source-command "source %s\n" 199(defcustom inferior-tcl-source-command "source %s\n"
190 "*Format-string for building a Tcl command to load a file. 200 "*Format-string for building a Tcl command to load a file.
@@ -192,7 +202,8 @@ This format string should use `%s' to substitute a file name
192and should result in a Tcl expression that will command the 202and should result in a Tcl expression that will command the
193inferior Tcl to load that file. The filename will be appropriately 203inferior Tcl to load that file. The filename will be appropriately
194quoted for Tcl." 204quoted for Tcl."
195 :type 'string) 205 :type 'string
206 :group 'tcl)
196 207
197(defface tcl-escaped-newline '((t :inherit font-lock-string-face)) 208(defface tcl-escaped-newline '((t :inherit font-lock-string-face))
198 "Face used for (non-escaped) backslash at end of a line in Tcl mode." 209 "Face used for (non-escaped) backslash at end of a line in Tcl mode."
diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el
index 9f0e63e80a6..12f04895f98 100644
--- a/lisp/progmodes/vhdl-mode.el
+++ b/lisp/progmodes/vhdl-mode.el
@@ -5082,7 +5082,7 @@ Return a valid value only."
5082 ((string-equal "++" input) '++) 5082 ((string-equal "++" input) '++)
5083 ((string-equal "--" input) '--) 5083 ((string-equal "--" input) '--)
5084 ((string-match "^-?[0-9]+$" input) 5084 ((string-match "^-?[0-9]+$" input)
5085 (string-to-int input)) 5085 (string-to-number input))
5086 ((fboundp (setq interned (intern input))) 5086 ((fboundp (setq interned (intern input)))
5087 interned) 5087 interned)
5088 ((boundp interned) interned) 5088 ((boundp interned) interned)
@@ -13701,10 +13701,10 @@ entity ENT-KEY."
13701 (condition-case () 13701 (condition-case ()
13702 (progn (load-file file-dir-name) 13702 (progn (load-file file-dir-name)
13703 (string< (mapconcat 13703 (string< (mapconcat
13704 (lambda (a) (format "%3d" (string-to-int a))) 13704 (lambda (a) (format "%3d" (string-to-number a)))
13705 (split-string "3.31.14" "\\.") "") 13705 (split-string "3.31.14" "\\.") "")
13706 (mapconcat 13706 (mapconcat
13707 (lambda (a) (format "%3d" (string-to-int a))) 13707 (lambda (a) (format "%3d" (string-to-number a)))
13708 (split-string vhdl-cache-version "\\.") ""))) 13708 (split-string vhdl-cache-version "\\.") "")))
13709 (error (progn (vhdl-warning (format "ERROR: Corrupted cache file: \"%s\"" file-dir-name)) 13709 (error (progn (vhdl-warning (format "ERROR: Corrupted cache file: \"%s\"" file-dir-name))
13710 nil)))))) 13710 nil))))))
@@ -14075,7 +14075,7 @@ otherwise use cached data."
14075 (beginning-of-line) (looking-at "^\\([0-9]+\\):")) 14075 (beginning-of-line) (looking-at "^\\([0-9]+\\):"))
14076 (re-search-backward 14076 (re-search-backward
14077 (format "^[0-%d]:\\s-*[[{<]-" 14077 (format "^[0-%d]:\\s-*[[{<]-"
14078 (max (1- (string-to-int (match-string 1))) 0)) nil t))) 14078 (max (1- (string-to-number (match-string 1))) 0)) nil t)))
14079 (goto-char (match-end 0)) 14079 (goto-char (match-end 0))
14080 (speedbar-do-function-pointer) 14080 (speedbar-do-function-pointer)
14081 (speedbar-center-buffer-smartly))) 14081 (speedbar-center-buffer-smartly)))