On 17/03/16 11:47, [email protected] wrote:
That output goes through string_to_stdout in
snd-xen.c, I think (it's watched for via
g_io_channel_unix_get_fd in snd-gmain.c).
Snd used to have a print-hook for stuff like
this, but it didn't get used for years, so
I removed it.  I could add a hook to
string_to_stdout to add a prompt, if you like.
I think you could change string_to_stdout
to

  fprintf(stdout, "%s\n> ", msg);

or something like that to get a prompt,
but I haven't tried it.




Thanks Bill - I got the desired effect by editing snd_eval_stdin_str:

void snd_eval_stdin_str(const char *buf)
{
  /* we may get incomplete expressions here */
/* (Ilisp always sends a complete expression, but it may be broken into two or more pieces from read's point of view) */

  char *str = NULL;
  if (mus_strlen(buf) == 0) return;

  str = stdin_check_for_full_expression(buf);
  if (str)
    {
      Xen result;
      int loc;

      redirect_everything_to(string_to_stdout, NULL);
      result = snd_catch_any(eval_str_wrapper, (void *)str, str);
      redirect_everything_to(NULL, NULL);

      loc = snd_protect(result);
      stdin_free_str();

      str = gl_print(result);
      string_to_stdout(str, NULL);

      /***** DANIEL: Next two lines added *****/
      fprintf(stdout, ">>> ");
      fflush(stdout);

      if (str) free(str);
      snd_unprotect_at(loc);
    }
}

Putting it here makes the new prompt appear only once, after the result and after any errors/warnings/snd-print statements that got printed out via the redirect_everything_to/snd_catch_any calls.

The fflush() was necessary otherwise the new prompt it doesn't appear until after the next console read (that confused me for a while, I can tell you).

Also, to make the prompt appear once at program start, I added the same two lines (fprintf and fflush) to g_xen_initialize(), right after where it calls g_init_listener(). I suppose a more uniform solution would be to make a new 'g_init_stdin()' function consisting of the new lines and call that instead.

I was going to make a patch file of these changes to proudly present to you but there are some other things to round out which I don't quite have the tenacity to fully do right now - when starting up with -nostdin, my hacked-in prompt spills onto stdout twice (once from g_xen_initialize() and once from snd_eval_stdin_str() being called once for some reason). And, it would also make sense if there was a built-in 'stdin-prompt' variable, similar to 'listener-prompt', for customizing this. It would default to an empty string, not to disrupt the existing default behaviour. I attempted this but my naive copy-pasting didn't quite take me 100% of the way there, and to be honest my Scheme aptitude is still a bit weak for this kind of thing. I might have another go at a later date, unless you reckon these are jolly good ideas and get in there first!

Daniel

_______________________________________________
Cmdist mailing list
[email protected]
https://cm-mail.stanford.edu/mailman/listinfo/cmdist

Reply via email to