Skip to content

Commit 1b56d07

Browse files
committed
Add overlay to source block regions that are being executed
* jupyter-org-client.el (jupyter-org-request): New overlay property. (jupyter-org--make-overlay, jupyter-org--remove-overlay): New functions. (jupyter-generate-request): Add on overlay to the appropriate region depending on element type. (jupyter-handle-execute-reply): Remove overlay.
1 parent 6ec000f commit 1b56d07

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

jupyter-org-client.el

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ See also the docstring of `org-image-actual-width' for more details."
125125
id-cleared-p
126126
inline-block-p
127127
marker
128-
async-p)
128+
async-p
129+
overlay)
129130

130131
(defun jupyter-org-execute-async-p (params)
131132
"Return non-nil if an execution should be asynchronous based on PARAMS.
@@ -154,6 +155,26 @@ e.g. `org-babel-get-src-block-info'."
154155

155156
(defvar org-babel-jupyter-current-src-block-params)
156157

158+
(defun jupyter-org--make-overlay (beg end &optional inline)
159+
"Create overlay between BEG and END positions and return it."
160+
(let ((overlay (make-overlay beg end)))
161+
(overlay-put overlay 'face 'secondary-selection)
162+
(let ((read-only
163+
(list
164+
(lambda (&rest _)
165+
(user-error
166+
"Cannot modify an area of a source block being executed")))))
167+
(overlay-put overlay 'modification-hooks read-only)
168+
(overlay-put overlay 'insert-in-front-hooks read-only)
169+
(unless inline
170+
(overlay-put overlay 'insert-behind-hooks read-only)))
171+
overlay))
172+
173+
174+
(defun jupyter-org--remove-overlay (req)
175+
(when (overlayp (jupyter-org-request-overlay req))
176+
(delete-overlay (jupyter-org-request-overlay req))))
177+
157178
(cl-defmethod jupyter-generate-request ((_client jupyter-org-client) &rest slots)
158179
"Return a `jupyter-org-request' for the current source code block."
159180
(if (and org-babel-current-src-block-location
@@ -190,6 +211,19 @@ e.g. `org-babel-get-src-block-info'."
190211
org-babel-current-src-block-location
191212
(1+ org-babel-current-src-block-location)
192213
'jupyter-request req)
214+
(setf (jupyter-org-request-overlay req)
215+
(pcase (org-element-type context)
216+
(`src-block
217+
(jupyter-org--make-overlay
218+
(save-excursion
219+
(goto-char (jupyter-org-element-begin-after-affiliated context))
220+
(line-beginning-position 2))
221+
(jupyter-org-element-contents-end context)))
222+
((and type (or `inline-src-block `babel-call `inline-babel-call))
223+
(jupyter-org--make-overlay
224+
(jupyter-org-element-begin-after-affiliated context)
225+
(jupyter-org-element-end-before-blanks context)
226+
(memq type '(inline-src-block babel-call inline-babel-call))))))
193227
req))
194228
(cl-call-next-method)))
195229

@@ -368,6 +402,7 @@ to."
368402
(when payload
369403
(org-with-point-at (jupyter-org-request-marker req)
370404
(jupyter-handle-payload payload)))
405+
(jupyter-org--remove-overlay req)
371406
(if (equal status "ok")
372407
(message "Code block evaluation complete.")
373408
(message "An error occurred when evaluating code block."))

0 commit comments

Comments
 (0)