aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Zaretskii2005-08-06 07:37:45 +0000
committerEli Zaretskii2005-08-06 07:37:45 +0000
commit6f048d2655820d07c6c39745bebd7df793aa7f02 (patch)
tree08997567fef5558ed3022aadac84aedb80e35a81
parent553193ea9cde75f0b031fb8809a5c06caafcbf16 (diff)
downloademacs-6f048d2655820d07c6c39745bebd7df793aa7f02.tar.gz
emacs-6f048d2655820d07c6c39745bebd7df793aa7f02.zip
(scheme-trace-command, scheme-untrace-command)
(scheme-macro-expand-command): New user options. (scheme-trace-procedure, scheme-expand-current-form): New commands. (scheme-form-at-point, scheme-start-file): New functions. (run-scheme): Call `scheme-start-file' to get start file, and pass it to `make-comint'. (switch-to-scheme, scheme-proc): Call `scheme-interactively-start-process' if no Scheme buffer/process is available. (scheme-get-process): New function extracted from `scheme-proc'. (scheme-interactively-start-process): New function.
-rw-r--r--lisp/cmuscheme.el133
1 files changed, 116 insertions, 17 deletions
diff --git a/lisp/cmuscheme.el b/lisp/cmuscheme.el
index 102347f345a..8cc467fe0df 100644
--- a/lisp/cmuscheme.el
+++ b/lisp/cmuscheme.el
@@ -127,6 +127,8 @@
127(define-key scheme-mode-map "\C-c\M-r" 'scheme-send-region-and-go) 127(define-key scheme-mode-map "\C-c\M-r" 'scheme-send-region-and-go)
128(define-key scheme-mode-map "\C-c\M-c" 'scheme-compile-definition) 128(define-key scheme-mode-map "\C-c\M-c" 'scheme-compile-definition)
129(define-key scheme-mode-map "\C-c\C-c" 'scheme-compile-definition-and-go) 129(define-key scheme-mode-map "\C-c\C-c" 'scheme-compile-definition-and-go)
130(define-key scheme-mode-map "\C-c\C-t" 'scheme-trace-procedure)
131(define-key scheme-mode-map "\C-c\C-x" 'scheme-expand-current-form)
130(define-key scheme-mode-map "\C-c\C-z" 'switch-to-scheme) 132(define-key scheme-mode-map "\C-c\C-z" 'switch-to-scheme)
131(define-key scheme-mode-map "\C-c\C-l" 'scheme-load-file) 133(define-key scheme-mode-map "\C-c\C-l" 'scheme-load-file)
132(define-key scheme-mode-map "\C-c\C-k" 'scheme-compile-file) ;k for "kompile" 134(define-key scheme-mode-map "\C-c\C-k" 'scheme-compile-file) ;k for "kompile"
@@ -143,6 +145,10 @@
143 '("Compile Definition & Go" . scheme-compile-definition-and-go)) 145 '("Compile Definition & Go" . scheme-compile-definition-and-go))
144 (define-key map [com-def] 146 (define-key map [com-def]
145 '("Compile Definition" . scheme-compile-definition)) 147 '("Compile Definition" . scheme-compile-definition))
148 (define-key map [exp-form]
149 '("Expand current form" . scheme-expand-current-form))
150 (define-key map [trace-proc]
151 '("Trace procedure" . scheme-trace-procedure))
146 (define-key map [send-def-go] 152 (define-key map [send-def-go]
147 '("Evaluate Last Definition & Go" . scheme-send-definition-and-go)) 153 '("Evaluate Last Definition & Go" . scheme-send-definition-and-go))
148 (define-key map [send-def] 154 (define-key map [send-def]
@@ -153,7 +159,7 @@
153 '("Evaluate Region" . scheme-send-region)) 159 '("Evaluate Region" . scheme-send-region))
154 (define-key map [send-sexp] 160 (define-key map [send-sexp]
155 '("Evaluate Last S-expression" . scheme-send-last-sexp)) 161 '("Evaluate Last S-expression" . scheme-send-last-sexp))
156) 162 )
157 163
158(defvar scheme-buffer) 164(defvar scheme-buffer)
159 165
@@ -233,11 +239,15 @@ Defaults to a regexp ignoring all inputs of 0, 1, or 2 letters."
233 239
234;;;###autoload 240;;;###autoload
235(defun run-scheme (cmd) 241(defun run-scheme (cmd)
236 "Run an inferior Scheme process, input and output via buffer *scheme*. 242 "Run an inferior Scheme process, input and output via buffer `*scheme*'.
237If there is a process already running in `*scheme*', switch to that buffer. 243If there is a process already running in `*scheme*', switch to that buffer.
238With argument, allows you to edit the command line (default is value 244With argument, allows you to edit the command line (default is value
239of `scheme-program-name'). Runs the hooks `inferior-scheme-mode-hook' 245of `scheme-program-name').
240\(after the `comint-mode-hook' is run). 246If a file `~/.emacs_SCHEMENAME' exists, it is given as initial input.
247Note that this may lose due to a timing error if the Scheme processor
248discards input when it starts up.
249Runs the hook `inferior-scheme-mode-hook' \(after the `comint-mode-hook'
250is run).
241\(Type \\[describe-mode] in the process buffer for a list of commands.)" 251\(Type \\[describe-mode] in the process buffer for a list of commands.)"
242 252
243 (interactive (list (if current-prefix-arg 253 (interactive (list (if current-prefix-arg
@@ -246,13 +256,24 @@ of `scheme-program-name'). Runs the hooks `inferior-scheme-mode-hook'
246 (if (not (comint-check-proc "*scheme*")) 256 (if (not (comint-check-proc "*scheme*"))
247 (let ((cmdlist (scheme-args-to-list cmd))) 257 (let ((cmdlist (scheme-args-to-list cmd)))
248 (set-buffer (apply 'make-comint "scheme" (car cmdlist) 258 (set-buffer (apply 'make-comint "scheme" (car cmdlist)
249 nil (cdr cmdlist))) 259 (scheme-start-file (car cmdlist)) (cdr cmdlist)))
250 (inferior-scheme-mode))) 260 (inferior-scheme-mode)))
251 (setq scheme-program-name cmd) 261 (setq scheme-program-name cmd)
252 (setq scheme-buffer "*scheme*") 262 (setq scheme-buffer "*scheme*")
253 (pop-to-buffer "*scheme*")) 263 (pop-to-buffer "*scheme*"))
254;;;###autoload (add-hook 'same-window-buffer-names "*scheme*") 264;;;###autoload (add-hook 'same-window-buffer-names "*scheme*")
255 265
266(defun scheme-start-file (prog)
267 "Return the name of the start file corresponding to PROG.
268Search in the directories \"~\" and \"~/.emacs.d\", in this
269order. Return nil if no start file found."
270 (let* ((name (concat ".emacs_" (file-name-nondirectory prog)))
271 (start-file (concat "~/" name)))
272 (if (file-exists-p start-file)
273 start-file
274 (let ((start-file (concat user-emacs-directory name)))
275 (and (file-exists-p start-file) start-file)))))
276
256(defun scheme-send-region (start end) 277(defun scheme-send-region (start end)
257 "Send the current region to the inferior Scheme process." 278 "Send the current region to the inferior Scheme process."
258 (interactive "r") 279 (interactive "r")
@@ -296,16 +317,80 @@ of `scheme-program-name'). Runs the hooks `inferior-scheme-mode-hook'
296 (beginning-of-defun) 317 (beginning-of-defun)
297 (scheme-compile-region (point) end)))) 318 (scheme-compile-region (point) end))))
298 319
320(defcustom scheme-trace-command "(trace %s)"
321 "*Template for issuing commands to trace a Scheme procedure.
322Some Scheme implementations might require more elaborate commands here.
323For PLT-Scheme, e.g., one should use
324
325 (setq scheme-trace-command \"(begin (require (lib \\\"trace.ss\\\")) (trace %s))\")
326
327For Scheme 48 and Scsh use \",trace %s\"."
328 :type 'string
329 :group 'cmuscheme)
330
331(defcustom scheme-untrace-command "(untrace %s)"
332 "*Template for switching off tracing of a Scheme procedure.
333Scheme 48 and Scsh users should set this variable to \",untrace %s\"."
334
335 :type 'string
336 :group 'cmuscheme)
337
338(defun scheme-trace-procedure (proc &optional untrace)
339 "Trace procedure PROC in the inferior Scheme process.
340With a prefix argument switch off tracing of procedure PROC."
341 (interactive
342 (list (let ((current (symbol-at-point))
343 (action (if current-prefix-arg "Untrace" "Trace")))
344 (if current
345 (read-string (format "%s procedure [%s]: " action current) nil nil (symbol-name current))
346 (read-string (format "%s procedure: " action))))
347 current-prefix-arg))
348 (when (= (length proc) 0)
349 (error "Invalid procedure name"))
350 (comint-send-string (scheme-proc)
351 (format
352 (if untrace scheme-untrace-command scheme-trace-command)
353 proc))
354 (comint-send-string (scheme-proc) "\n"))
355
356(defcustom scheme-macro-expand-command "(expand %s)"
357 "*Template for macro-expanding a Scheme form.
358For Scheme 48 and Scsh use \",expand %s\"."
359 :type 'string
360 :group 'cmuscheme)
361
362(defun scheme-expand-current-form ()
363 "Macro-expand the form at point in the inferior Scheme process."
364 (interactive)
365 (let ((current-form (scheme-form-at-point)))
366 (if current-form
367 (progn
368 (comint-send-string (scheme-proc)
369 (format
370 scheme-macro-expand-command
371 current-form))
372 (comint-send-string (scheme-proc) "\n"))
373 (error "Not at a form"))))
374
375(defun scheme-form-at-point ()
376 (let ((next-sexp (thing-at-point 'sexp)))
377 (if (and next-sexp (string-equal (substring next-sexp 0 1) "("))
378 next-sexp
379 (save-excursion
380 (backward-up-list)
381 (scheme-form-at-point)))))
382
299(defun switch-to-scheme (eob-p) 383(defun switch-to-scheme (eob-p)
300 "Switch to the scheme process buffer. 384 "Switch to the scheme process buffer.
301With argument, position cursor at end of buffer." 385With argument, position cursor at end of buffer."
302 (interactive "P") 386 (interactive "P")
303 (if (get-buffer scheme-buffer) 387 (if (or (and scheme-buffer (get-buffer scheme-buffer))
388 (scheme-interactively-start-process))
304 (pop-to-buffer scheme-buffer) 389 (pop-to-buffer scheme-buffer)
305 (error "No current process buffer. See variable `scheme-buffer'")) 390 (error "No current process buffer. See variable `scheme-buffer'"))
306 (cond (eob-p 391 (when eob-p
307 (push-mark) 392 (push-mark)
308 (goto-char (point-max))))) 393 (goto-char (point-max))))
309 394
310(defun scheme-send-region-and-go (start end) 395(defun scheme-send-region-and-go (start end)
311 "Send the current region to the inferior Scheme process. 396 "Send the current region to the inferior Scheme process.
@@ -417,13 +502,27 @@ for running inferior Lisp and Scheme processes. The approach taken here is
417for a minimal, simple implementation. Feel free to extend it.") 502for a minimal, simple implementation. Feel free to extend it.")
418 503
419(defun scheme-proc () 504(defun scheme-proc ()
420 "Return the current scheme process. See variable `scheme-buffer'." 505 "Return the current Scheme process, starting one if necessary.
421 (let ((proc (get-buffer-process (if (eq major-mode 'inferior-scheme-mode) 506See variable `scheme-buffer'."
422 (current-buffer) 507 (unless (and scheme-buffer
423 scheme-buffer)))) 508 (get-buffer scheme-buffer)
424 (or proc 509 (comint-check-proc scheme-buffer))
425 (error "No current process. See variable `scheme-buffer'")))) 510 (scheme-interactively-start-process))
426 511 (or (scheme-get-process)
512 (error "No current process. See variable `scheme-buffer'")))
513
514(defun scheme-get-process ()
515 "Return the current Scheme process or nil if none is running."
516 (get-buffer-process (if (eq major-mode 'inferior-scheme-mode)
517 (current-buffer)
518 scheme-buffer)))
519
520(defun scheme-interactively-start-process (&optional cmd)
521 "Start an inferior Scheme process. Return the process started.
522Since this command is run implicitly, always ask the user for the
523command to run."
524 (save-window-excursion
525 (run-scheme (read-string "Run Scheme: " scheme-program-name))))
427 526
428;;; Do the user's customisation... 527;;; Do the user's customisation...
429 528