-
Notifications
You must be signed in to change notification settings - Fork 1
/
flight-recorder.el
110 lines (98 loc) · 3.86 KB
/
flight-recorder.el
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
;;;;; (c) 2016-2018 Vsevolod Dyomkin <vseloved@gmail.com>
(defvar *frlog-port* "7654")
(defvar *frlog-notified-of-conn-failure* nil)
(defvar *frlog-session* nil)
(defvar *frlog-serial* 0)
(defun url-encode (s)
(let ((unquoted-re "[^a-zA-Z0-9_./-]")
(encoded (encode-coding-string s 'utf-8))
(n 0))
(while (setq n (string-match unquoted-re encoded n))
(setq encoded
(replace-match (format "%%%X" (string-to-char
(match-string 0 encoded)))
t t encoded)
n (1+ n)))
encoded))
(defun frlog (text &optional title)
(setq text (with-temp-buffer
(lisp-mode)
(insert text)
(indent-region 0 (point))
(string-trim (buffer-string))))
(when (not (string-empty-p text))
(let ((url-request-method "POST")
(url-request-data (encode-coding-string text 'utf-8)))
(url-retrieve (concat "http://localhost:"
*frlog-port*
"/frlog?title="
(if title (url-encode title) "")
"&tag="
(or *frlog-session* ""))
(lambda (status)
(if status
(unless *frlog-notified-of-conn-failure*
(message "Couldn't connect to flog.")
(setf *frlog-notified-of-conn-failure* t))
(setf *frlog-notified-of-conn-failure* nil)))))))
(defun frlog-start-session ()
(interactive)
(setf *frlog-session* (read-string "Session tag: ")))
(defun frlog-end-session ()
(interactive)
(setf *frlog-session* nil))
;;; monkey-patching slime
(defun slime-repl-eval-string (string)
(frlog string (downcase (concat (slime-current-package)
" ("
(number-to-string (incf *frlog-serial*))
")")))
(slime-rex ()
((if slime-repl-auto-right-margin
`(swank-repl:listener-eval
,string
:window-width ,(with-current-buffer (slime-output-buffer)
(window-width)))
`(swank-repl:listener-eval ,string))
(slime-lisp-package))
((:ok result)
(slime-repl-insert-result result))
((:abort condition)
(slime-repl-show-abort condition))))
(defun slime-presentation-write (string &optional target)
(case target
((nil) ; Regular process output
(frlog string)
(slime-repl-emit string))
(:repl-result
(slime-presentation-write-result string))
(t (slime-emit-to-target string target))))
(defun slime-presentation-write-result (string)
(with-current-buffer (slime-output-buffer)
(let ((marker (slime-output-target-marker :repl-result))
(saved-point (point-marker)))
(goto-char marker)
(slime-propertize-region `(face slime-repl-result-face
rear-nonsticky (face))
(insert string))
;; Move the input-start marker after the REPL result.
(set-marker marker (point))
(set-marker slime-output-end (point))
;; Restore point before insertion but only it if was farther
;; than `marker'. Omitting this breaks REPL test
;; `repl-type-ahead'.
(when (> saved-point (point))
(goto-char saved-point)))
(slime-repl-show-maximum-output))
(frlog string))
(defun slime-repl-show-abort (condition)
(frlog condition)
(with-current-buffer (slime-output-buffer)
(save-excursion
(slime-save-marker slime-output-start
(slime-save-marker slime-output-end
(goto-char slime-output-end)
(insert-before-markers (format " ; Evaluation aborted on %s.\n"
condition))
(slime-repl-insert-prompt))))
(slime-repl-show-maximum-output)))