branch: externals/idlwave
commit f039ae1a30ce7be0e58ad2836e0cc0330711c354
Author: JD Smith <[email protected]>
Commit: JD Smith <[email protected]>
Added support for master file compilation.
Used to compile another file than the current. Useful for example for files
which are @included by other files.
---
idlw-shell.el | 32 ++++++++++++++++++++++++++++----
1 file changed, 28 insertions(+), 4 deletions(-)
diff --git a/idlw-shell.el b/idlw-shell.el
index feaf8dac4c..0bd6d12def 100644
--- a/idlw-shell.el
+++ b/idlw-shell.el
@@ -3962,11 +3962,17 @@ one of the save-and-.. commands."
(interactive)
(idlwave-shell-save-and-action 'batch))
+(defvar idlwave-shell-master-file nil
+ "File local variable to compile instead of this file.
+Useful for e.g. top level routines which @include others.")
+(make-variable-buffer-local 'idlwave-shell-master-file)
+
(defun idlwave-shell-save-and-action (action)
"Save file and compile it in IDL.
-Runs `save-buffer' and sends a '.RUN' command for the associated file to IDL.
-When called from the shell buffer, re-compile the file which was last
-handled by this command."
+Runs `save-buffer' and sends a '.RUN' command for the associated
+file to IDL. When called from the shell buffer, re-compile the
+file which was last handled by this command. If the
+file-local-variable idlwave-shell-master-file is set, act on it instead."
;; Remove the stop overlay.
(if idlwave-shell-stop-line-overlay
(delete-overlay idlwave-shell-stop-line-overlay))
@@ -3978,7 +3984,11 @@ handled by this command."
(cond
((eq major-mode 'idlwave-mode)
(save-buffer)
- (setq idlwave-shell-last-save-and-action-file (buffer-file-name)))
+ (setq idlwave-shell-last-save-and-action-file
+ (if idlwave-shell-master-file
+ (expand-file-name idlwave-shell-master-file
+ (file-name-directory (buffer-file-name)))
+ (buffer-file-name))))
(idlwave-shell-last-save-and-action-file
(if (setq buf (idlwave-get-buffer-visiting
idlwave-shell-last-save-and-action-file))
@@ -4005,6 +4015,18 @@ handled by this command."
(setq idlwave-shell-last-save-and-action-file nil)
(error msg))))
+(defun idlwave-shell-set-master-file ()
+ "Set the master file locally for this file"
+ (interactive)
+ (if (eq major-mode 'idlwave-mode)
+ (let* ((master (read-file-name "Select IDL Master file: " nil nil t))
+ (master-rel (file-relative-name
+ master
+ (file-name-directory (buffer-file-name)))))
+ (when (file-regular-p master)
+ (setq idlwave-shell-master-file master-rel)
+ (add-file-local-variable 'idlwave-shell-master-file master-rel)))))
+
(defun idlwave-shell-maybe-update-routine-info (&optional wait file)
"Update the routine info if the shell is not stopped at an error."
(if (and (not idlwave-shell-is-stopped)
@@ -4586,6 +4608,8 @@ idlwave-shell-electric-debug-mode-map)
'idlwave-shell-get-path-info
'hide)
t]
+ ["Set Master File" (idlwave-shell-set-master-file)
+ :active (eq major-mode 'idlwave-mode)]
["Reset IDL" idlwave-shell-reset t]
"--"
["Toggle Toolbar" idlwave-shell-toggle-toolbar t]