mirror of https://github.com/python/cpython.git
(py-process-filter): Deleted this function. In order to fix
interactions with newer Emacsen, I've rewritten the way all the process filters work in the *Python* buffer. We use more of the comint infrastructure, specifically the default process filter. This means that scrolling is now handled by the default comint variables including comint-scroll-to-bottom-on-output. Note that this is somewhat experimental change! (py-comint-output-filter-function): Moved to here from the obsolete py-process-filter function, the logic to pop and exec the next queued file waiting to be executed. (py-execute-file): Don't bind comint-scroll-to-bottom-on-output to t, and save the excursion when inserting the "working on" message. This lets the standard comint scrolling variables as set by the user, continue to work. (python-mode, py-shell, py-describe-mode): Remove description of py-scroll-process-buffer. Also in py-shell, make comint-output-filter-functions buffer-local, and add py-comint-output-filter-function to this hook (instead of setting the process filter). (py-scroll-process-buffer): Deleted this variable. See comint variables including comint-scroll-to-bottom-on-output. (py-execute-region): When exec files are being queued, push the next temp file on the end of the list. (py-submit-bug-report): Removed reporting of py-scroll-process-buffer.
This commit is contained in:
parent
33d0093c8c
commit
3c96f6f361
|
@ -227,48 +227,6 @@ indentation hints, unless the comment character is in column zero."
|
|||
)
|
||||
:group 'python)
|
||||
|
||||
(defcustom py-scroll-process-buffer nil
|
||||
"*Scroll Python process buffer as output arrives.
|
||||
If nil, the Python process buffer acts, with respect to scrolling, like
|
||||
Shell-mode buffers normally act. This is surprisingly complicated and
|
||||
so won't be explained here; in fact, you can't get the whole story
|
||||
without studying the Emacs C code.
|
||||
|
||||
If non-nil, the behavior is different in two respects (which are
|
||||
slightly inaccurate in the interest of brevity):
|
||||
|
||||
- If the buffer is in a window, and you left point at its end, the
|
||||
window will scroll as new output arrives, and point will move to the
|
||||
buffer's end, even if the window is not the selected window (that
|
||||
being the one the cursor is in). The usual behavior for `shell-mode'
|
||||
windows is not to scroll, and to leave point where it was, if the
|
||||
buffer is in a window other than the selected window.
|
||||
|
||||
- If the buffer is not visible in any window, and you left point at
|
||||
its end, the buffer will be popped into a window as soon as more
|
||||
output arrives. This is handy if you have a long-running
|
||||
computation and don't want to tie up screen area waiting for the
|
||||
output. The usual behavior for a `shell-mode' buffer is to stay
|
||||
invisible until you explicitly visit it.
|
||||
|
||||
Note the `and if you left point at its end' clauses in both of the
|
||||
above: you can `turn off' the special behaviors while output is in
|
||||
progress, by visiting the Python buffer and moving point to anywhere
|
||||
besides the end. Then the buffer won't scroll, point will remain where
|
||||
you leave it, and if you hide the buffer it will stay hidden until you
|
||||
visit it again. You can enable and disable the special behaviors as
|
||||
often as you like, while output is in progress, by (respectively) moving
|
||||
point to, or away from, the end of the buffer.
|
||||
|
||||
Warning: If you expect a large amount of output, you'll probably be
|
||||
happier setting this option to nil.
|
||||
|
||||
Obscure: `End of buffer' above should really say `at or beyond the
|
||||
process mark', but if you know what that means you didn't need to be
|
||||
told <grin>."
|
||||
:type 'boolean
|
||||
:group 'python)
|
||||
|
||||
(defcustom py-temp-directory
|
||||
(let ((ok '(lambda (x)
|
||||
(and x
|
||||
|
@ -972,7 +930,6 @@ VARIABLES
|
|||
py-indent-offset\t\tindentation increment
|
||||
py-block-comment-prefix\t\tcomment string used by `comment-region'
|
||||
py-python-command\t\tshell command to invoke Python interpreter
|
||||
py-scroll-process-buffer\t\talways scroll Python process buffer
|
||||
py-temp-directory\t\tdirectory used for temp files (if needed)
|
||||
py-beep-if-tab-change\t\tring the bell if `tab-width' is changed"
|
||||
(interactive)
|
||||
|
@ -1110,11 +1067,11 @@ comint believe the user typed this string so that
|
|||
`kill-output-from-shell' does The Right Thing."
|
||||
(let ((curbuf (current-buffer))
|
||||
(procbuf (process-buffer proc))
|
||||
(comint-scroll-to-bottom-on-output t)
|
||||
; (comint-scroll-to-bottom-on-output t)
|
||||
(msg (format "## working on region in file %s...\n" filename))
|
||||
(cmd (format "execfile('%s')\n" filename)))
|
||||
(unwind-protect
|
||||
(progn
|
||||
(save-excursion
|
||||
(set-buffer procbuf)
|
||||
(goto-char (point-max))
|
||||
(move-marker (process-mark proc) (point))
|
||||
|
@ -1122,69 +1079,17 @@ comint believe the user typed this string so that
|
|||
(set-buffer curbuf))
|
||||
(process-send-string proc cmd)))
|
||||
|
||||
(defun py-process-filter (pyproc string)
|
||||
(let ((curbuf (current-buffer))
|
||||
(pbuf (process-buffer pyproc))
|
||||
(pmark (process-mark pyproc))
|
||||
file-finished)
|
||||
;; make sure we switch to a different buffer at least once. if we
|
||||
;; *don't* do this, then if the process buffer is in the selected
|
||||
;; window, and point is before the end, and lots of output is
|
||||
;; coming at a fast pace, then (a) simple cursor-movement commands
|
||||
;; like C-p, C-n, C-f, C-b, C-a, C-e take an incredibly long time
|
||||
;; to have a visible effect (the window just doesn't get updated,
|
||||
;; sometimes for minutes(!)), and (b) it takes about 5x longer to
|
||||
;; get all the process output (until the next python prompt).
|
||||
;;
|
||||
;; #b makes no sense to me at all. #a almost makes sense: unless
|
||||
;; we actually change buffers, set_buffer_internal in buffer.c
|
||||
;; doesn't set windows_or_buffers_changed to 1, & that in turn
|
||||
;; seems to make the Emacs command loop reluctant to update the
|
||||
;; display. Perhaps the default process filter in process.c's
|
||||
;; read_process_output has update_mode_lines++ for a similar
|
||||
;; reason? beats me ...
|
||||
|
||||
(unwind-protect
|
||||
;; make sure current buffer is restored
|
||||
;; BAW - we want to check to see if this still applies
|
||||
(progn
|
||||
;; mysterious ugly hack
|
||||
(if (eq curbuf pbuf)
|
||||
(set-buffer (get-buffer-create "*scratch*")))
|
||||
|
||||
(set-buffer pbuf)
|
||||
(let* ((start (point))
|
||||
(goback (< start pmark))
|
||||
(goend (and (not goback) (= start (point-max))))
|
||||
(buffer-read-only nil))
|
||||
(goto-char pmark)
|
||||
(insert string)
|
||||
(move-marker pmark (point))
|
||||
(setq file-finished
|
||||
(and py-file-queue
|
||||
(equal ">>> "
|
||||
(buffer-substring
|
||||
(prog2 (beginning-of-line) (point)
|
||||
(goto-char pmark))
|
||||
(point)))))
|
||||
(if goback (goto-char start)
|
||||
;; else
|
||||
(if py-scroll-process-buffer
|
||||
(let* ((pop-up-windows t)
|
||||
(pwin (display-buffer pbuf)))
|
||||
(set-window-point pwin (point)))))
|
||||
(set-buffer curbuf)
|
||||
(if file-finished
|
||||
(progn
|
||||
(py-safe (delete-file (car py-file-queue)))
|
||||
(setq py-file-queue (cdr py-file-queue))
|
||||
(if py-file-queue
|
||||
(py-execute-file pyproc (car py-file-queue)))))
|
||||
(and goend
|
||||
(progn (set-buffer pbuf)
|
||||
(goto-char (point-max))))
|
||||
))
|
||||
(set-buffer curbuf))))
|
||||
(defun py-comint-output-filter-function (string)
|
||||
"Watch output for Python prompt and exec next file waiting in queue.
|
||||
This function is appropriate for `comint-output-filter-functions'."
|
||||
(when (and (string-equal ">>> " string)
|
||||
py-file-queue)
|
||||
(py-safe (delete-file (car py-file-queue)))
|
||||
(setq py-file-queue (cdr py-file-queue))
|
||||
(if py-file-queue
|
||||
(let ((pyproc (get-buffer-process (current-buffer))))
|
||||
(py-execute-file pyproc (car py-file-queue))))
|
||||
))
|
||||
|
||||
(defun py-postprocess-output-buffer (buf)
|
||||
"Highlight exceptions found in BUF.
|
||||
|
@ -1263,9 +1168,6 @@ instead of a shell. See the `Interactive Shell' and `Shell Mode'
|
|||
sections of the Emacs manual for details, especially for the key
|
||||
bindings active in the `*Python*' buffer.
|
||||
|
||||
See the docs for variable `py-scroll-buffer' for info on scrolling
|
||||
behavior in the process window.
|
||||
|
||||
Note: You can toggle between using the CPython interpreter and the
|
||||
JPython interpreter by hitting \\[py-toggle-shells]. This toggles
|
||||
buffer local variables which control whether all your subshell
|
||||
|
@ -1296,7 +1198,8 @@ filter."
|
|||
(apply 'make-comint py-which-bufname py-which-shell nil py-which-args))
|
||||
(make-local-variable 'comint-prompt-regexp)
|
||||
(setq comint-prompt-regexp "^>>> \\|^[.][.][.] \\|^(pdb) ")
|
||||
(set-process-filter (get-buffer-process (current-buffer)) 'py-process-filter)
|
||||
(make-local-variable 'comint-output-filter-functions)
|
||||
(add-hook 'comint-output-filter-functions 'py-comint-output-filter-function)
|
||||
(set-syntax-table py-mode-syntax-table)
|
||||
;; set up keybindings for this subshell
|
||||
(local-set-key [tab] 'self-insert-command)
|
||||
|
@ -1368,7 +1271,7 @@ is inserted at the end. See also the command `py-clear-queue'."
|
|||
(if (not py-file-queue)
|
||||
(py-execute-file proc file)
|
||||
(message "File %s queued for execution" file))
|
||||
(push file py-file-queue)
|
||||
(setq py-file-queue (append py-file-queue (list file)))
|
||||
(setq py-exception-buffer (cons file (current-buffer))))
|
||||
(t
|
||||
;; otherwise either run it synchronously in a subprocess
|
||||
|
@ -2593,14 +2496,12 @@ py-indent-offset\tindentation increment
|
|||
py-block-comment-prefix\tcomment string used by comment-region
|
||||
|
||||
py-python-command\tshell command to invoke Python interpreter
|
||||
py-scroll-process-buffer\talways scroll Python process buffer
|
||||
py-temp-directory\tdirectory used for temp files (if needed)
|
||||
|
||||
py-beep-if-tab-change\tring the bell if tab-width is changed
|
||||
%v:py-indent-offset
|
||||
%v:py-block-comment-prefix
|
||||
%v:py-python-command
|
||||
%v:py-scroll-process-buffer
|
||||
%v:py-temp-directory
|
||||
%v:py-beep-if-tab-change
|
||||
|
||||
|
@ -3102,7 +3003,6 @@ non-nil) just submit an enhancement request."
|
|||
'(py-python-command
|
||||
py-indent-offset
|
||||
py-block-comment-prefix
|
||||
py-scroll-process-buffer
|
||||
py-temp-directory
|
||||
py-beep-if-tab-change))
|
||||
nil ;pre-hooks
|
||||
|
|
Loading…
Reference in New Issue