forked from mirrors/org-mode
ob-shell: Fix multi-line scripts in sessions
* lisp/ob-comint.el (org-babel-comint-with-output): Clean up empty output. Such output is emitted unnecessarily for multi-line scripts. * lisp/ob-shell.el (org-babel-shell-set-prompt-commands): Disable PS2 and equivalent prompts. Make sure that PROMPT_COMMAND does not interfere with PS1 setting in POSIX shells. (org-babel-sh-evaluate): Do not send input line-by-line. Instead, let `org-babel-coming-with-output' handle waiting for the output as well as recording it. Update to the new `org-babel-coming-with-output' behavior of cleaning empty outputs. * testing/lisp/test-ob-shell.el (test-ob-shell/session): Add a test. Reported-by: Rudolf Adamkovič <salutis@me.com> Link: https://list.orgmode.org/orgmode/m2r0zboix1.fsf@me.com/
This commit is contained in:
parent
bed47b437d
commit
801c93638a
|
@ -109,7 +109,7 @@ or user `keyboard-quit' during execution of body."
|
|||
"\n" "[\r\n]+" (regexp-quote (or ,full-body "")))
|
||||
string-buffer))
|
||||
(setq string-buffer (substring string-buffer (match-end 0))))
|
||||
(split-string string-buffer comint-prompt-regexp)))))
|
||||
(delete "" (split-string string-buffer comint-prompt-regexp))))))
|
||||
|
||||
(defun org-babel-comint-input-command (buffer cmd)
|
||||
"Pass CMD to BUFFER.
|
||||
|
|
|
@ -47,10 +47,15 @@
|
|||
(defvar org-babel-shell-names)
|
||||
|
||||
(defconst org-babel-shell-set-prompt-commands
|
||||
'(("fish" . "function fish_prompt\n\techo \"%s\"\nend")
|
||||
("csh" . "set prompt=\"%s\"")
|
||||
'(;; Fish has no PS2 equivalent.
|
||||
("fish" . "function fish_prompt\n\techo \"%s\"\nend")
|
||||
;; prompt2 is like PS2 in POSIX shells.
|
||||
("csh" . "set prompt=\"%s\"\nset prompt2=\"\"")
|
||||
;; PowerShell, similar to fish, does not have PS2 equivalent.
|
||||
("posh" . "function prompt { \"%s\" }")
|
||||
(t . "PS1=\"%s\""))
|
||||
;; PROMPT_COMMAND can override PS1 settings. Disable it.
|
||||
;; Disable PS2 to avoid garbage in multi-line inputs.
|
||||
(t . "PROMPT_COMMAND=;PS1=\"%s\";PS2="))
|
||||
"Alist assigning shells with their prompt setting command.
|
||||
|
||||
Each element of the alist associates a shell type from
|
||||
|
@ -299,20 +304,14 @@ return the value of the last statement in BODY."
|
|||
#'org-babel-sh-strip-weird-long-prompt
|
||||
(mapcar
|
||||
#'org-trim
|
||||
(butlast
|
||||
(butlast ; Remove eoe indicator
|
||||
(org-babel-comint-with-output
|
||||
(session org-babel-sh-eoe-output t body)
|
||||
(dolist (line (append (split-string (org-trim body) "\n")
|
||||
(list org-babel-sh-eoe-indicator)))
|
||||
(insert line)
|
||||
(comint-send-input nil t)
|
||||
(while (save-excursion
|
||||
(goto-char comint-last-input-end)
|
||||
(not (re-search-forward
|
||||
comint-prompt-regexp nil t)))
|
||||
(accept-process-output
|
||||
(get-buffer-process (current-buffer))))))
|
||||
2))
|
||||
(insert (org-trim body) "\n"
|
||||
org-babel-sh-eoe-indicator)
|
||||
(comint-send-input nil t))
|
||||
;; Remove `org-babel-sh-eoe-indicator' output line.
|
||||
1))
|
||||
"\n"))
|
||||
;; External shell script, with or without a predefined
|
||||
;; shebang.
|
||||
|
|
|
@ -46,7 +46,11 @@ returned empty results."
|
|||
ob-comint.el, which was not previously tested."
|
||||
(let ((res (org-babel-execute:sh "echo 1; echo 2" '((:session . "yes")))))
|
||||
(should res)
|
||||
(should (listp res))))
|
||||
(should (listp res)))
|
||||
;; Test multi-line input.
|
||||
(let ((res (org-babel-execute:sh "if true; then\necho \"yes\"\nfi" '((:session . "yes")))))
|
||||
(should res)
|
||||
(should (string= "yes" res))))
|
||||
|
||||
; A list of tests using the samples in ob-shell-test.org
|
||||
(ert-deftest ob-shell/generic-uses-no-arrays ()
|
||||
|
|
Loading…
Reference in a new issue