Preserve outline visibility

* jupyter-org-extensions.el (jupyter-org-closest-jupyter-language)
(jupyter-org-between-block-end-and-result-p):
(jupyter-org-next-busy-src-block):
(jupyter-org-move-src-block): Do it.
This commit is contained in:
Nathaniel Nicandro 2019-07-22 16:26:50 -05:00
parent 7918293c41
commit 1e6e83c12e

View file

@ -64,49 +64,50 @@ blocks could be found in the buffer.
Distance is line based, not character based. Also, `point' is Distance is line based, not character based. Also, `point' is
assumed to not be inside a source block." assumed to not be inside a source block."
(save-excursion (org-save-outline-visibility nil
(or (and (null query) (save-excursion
(cl-loop (or (and (null query)
with start = (line-number-at-pos) (cl-loop
with previous = (ignore-errors with start = (line-number-at-pos)
(save-excursion with previous = (ignore-errors
(org-babel-previous-src-block) (save-excursion
(point))) (org-babel-previous-src-block)
with next = (ignore-errors (point)))
(save-excursion with next = (ignore-errors
(org-babel-next-src-block) (save-excursion
(point))) (org-babel-next-src-block)
with maybe-return-lang = (point)))
(lambda () with maybe-return-lang =
(let ((info (org-babel-get-src-block-info 'light))) (lambda ()
(when (org-babel-jupyter-language-p (nth 0 info)) (let ((info (org-babel-get-src-block-info 'light)))
(cl-return (nth 0 info))))) (when (org-babel-jupyter-language-p (nth 0 info))
while (or previous next) do (cl-return (nth 0 info)))))
(cond while (or previous next) do
((or (cond
;; Maybe return the previous Jupyter source block's language ((or
;; if it is closer to the start point than the next source ;; Maybe return the previous Jupyter source block's language
;; block ;; if it is closer to the start point than the next source
(and previous next (< (- start (line-number-at-pos previous)) ;; block
(- (line-number-at-pos next) start))) (and previous next (< (- start (line-number-at-pos previous))
;; or when there is no next source block (- (line-number-at-pos next) start)))
(and (null next) previous)) ;; or when there is no next source block
(goto-char previous) (and (null next) previous))
(funcall maybe-return-lang) (goto-char previous)
(setq previous (ignore-errors (funcall maybe-return-lang)
(org-babel-previous-src-block) (setq previous (ignore-errors
(point)))) (org-babel-previous-src-block)
(next (point))))
(goto-char next) (next
(funcall maybe-return-lang) (goto-char next)
(setq next (ignore-errors (funcall maybe-return-lang)
(org-babel-next-src-block) (setq next (ignore-errors
(point))))))) (org-babel-next-src-block)
;; If all else fails, query for the language to use (point)))))))
(let* ((kernelspec (jupyter-completing-read-kernelspec)) ;; If all else fails, query for the language to use
(lang (plist-get (cddr kernelspec) :language))) (let* ((kernelspec (jupyter-completing-read-kernelspec))
(if (org-babel-jupyter-language-p lang) lang (lang (plist-get (cddr kernelspec) :language)))
(format "jupyter-%s" lang)))))) (if (org-babel-jupyter-language-p lang) lang
(format "jupyter-%s" lang)))))))
(defun jupyter-org-between-block-end-and-result-p () (defun jupyter-org-between-block-end-and-result-p ()
"If `point' is between a src-block and its result, return the result end. "If `point' is between a src-block and its result, return the result end.
@ -118,7 +119,8 @@ separates the two."
;; after a src block, e.g. for named results that appear somewhere else. ;; after a src block, e.g. for named results that appear somewhere else.
(save-excursion (save-excursion
(let ((start (point))) (let ((start (point)))
(when-let* ((src (and (ignore-errors (org-babel-previous-src-block)) (when-let* ((src (and (org-save-outline-visibility nil
(ignore-errors (org-babel-previous-src-block)))
(org-element-context))) (org-element-context)))
(end (org-element-property :end src)) (end (org-element-property :end src))
(result-pos (org-babel-where-is-src-block-result))) (result-pos (org-babel-where-is-src-block-result)))
@ -330,16 +332,18 @@ With a prefix argument ARG, jump forward ARG many blocks.
When BACKWARD is non-nil, jump to the previous block." When BACKWARD is non-nil, jump to the previous block."
(interactive "p") (interactive "p")
(cl-loop (org-save-outline-visibility nil
with count = (abs (or arg 1)) (cl-loop
with origin = (point) with count = (abs (or arg 1))
while (ignore-errors with origin = (point)
(if backward (org-babel-previous-src-block) while (ignore-errors
(org-babel-next-src-block))) (if backward (org-babel-previous-src-block)
thereis (when (jupyter-org-request-at-point) (org-babel-next-src-block)))
(zerop (cl-decf count))) thereis (when (jupyter-org-request-at-point)
finally (goto-char origin) (zerop (cl-decf count)))
(user-error "No %s busy code blocks" (if backward "previous" "further")))) finally (goto-char origin)
(user-error "No %s busy code blocks" (if backward "previous" "further"))))
(save-match-data (org-show-context)))
;;;###autoload ;;;###autoload
(defun jupyter-org-previous-busy-src-block (arg) (defun jupyter-org-previous-busy-src-block (arg)
@ -598,10 +602,11 @@ If BELOW is non-nil, move the block down, otherwise move it up."
(defun jupyter-org-clear-all-results () (defun jupyter-org-clear-all-results ()
"Clear all results in the buffer." "Clear all results in the buffer."
(interactive) (interactive)
(save-excursion (org-save-outline-visibility nil
(goto-char (point-min)) (save-excursion
(while (org-babel-next-src-block) (goto-char (point-min))
(org-babel-remove-result)))) (while (org-babel-next-src-block)
(org-babel-remove-result)))))
;;;###autoload ;;;###autoload
(defun jupyter-org-interrupt-kernel () (defun jupyter-org-interrupt-kernel ()