111 lines
4.0 KiB
EmacsLisp
111 lines
4.0 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)
|