;;; wasp-maude-code --- description -*- lexical-binding: t; -*- ;;; Commentary: ;;; Code: (require 'wasp-utils) (defcustom w/maude-code-buffer "*wasp-maude-code*" "Name of buffer used to interact with Maude." :type '(string) :group 'wasp) (define-derived-mode w/maude-code-mode fundamental-mode "heartrate" "Major mode for interacting with Maude." :group 'w) (defun w/maude-code-get-buffer () "Return the heartrate buffer." (unless (get-buffer w/maude-code-buffer) (with-current-buffer (get-buffer-create w/maude-code-buffer) (w/maude-code-mode))) (get-buffer w/maude-code-buffer)) (defun w/maude-code-write (msg &optional face) "Insert MSG immediately above the last line of the Maude Code buffer. Style it with FACE if specified." (with-current-buffer (w/maude-code-get-buffer) (save-excursion (goto-char (point-max)) (beginning-of-line) (w/write-line msg face)))) (defun w/maude-code-request (msg) "Send MSG to Maude and print the response in the buffer." (w/maude-code-write (format "> %s" msg)) (w/ai-mod msg (lambda (d) (with-current-buffer (w/maude-code-get-buffer) (w/maude-code-write (format "%s" d)) (goto-char (point-max)))))) (defun w/maude-code-ret () "Press return in the Maude Code buffer." (interactive) (with-current-buffer (w/maude-code-get-buffer) (save-excursion (goto-char (point-max)) (end-of-line) (let ((end (point))) (beginning-of-line) (let ((start (point))) (w/maude-code-request (buffer-substring start end)) (goto-char (point-max)) (delete-line)))) (goto-char (point-max)))) (define-key w/maude-code-mode-map (kbd "") #'w/maude-code-ret) (defun w/maude-code-clear () "Clear the Maude Code chat buffer." (interactive) (with-current-buffer (w/maude-code-get-buffer) (let ((inhibit-read-only t)) (erase-buffer)))) (define-key w/maude-code-mode-map (kbd "C-l") #'w/maude-code-clear) (provide 'wasp-maude-code) ;;; wasp-maude-code.el ends here