diff options
Diffstat (limited to 'support/emacs/inferior-scala-mode.el')
-rw-r--r-- | support/emacs/inferior-scala-mode.el | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/support/emacs/inferior-scala-mode.el b/support/emacs/inferior-scala-mode.el new file mode 100644 index 0000000000..d97a5d14c3 --- /dev/null +++ b/support/emacs/inferior-scala-mode.el @@ -0,0 +1,115 @@ +;;; inferior-scala-mode.el - Interaction with a Scala interpreter. +;;; $Id$ + +(require 'comint) + +(defgroup inferior-scala + nil + "Mode to interact with a Scala interpreter." + :group 'scala + :tag "Inferior Scala") + +(defcustom scala-default-interpreter "siris -emacs" + "Name of the interpreter to use by default." + :type 'string + :group 'inferior-scala) + +(defvar scala-interpreter scala-default-interpreter + "The interpreter that `run-scala' should run. +If you want to change the defaut value, don't change that variable +but customize `scala-default-interpreter' instead.") + +(defconst scala-inf-buffer-name "*inferior-scala*") + +(define-derived-mode inferior-scala-mode comint-mode "Inferior Scala" + "Major mode for interacting with a Scala interpreter. + +\\{inferior-scala-mode-map\\}" + (define-key inferior-scala-mode-map [(meta return)] 'comint-accumulate) + + ;; Comint configuration + (make-local-variable 'comint-input-sender) + (setq comint-input-sender 'scala-input-sender)) + +(defun scala-input-sender (proc string) + (comint-send-string proc string) + (comint-send-string proc "\nemacs:end\n")) + +;;;###autoload +(defun scala-interpreter-running-p-1 () + ;; True iff a Scala interpreter is currently running in a buffer. + (comint-check-proc scala-inf-buffer-name)) + +(defun scala-check-interpreter-running () + (unless (scala-interpreter-running-p-1) + (error "Scala interpreter not running"))) + +;;;###autoload +(defun run-scala (cmd-line) + "Run a Scala interpreter in an Emacs buffer" + (interactive (list (if current-prefix-arg + (read-string "Scala interpreter: " scala-interpreter) + scala-interpreter))) + (unless (scala-interpreter-running-p-1) + (setq scala-interpreter cmd-line) + (let ((cmd/args (split-string cmd-line))) + (set-buffer + (apply 'make-comint "inferior-scala" (car cmd/args) nil (cdr cmd/args)))) + (inferior-scala-mode) + (pop-to-buffer scala-inf-buffer-name))) + +(defun scala-send-string (str &rest args) + ;; Send string to interpreter + (comint-send-string scala-inf-buffer-name (apply 'format str args)) + (comint-send-string scala-inf-buffer-name "\nemacs:end\n")) + +;;;###autoload +(defun scala-switch-to-interpreter () + "Switch to buffer containing the interpreter" + (interactive) + (scala-check-interpreter-running) + (switch-to-buffer scala-inf-buffer-name)) + +(defvar scala-tmp-file nil) + +;;;###autoload +(defun scala-eval-region (start end) + "Send current region to Scala interpreter." + (interactive "r") + (scala-check-interpreter-running) + (if scala-tmp-file + (delete-file scala-tmp-file) + (setq scala-tmp-file (make-temp-file "scala_tmp"))) + (write-region start end scala-tmp-file nil 'quiet) + (scala-send-string ":l %s" scala-tmp-file)) + +;;;###autoload +(defun scala-eval-buffer () + "Send whole buffer to Scala interpreter." + (interactive) + (scala-eval-region (point-min) (point-max))) + +(defvar scala-prev-l/c-dir/file nil + "Caches the last (directory . file) pair. +Caches the last pair used in the last scala-load-file. +Used for determining the default in the next one.") + +;;;###autoload +(defun scala-load-file (file-name) + "Load a file in the Scala interpreter." + (interactive (comint-get-source "Load Scala file: " scala-prev-l/c-dir/file + '(scala-mode) t)) + (scala-check-interpreter-running) + (comint-check-source file-name) + (setq scala-prev-l/c-dir/file (cons (file-name-directory file-name) + (file-name-nondirectory file-name))) + (scala-send-string ":l %s" file-name)) + +;;;###autoload +(defun scala-quit-interpreter () + "Quit Scala interpreter." + (interactive) + (scala-check-interpreter-running) + (scala-send-string "\n:q")) + +(provide 'inferior-scala-mode) |