lisp/ob-comint.el: Refactor `org-babel-comint-with-output'
* lisp/ob-comint.el (org-babel-comint-with-output): Replace logic for prompt and echo filtering with `org-babel-comint--prompt-filter' and `org-babel-comint--echo-filter'. Delete `org-babel-comint-prompt-separator' variable and move related comment to `org-babel-comint--prompt-filter'.
This commit is contained in:
parent
3776eba2f7
commit
574e04d119
|
@ -79,6 +79,9 @@ This is useful when prompt unexpectedly changes."
|
||||||
|
|
||||||
PROMPT-REGEXP defaults to `comint-prompt-regexp'."
|
PROMPT-REGEXP defaults to `comint-prompt-regexp'."
|
||||||
(let* ((prompt-regexp (or prompt-regexp comint-prompt-regexp))
|
(let* ((prompt-regexp (or prompt-regexp comint-prompt-regexp))
|
||||||
|
;; We need newline in case if we do progressive replacement
|
||||||
|
;; of agglomerated comint prompts with `comint-prompt-regexp'
|
||||||
|
;; containing ^.
|
||||||
(separator "org-babel-comint--prompt-filter-separator\n"))
|
(separator "org-babel-comint--prompt-filter-separator\n"))
|
||||||
(while (string-match-p prompt-regexp string)
|
(while (string-match-p prompt-regexp string)
|
||||||
(setq string
|
(setq string
|
||||||
|
@ -112,12 +115,7 @@ or user `keyboard-quit' during execution of body."
|
||||||
(let ((buffer (nth 0 meta))
|
(let ((buffer (nth 0 meta))
|
||||||
(eoe-indicator (nth 1 meta))
|
(eoe-indicator (nth 1 meta))
|
||||||
(remove-echo (nth 2 meta))
|
(remove-echo (nth 2 meta))
|
||||||
(full-body (nth 3 meta))
|
(full-body (nth 3 meta)))
|
||||||
(org-babel-comint-prompt-separator
|
|
||||||
;; We need newline in case if we do progressive replacement
|
|
||||||
;; of agglomerated comint prompts with `comint-prompt-regexp'
|
|
||||||
;; containing ^.
|
|
||||||
"org-babel-comint-prompt-separator\n"))
|
|
||||||
`(org-babel-comint-in-buffer ,buffer
|
`(org-babel-comint-in-buffer ,buffer
|
||||||
(let* ((string-buffer "")
|
(let* ((string-buffer "")
|
||||||
(comint-output-filter-functions
|
(comint-output-filter-functions
|
||||||
|
@ -161,31 +159,12 @@ or user `keyboard-quit' during execution of body."
|
||||||
(goto-char (process-mark (get-buffer-process (current-buffer))))
|
(goto-char (process-mark (get-buffer-process (current-buffer))))
|
||||||
(insert dangling-text)
|
(insert dangling-text)
|
||||||
|
|
||||||
|
;; remove echo'd FULL-BODY from input
|
||||||
|
(and ,remove-echo ,full-body
|
||||||
|
(setq string-buffer (org-babel-comint--echo-filter string-buffer ,full-body)))
|
||||||
|
|
||||||
;; Filter out prompts.
|
;; Filter out prompts.
|
||||||
(while (string-match-p comint-prompt-regexp string-buffer)
|
(org-babel-comint--prompt-filter string-buffer)))))
|
||||||
(setq string-buffer
|
|
||||||
(replace-regexp-in-string
|
|
||||||
;; Sometimes, we get multiple agglomerated
|
|
||||||
;; prompts together in a single output:
|
|
||||||
;; "prompt prompt prompt output"
|
|
||||||
;; Or even "<whitespace>prompt<whitespace>prompt ...>.
|
|
||||||
;; Remove them progressively, so that
|
|
||||||
;; possible "^" in the prompt regexp gets to
|
|
||||||
;; work as we remove the heading prompt
|
|
||||||
;; instance.
|
|
||||||
(format "\\(?:%s\\)?\\(?:%s\\)[ \t]*" ,org-babel-comint-prompt-separator comint-prompt-regexp)
|
|
||||||
,org-babel-comint-prompt-separator
|
|
||||||
string-buffer)))
|
|
||||||
;; remove echo'd FULL-BODY from input
|
|
||||||
(when (and ,remove-echo ,full-body
|
|
||||||
(string-match
|
|
||||||
(replace-regexp-in-string
|
|
||||||
"\n" "[\r\n]+" (regexp-quote (or ,full-body "")))
|
|
||||||
string-buffer))
|
|
||||||
(setq string-buffer (substring string-buffer (match-end 0))))
|
|
||||||
(delete "" (split-string
|
|
||||||
string-buffer
|
|
||||||
,org-babel-comint-prompt-separator))))))
|
|
||||||
|
|
||||||
(defun org-babel-comint-input-command (buffer cmd)
|
(defun org-babel-comint-input-command (buffer cmd)
|
||||||
"Pass CMD to BUFFER.
|
"Pass CMD to BUFFER.
|
||||||
|
|
Loading…
Reference in New Issue