summaryrefslogtreecommitdiff
path: root/src/gizmo/wasp-maude-code.el
blob: 5bcc34e93bf2ce58731cd701aea19b007d9bfad0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
;;; 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 "<return>") #'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