* standard output/error/input streams @ 2017-01-14 12:22 Phillip Lord 2017-01-14 14:03 ` Noam Postavsky ` (2 more replies) 0 siblings, 3 replies; 12+ messages in thread From: Phillip Lord @ 2017-01-14 12:22 UTC (permalink / raw) To: emacs-devel I've worked up the patch that I made to add input streams for writing to the system standard out. There was some discussion about this in Jul. https://lists.gnu.org/archive/html/emacs-devel/2016-07/msg00910.html The new version is on feature/stdout-stderr-stream. Additions since last time. I've updated the names (external-standard-output, external-standard-error) and I have also added an input stream (external-standard-input). The main motivation for this is the same as last time; it gives a communication channel with Emacs which does not involve buffers at any point. Although, if you search for "Emacs" and "standard output", other people would like the same thing for other reasons. Can I add this to master? Phil ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: standard output/error/input streams 2017-01-14 12:22 standard output/error/input streams Phillip Lord @ 2017-01-14 14:03 ` Noam Postavsky 2017-01-14 14:31 ` Eli Zaretskii 2017-01-19 7:21 ` John Wiegley 2 siblings, 0 replies; 12+ messages in thread From: Noam Postavsky @ 2017-01-14 14:03 UTC (permalink / raw) To: Phillip Lord; +Cc: Emacs developers On Sat, Jan 14, 2017 at 7:22 AM, Phillip Lord <phillip.lord@russet.org.uk> wrote: > > > The new version is on feature/stdout-stderr-stream. +DEFUN ("external-standard-error", Fexternal_standard_error, Sexternal_standard_error, 1, 1, 0, + doc: /* Output character CHARACTER to system standard error. */) + (Lisp_Object character) +{ + return Fexternal_debugging_output (character); +} This could be just an alias instead, no? ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: standard output/error/input streams 2017-01-14 12:22 standard output/error/input streams Phillip Lord 2017-01-14 14:03 ` Noam Postavsky @ 2017-01-14 14:31 ` Eli Zaretskii 2017-01-14 17:51 ` Eli Zaretskii 2017-01-19 7:21 ` John Wiegley 2 siblings, 1 reply; 12+ messages in thread From: Eli Zaretskii @ 2017-01-14 14:31 UTC (permalink / raw) To: Phillip Lord; +Cc: emacs-devel > From: phillip.lord@russet.org.uk (Phillip Lord) > Date: Sat, 14 Jan 2017 12:22:50 +0000 > > I've worked up the patch that I made to add input streams for writing to > the system standard out. There was some discussion about this in Jul. > > https://lists.gnu.org/archive/html/emacs-devel/2016-07/msg00910.html > > The new version is on feature/stdout-stderr-stream. Thanks. Some of the concerns I expressed here: https://lists.gnu.org/archive/html/emacs-devel/2016-07/msg00938.html are still relevant, and at the very least should be reflected in the docs. > Can I add this to master? I think this still "needs work", see my comments below: +@cindex @code{external-standard-input} +@defun external-standard-input &optional char No need to explicitly index a function that is introduced in a @defun: the latter automatically adds an index entry. +This function reads a single character from the system standard input +(as opposed to @var{standard-input}) and functions as a stream. Note, Two spaces between sentences, please (here and elsewhere). +however, that if Emacs is running in a terminal its use can be +unpredictable. I think we should explain more about the issue here, so that the reader understands what she is up against. (I think this function will simply not work on a TTY frame.) +These functions are predominately useful for debugging, as they are a +mechanism for producing output that does not change any buffer. Note, +however, that if Emacs is running in a terminal their use can affect +the display unpredictably. Likewise here. This should also mention the problems with stdout/stderr disposition in GUI sessions. +(defvar external-standard-input-pushback nil + "Pushback character for `external-standard-input'.") Isn't this an internal variable? If so, it should use double hyphen in its name. And what is the purpose of this pushback? I didn't see any code that sets it in patch. +DEFUN ("external-standard-input-read-char",Fexternal_standard_input_read_char, Sexternal_standard_input_read_char, 0, 0, 0, + doc: /* Read a single character from the system standard input. + +Returns -1 if standard input is at the end.*/) + (void) +{ + int c; + Lisp_Object val; + + c = getchar(); + XSETINT(val,c); + + return val; +} This implementation has a number of issues: . getchar reads a _byte_, not a character, so unless input is plain-ASCII, what you return here is a raw byte, not a character in the Emacs sense of that word. That is inconsistent with every other input facility we have, and could very well get the user in trouble. . getchar doesn't return until you type RET, at least on my system, which might come as a surprise to users. . (nitpicking) our coding style keeps one space between the function/macro name and the opening parenthesis. (Same issue exists elsewhere in the patch.) +DEFUN ("external-standard-input-read-line", Fexternal_standard_input_read_line, Sexternal_standard_input_read_line, 0, 0, 0, + doc: /* Read a line from the system standard input.*/) This function doesn't seem to be documented in the ELisp manual. + if (len || c == '\n' || c == '\r') + { + val = make_string (line, len); + xfree (line); What about EOL decoding, as in all the other Emacs input functions? Also, make_string has its own ideas about when to produce unibyte strings and when multibyte strings. You should instead decode the input text using coding-system-for-read (if non-nil) or locale-coding-system (or maybe what terminal-coding-system returns). +DEFUN ("external-standard-output", Fexternal_standard_output, Sexternal_standard_output, 1, 1, 0, + doc: /* Output character CHARACTER to system standard output. */) + (Lisp_Object character) +{ + CHECK_NUMBER (character); + printchar_to_stream (XINT(character), stdout); printchar_to_stream converts the output text via standard-display-table, if that is non-nil; do we really want that for functionality that is supposed to be a debugging aid? It also sends its argument to the debugger on MS-Windows -- is that desirable? ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: standard output/error/input streams 2017-01-14 14:31 ` Eli Zaretskii @ 2017-01-14 17:51 ` Eli Zaretskii 0 siblings, 0 replies; 12+ messages in thread From: Eli Zaretskii @ 2017-01-14 17:51 UTC (permalink / raw) To: phillip.lord; +Cc: emacs-devel > Date: Sat, 14 Jan 2017 16:31:54 +0200 > From: Eli Zaretskii <eliz@gnu.org> > Cc: emacs-devel@gnu.org > > . getchar doesn't return until you type RET, at least on my system, > which might come as a surprise to users. One other problem with this is that until getchar returns, Emacs is stuck, and nothing runs. That's not a good thing, IMO, so I think the implementation should go via wait_reading_process_output and stuff (which will have a nice side effect of letting some other thread run while Emacs waits for input). ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: standard output/error/input streams 2017-01-14 12:22 standard output/error/input streams Phillip Lord 2017-01-14 14:03 ` Noam Postavsky 2017-01-14 14:31 ` Eli Zaretskii @ 2017-01-19 7:21 ` John Wiegley 2017-01-20 13:38 ` Phillip Lord 2017-01-20 16:26 ` Stefan Monnier 2 siblings, 2 replies; 12+ messages in thread From: John Wiegley @ 2017-01-19 7:21 UTC (permalink / raw) To: Phillip Lord; +Cc: emacs-devel >>>>> "PL" == Phillip Lord <phillip.lord@russet.org.uk> writes: PL> The main motivation for this is the same as last time; it gives a PL> communication channel with Emacs which does not involve buffers at any PL> point. Although, if you search for "Emacs" and "standard output", other PL> people would like the same thing for other reasons. Have you thought of allowing files to be "opened" for direct writing as well? That is, I'd rather see file handles become a new output stream type, with stdout and stderr instances of these, than hard-coded streams for only stdout and stderr. Although, getting cleanup right makes me less certain. -- John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: standard output/error/input streams 2017-01-19 7:21 ` John Wiegley @ 2017-01-20 13:38 ` Phillip Lord 2017-01-20 16:26 ` Stefan Monnier 1 sibling, 0 replies; 12+ messages in thread From: Phillip Lord @ 2017-01-20 13:38 UTC (permalink / raw) To: emacs-devel John Wiegley <jwiegley@gmail.com> writes: >>>>>> "PL" == Phillip Lord <phillip.lord@russet.org.uk> writes: > > PL> The main motivation for this is the same as last time; it gives a > PL> communication channel with Emacs which does not involve buffers at any > PL> point. Although, if you search for "Emacs" and "standard output", other > PL> people would like the same thing for other reasons. > > Have you thought of allowing files to be "opened" for direct writing as well? > That is, I'd rather see file handles become a new output stream type, with > stdout and stderr instances of these, than hard-coded streams for only stdout > and stderr. Although, getting cleanup right makes me less certain. Yes, that would be nice I agree, although standard out gives me my main use case, and there is already support for clean up. I'll take a look next maybe. Phil ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: standard output/error/input streams 2017-01-19 7:21 ` John Wiegley 2017-01-20 13:38 ` Phillip Lord @ 2017-01-20 16:26 ` Stefan Monnier 2017-01-20 21:24 ` John Wiegley 1 sibling, 1 reply; 12+ messages in thread From: Stefan Monnier @ 2017-01-20 16:26 UTC (permalink / raw) To: emacs-devel > Have you thought of allowing files to be "opened" for direct writing as well? Last time this came up, I thought that mapping "opened files" to Emacs subprocess objects was probably going to be more natural. Stefan ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: standard output/error/input streams 2017-01-20 16:26 ` Stefan Monnier @ 2017-01-20 21:24 ` John Wiegley 2017-01-20 21:52 ` Stefan Monnier 0 siblings, 1 reply; 12+ messages in thread From: John Wiegley @ 2017-01-20 21:24 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel >>>>> "SM" == Stefan Monnier <monnier@iro.umontreal.ca> writes: SM> Last time this came up, I thought that mapping "opened files" to Emacs SM> subprocess objects was probably going to be more natural. That does make me realize that I could use `start-process` with an executable that does what I want, and use `process-send-string` to bypass the involvement of any buffers. Thanks for mentioning it. -- John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: standard output/error/input streams 2017-01-20 21:24 ` John Wiegley @ 2017-01-20 21:52 ` Stefan Monnier 2017-01-20 21:59 ` John Wiegley 2017-01-23 12:41 ` Phillip Lord 0 siblings, 2 replies; 12+ messages in thread From: Stefan Monnier @ 2017-01-20 21:52 UTC (permalink / raw) To: emacs-devel > That does make me realize that I could use `start-process` with an executable > that does what I want, and use `process-send-string` to bypass the involvement > of any buffers. Thanks for mentioning it. Right. What I was thinking of was to add a `make-file-process` primitive so you don't need an external executable. Stefan ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: standard output/error/input streams 2017-01-20 21:52 ` Stefan Monnier @ 2017-01-20 21:59 ` John Wiegley 2017-01-23 12:41 ` Phillip Lord 1 sibling, 0 replies; 12+ messages in thread From: John Wiegley @ 2017-01-20 21:59 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel >>>>> "SM" == Stefan Monnier <monnier@iro.umontreal.ca> writes: SM> Right. What I was thinking of was to add a `make-file-process` primitive SM> so you don't need an external executable. Sounds like a good workaround to me, and handily solves the cleanup problem. -- John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: standard output/error/input streams 2017-01-20 21:52 ` Stefan Monnier 2017-01-20 21:59 ` John Wiegley @ 2017-01-23 12:41 ` Phillip Lord 2017-01-23 13:11 ` Stefan Monnier 1 sibling, 1 reply; 12+ messages in thread From: Phillip Lord @ 2017-01-23 12:41 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: >> That does make me realize that I could use `start-process` with an executable >> that does what I want, and use `process-send-string` to bypass the involvement >> of any buffers. Thanks for mentioning it. > > Right. What I was thinking of was to add a `make-file-process` > primitive so you don't need an external executable. If we had a function to go to generate a stream from a process then we could have our cake and eat it. Phil ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: standard output/error/input streams 2017-01-23 12:41 ` Phillip Lord @ 2017-01-23 13:11 ` Stefan Monnier 0 siblings, 0 replies; 12+ messages in thread From: Stefan Monnier @ 2017-01-23 13:11 UTC (permalink / raw) To: Phillip Lord; +Cc: emacs-devel > If we had a function to go to generate a stream from a process then we > could have our cake and eat it. (lambda (c) (process-send-string PROC (string c))) ? BTW, w.r.t stdin/stdout/stderr: these are special because they may be inaccessible to something like a subprocess (or at least it can be nigh on impossible for the Emacs process itself to determine where std(in|out|err) are going). IOW, additionally to make-file-process, we'd need a make-process-from-open-file-descriptor. Stefan ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2017-01-23 13:11 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-01-14 12:22 standard output/error/input streams Phillip Lord 2017-01-14 14:03 ` Noam Postavsky 2017-01-14 14:31 ` Eli Zaretskii 2017-01-14 17:51 ` Eli Zaretskii 2017-01-19 7:21 ` John Wiegley 2017-01-20 13:38 ` Phillip Lord 2017-01-20 16:26 ` Stefan Monnier 2017-01-20 21:24 ` John Wiegley 2017-01-20 21:52 ` Stefan Monnier 2017-01-20 21:59 ` John Wiegley 2017-01-23 12:41 ` Phillip Lord 2017-01-23 13:11 ` Stefan Monnier
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).