[PATCH] emacs: show: stop stderr appearing in buffer

Mark Walters markwalters1009 at gmail.com
Thu Sep 12 08:43:28 PDT 2013


On Thu, 12 Sep 2013, Austin Clements <amdragon at MIT.EDU> wrote:
> Quoth Mark Walters on Sep 12 at 10:33 am:
>> 
>> Hi
>> 
>> On Tue, 10 Sep 2013, David Bremner <david at tethera.net> wrote:
>> >> Ideally, we would put this output in the notmuch errors buffer but the
>> >> handler is called asynchronously so we don't know when the output will
>> >> appear. Thus if we put it straight into the errors buffer it could get
>> >> interleaved with other errors, otoh we can't easily tell when we
>> >> have got all the error output so can't wait until the process is complete.
>> >
>> > Hi Mark;
>> >
>> > I think your patch is OK, but would it be much harder to created a named
>> > buffer like *notmuch-view-$message-d* ? (using e.g. the code from
>> > notmuch-show). I might make debugging easier.
>> 
>> Yes this is easy. There are several possibilities and I am not sure
>> which is best (some are clearly bad but are worth mentioning anyway).
>> 
>> 1) have a single buffer for part errors; this would accumulate stuff and
>> output seems to get interleaved so this is probably useless.
>> 
>> 2) have a buffer for each part viewer as you describe.
>> 
>> 3) have a buffer for each part viewer but start its name with a space so
>> it doesn't show up in buffer lists but is findable (maybe)
>
> 3.5) Say something in the echo area when a viewer terminates with
> output, so it doesn't interrupt the user if they're doing something,
> but the output buffer is still discoverable.  Maybe bind C-c ` to show
> the most recently reported output buffer, like what (la)tex-mode and
> others do, and mention this binding in the echo area message.

The key problem here is that I don't know how to tell when the viewer
terminates. The viewer is run asynchronously and the sentinel for that
process puts the output in the buffer that called mm-display-external
(provided that that buffer is still alive).

Moreover, the code in mm-display-external seems to do some strange point
moving:

(when (buffer-live-p outbuf)
  (with-current-buffer outbuf
    (let ((buffer-read-only nil)
	  (point (point)))
      (forward-line 2)
      (mm-insert-inline
       handle (with-current-buffer buffer
		(buffer-string)))
      (goto-char point))))

which seems to put this batch of error/output into the buffer two lines
into the previous batch of error/output. 

>
>> 4) stick with just the temp buffer approach
>> 
>> Also, we could have it togglable with some sort of debug flag. In some
>> senses 3 is nice but you would probably end up with 10's or even
>> hundreds of hidden buffers which seems bad. In 2 you see them so you
>> probably kill them as you go but I think they would be pretty
>> annoying. A key difference from the accumulated show/search/pick buffers
>> is that, at some point, you did want to see those buffers.
>
> 3.5.1) Don't create a buffer until the command has output (or, easier
> to implement: create the buffer, but kill it on exit if there was no
> output).  When starting a new command, kill output buffers from
> no-longer-running viewers that have never been visited (using
> buffer-display-count or buffer-display-time).

Again this relies on being able to tell when a viewer has finished. If I
can do that then I think I could just put the output as a block in
*notmuch-errors*

Best wishes

Mark
>
>> Since all these approaches are easy to implement it is really up to us
>> which we want.
>> 
>> Any thoughts?
>> 
>> Mark
>> 
>> 
>> >
>> > Of course those buffers would accumulate, along with show, search and
>> > pick buffers...
>> >
>> > Or we could push this as is, and add some debugging facility later like
>> > a variable notmuch-view-errors-buffer.
>> >
>> > d


More information about the notmuch mailing list