summaryrefslogtreecommitdiff
path: root/lisp/progmodes
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2005-03-28 14:36:25 +0000
committerStefan Monnier <monnier@iro.umontreal.ca>2005-03-28 14:36:25 +0000
commit12566797d3f622212d165bb1d11df335e295dc4a (patch)
treefbd3837789977ffaa33f3b92ba953a1f7a42183e /lisp/progmodes
parentc5568a11c085c09d6acd6a3bf0fcf1e769115293 (diff)
downloademacs-12566797d3f622212d165bb1d11df335e295dc4a.tar.gz
(python-preoutput-leftover): New var.
(python-preoutput-filter): Use it. (python-send-receive): Loop until all the result has been received.
Diffstat (limited to 'lisp/progmodes')
-rw-r--r--lisp/progmodes/python.el44
1 files changed, 29 insertions, 15 deletions
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 20af0aaf96e..10845b23630 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -1098,28 +1098,40 @@ Don't save anything for STR matching `inferior-python-filter-regexp'."
(defvar python-preoutput-continuation nil
"If non-nil, funcall this when `python-preoutput-filter' sees `_emacs_ok'.")
+(defvar python-preoutput-leftover nil)
+
;; Using this stops us getting lines in the buffer like
;; >>> ... ... >>>
;; Also look for (and delete) an `_emacs_ok' string and call
;; `python-preoutput-continuation' if we get it.
(defun python-preoutput-filter (s)
"`comint-preoutput-filter-functions' function: ignore prompts not at bol."
+ (when python-preoutput-leftover
+ (setq s (concat python-preoutput-leftover s))
+ (setq python-preoutput-leftover nil))
(cond ((and (string-match (rx (and string-start (repeat 3 (any ".>"))
- " " string-end))
- s)
- (/= (let ((inhibit-field-text-motion t))
- (line-beginning-position))
- (point)))
- "")
- ((string= s "_emacs_ok\n")
- (when python-preoutput-continuation
- (funcall python-preoutput-continuation)
- (setq python-preoutput-continuation nil))
- "")
- ((string-match "_emacs_out \\(.*\\)\n" s)
- (setq python-preoutput-result (match-string 1 s))
+ " " string-end))
+ s)
+ (/= (let ((inhibit-field-text-motion t))
+ (line-beginning-position))
+ (point)))
+ "")
+ ((string= s "_emacs_ok\n")
+ (when python-preoutput-continuation
+ (funcall python-preoutput-continuation)
+ (setq python-preoutput-continuation nil))
+ "")
+ ((string-match "_emacs_out \\(.*\\)\n" s)
+ (setq python-preoutput-result (match-string 1 s))
+ "")
+ ((string-match ".*\n" s)
+ s)
+ ((or (eq t (compare-strings s nil nil "_emacs_ok\n" nil (length s)))
+ (eq t (compare-strings s nil nil "_emacs_out " nil
+ (min (length "_emacs_out ") (length s)))))
+ (setq python-preoutput-leftover s)
"")
- (t s)))
+ (t s)))
;;;###autoload
(defun run-python (&optional cmd noshow)
@@ -1359,7 +1371,9 @@ The result is what follows `_emacs_out' in the output (or nil)."
(let ((proc (python-proc)))
(python-send-string string)
(setq python-preoutput-result nil)
- (accept-process-output proc 5)
+ (while (progn
+ (accept-process-output proc 5)
+ python-preoutput-leftover))
python-preoutput-result))
;; Fixme: try to make it work with point in the arglist. Also, is