mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-15 10:30:25 -08:00
Allow creating processes where only one of stdin or stdout is a PTY
* src/lisp.h (emacs_spawn): * src/callproc.c (emacs_spawn): Add PTY_IN and PTY_OUT arguments to specify which streams should be set up as a PTY. (call_process): Adjust call to 'emacs_spawn'. * src/process.h (Lisp_Process): Replace 'pty_flag' with 'pty_in' and 'pty_out'. * src/process.c (is_pty_from_symbol): New function. (make-process): Allow :connection-type to be a cons cell, and allow using a stderr process with a PTY for stdin/stdout. (create_process): Handle creating a process where only one of stdin or stdout is a PTY. * lisp/eshell/esh-proc.el (eshell-needs-pipe, eshell-needs-pipe-p): Remove. (eshell-gather-process-output): Use 'make-process' and set ':connection-type' as needed by the value of 'eshell-in-pipeline-p'. * lisp/net/tramp.el (tramp-handle-make-process): * lisp/net/tramp-adb.el (tramp-adb-handle-make-process): * lisp/net/tramp-sh.el (tramp-sh-handle-make-process): Don't signal an error when ':connection-type' is a cons cell. * test/src/process-tests.el (process-test-sentinel-wait-function-working-p): Allow passing PROC in, and rework into... (process-test-wait-for-sentinel): ... this. (process-test-sentinel-accept-process-output) (process-test-sentinel-sit-for, process-test-quoted-batfile) (process-test-stderr-filter): Use 'process-test-wait-for-sentinel'. (make/process/test-connection-type): New function. (make-process/connection-type/pty, make-process/connection-type/pty-2) (make-process/connection-type/pipe) (make-process/connection-type/pipe-2) (make-process/connection-type/in-pty) (make-process/connection-type/out-pty) (make-process/connection-type/pty-with-stderr-buffer) (make-process/connection-type/out-pty-with-stderr-buffer): New tests. * test/lisp/eshell/esh-proc-tests.el (esh-proc-test--detect-pty-cmd): New variable. (esh-proc-test/pipeline-connection-type/no-pipeline) (esh-proc-test/pipeline-connection-type/first) (esh-proc-test/pipeline-connection-type/middle) (esh-proc-test/pipeline-connection-type/last): New tests. * doc/lispref/processes.texi (Asynchronous Processes): Document new ':connection-type' behavior. (Output from Processes): Remove caveat about ':stderr' forcing 'make-process' to use pipes. * etc/NEWS: Announce this change (bug#56025).
This commit is contained in:
parent
b70369c557
commit
d7b89ea407
12 changed files with 288 additions and 160 deletions
|
|
@ -250,30 +250,6 @@ The prompt will be set to PROMPT."
|
|||
"A marker that tracks the beginning of output of the last subprocess.
|
||||
Used only on systems which do not support async subprocesses.")
|
||||
|
||||
(defvar eshell-needs-pipe
|
||||
'("bc"
|
||||
;; xclip.el (in GNU ELPA) calls all of these with
|
||||
;; `process-connection-type' set to nil.
|
||||
"pbpaste" "putclip" "xclip" "xsel" "wl-copy")
|
||||
"List of commands which need `process-connection-type' to be nil.
|
||||
Currently only affects commands in pipelines, and not those at
|
||||
the front. If an element contains a directory part it must match
|
||||
the full name of a command, otherwise just the nondirectory part must match.")
|
||||
|
||||
(defun eshell-needs-pipe-p (command)
|
||||
"Return non-nil if COMMAND needs `process-connection-type' to be nil.
|
||||
See `eshell-needs-pipe'."
|
||||
(and (bound-and-true-p eshell-in-pipeline-p)
|
||||
(not (eq eshell-in-pipeline-p 'first))
|
||||
;; FIXME should this return non-nil for anything that is
|
||||
;; neither 'first nor 'last? See bug#1388 discussion.
|
||||
(catch 'found
|
||||
(dolist (exe eshell-needs-pipe)
|
||||
(if (string-equal exe (if (string-search "/" exe)
|
||||
command
|
||||
(file-name-nondirectory command)))
|
||||
(throw 'found t))))))
|
||||
|
||||
(defun eshell-gather-process-output (command args)
|
||||
"Gather the output from COMMAND + ARGS."
|
||||
(require 'esh-var)
|
||||
|
|
@ -290,31 +266,36 @@ See `eshell-needs-pipe'."
|
|||
(cond
|
||||
((fboundp 'make-process)
|
||||
(setq proc
|
||||
(let ((process-connection-type
|
||||
(unless (eshell-needs-pipe-p command)
|
||||
process-connection-type))
|
||||
(command (file-local-name (expand-file-name command))))
|
||||
(apply #'start-file-process
|
||||
(file-name-nondirectory command) nil command args)))
|
||||
(let ((command (file-local-name (expand-file-name command)))
|
||||
(conn-type (pcase (bound-and-true-p eshell-in-pipeline-p)
|
||||
('first '(nil . pipe))
|
||||
('last '(pipe . nil))
|
||||
('t 'pipe)
|
||||
('nil nil))))
|
||||
(make-process
|
||||
:name (file-name-nondirectory command)
|
||||
:buffer (current-buffer)
|
||||
:command (cons command args)
|
||||
:filter (if (eshell-interactive-output-p)
|
||||
#'eshell-output-filter
|
||||
#'eshell-insertion-filter)
|
||||
:sentinel #'eshell-sentinel
|
||||
:connection-type conn-type
|
||||
:file-handler t)))
|
||||
(eshell-record-process-object proc)
|
||||
(set-process-buffer proc (current-buffer))
|
||||
(set-process-filter proc (if (eshell-interactive-output-p)
|
||||
#'eshell-output-filter
|
||||
#'eshell-insertion-filter))
|
||||
(set-process-sentinel proc #'eshell-sentinel)
|
||||
(run-hook-with-args 'eshell-exec-hook proc)
|
||||
(when (fboundp 'process-coding-system)
|
||||
(let ((coding-systems (process-coding-system proc)))
|
||||
(setq decoding (car coding-systems)
|
||||
encoding (cdr coding-systems)))
|
||||
;; If start-process decided to use some coding system for
|
||||
;; If `make-process' decided to use some coding system for
|
||||
;; decoding data sent from the process and the coding system
|
||||
;; doesn't specify EOL conversion, we had better convert CRLF
|
||||
;; to LF.
|
||||
(if (vectorp (coding-system-eol-type decoding))
|
||||
(setq decoding (coding-system-change-eol-conversion decoding 'dos)
|
||||
changed t))
|
||||
;; Even if start-process left the coding system for encoding
|
||||
;; Even if `make-process' left the coding system for encoding
|
||||
;; data sent from the process undecided, we had better use the
|
||||
;; same one as what we use for decoding. But, we should
|
||||
;; suppress EOL conversion.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue