ocaml/emacs/inf-caml.el

111 lines
3.8 KiB
EmacsLisp

;;; inf-caml.el --- run the Caml toplevel in an Emacs buffer
;; Xavier Leroy, july 1993.
;; modified by Jacques Garrigue, july 1997.
(require 'comint)
(defvar inferior-caml-mode-map nil)
(if inferior-caml-mode-map nil
(setq inferior-caml-mode-map
(copy-keymap comint-mode-map)))
;; Augment Caml mode, so you can process Caml code in the source files.
(defvar inferior-caml-program "ocaml"
"*Program name for invoking an inferior Caml from Emacs.")
(defun inferior-caml-mode ()
"Major mode for interacting with an inferior Caml process.
Runs a Caml toplevel as a subprocess of Emacs, with I/O through an
Emacs buffer. A history of input phrases is maintained. Phrases can
be sent from another buffer in Caml mode.
\\{inferior-caml-mode-map}"
(interactive)
(comint-mode)
(setq comint-prompt-regexp "^# ?")
(setq major-mode 'inferior-caml-mode)
(setq mode-name "Inferior Caml")
(make-local-variable 'paragraph-start)
(setq paragraph-start (concat "^$\\|" page-delimiter))
(make-local-variable 'paragraph-separate)
(setq paragraph-separate paragraph-start)
(make-local-variable 'paragraph-ignore-fill-prefix)
(setq paragraph-ignore-fill-prefix t)
(make-local-variable 'require-final-newline)
(setq require-final-newline t)
(make-local-variable 'comment-start)
(setq comment-start "(*")
(make-local-variable 'comment-end)
(setq comment-end "*)")
(make-local-variable 'comment-column)
(setq comment-column 40)
(make-local-variable 'comment-start-skip)
(setq comment-start-skip "(\\*+ *")
(make-local-variable 'parse-sexp-ignore-comments)
(setq parse-sexp-ignore-comments nil)
(use-local-map inferior-caml-mode-map)
(run-hooks 'inferior-caml-mode-hooks))
(defun run-caml (cmd)
"Run an inferior Caml process.
Input and output via buffer `*inferior-caml*'."
(interactive (list (read-from-minibuffer "Caml command to run: "
inferior-caml-program)))
(setq inferior-caml-program cmd)
(if (not (comint-check-proc "*inferior-caml*"))
(let ((cmdlist (inferior-caml-args-to-list cmd))
(process-connection-type nil))
(set-buffer (apply (function make-comint)
"inferior-caml" (car cmdlist) nil (cdr cmdlist)))
(inferior-caml-mode)))
(setq caml-shell-active t)
(inferior-caml-show-subshell))
(defun inferior-caml-args-to-list (string)
(let ((where (string-match "[ \t]" string)))
(cond ((null where) (list string))
((not (= where 0))
(cons (substring string 0 where)
(inferior-caml-args-to-list (substring string (+ 1 where)
(length string)))))
(t (let ((pos (string-match "[^ \t]" string)))
(if (null pos)
nil
(inferior-caml-args-to-list (substring string pos
(length string)))))))))
(defun inferior-caml-show-subshell ()
(interactive)
(display-buffer "*inferior-caml*"))
(defun inferior-caml-eval-region (start end)
"Send the current region to the inferior Caml process."
(interactive"r")
(save-window-excursion
(if (not (bufferp (get-buffer "*inferior-caml*")))
(call-interactively 'run-caml)))
(comint-send-region "*inferior-caml*" start end)
(comint-send-string "*inferior-caml*" ";;\n")
(if (not (get-buffer-window "*inferior-caml*" t))
(display-buffer "*inferior-caml*")))
(defun inferior-caml-goto-error (start end)
"Jump to the location of the last error as indicated by inferior toplevel."
(interactive "r")
(let ((loc (+ start
(save-excursion
(set-buffer (get-buffer "*inferior-caml*"))
(re-search-backward
(concat comint-prompt-regexp
"[ \t]*Characters[ \t]+\\([0-9]+\\)-[0-9]+:$"))
(string-to-int (match-string 1))))))
(goto-char loc)))
;;; inf-caml.el ends here
(provide 'inf-caml)