[TxMt] Re: Problem with real-time presenting standard output (cout) in HTML output

Matt Neuburg matt at tidbits.com
Sun Mar 21 17:25:00 UTC 2010


hugos <kluczka at o2.pl> wrote:

> I wrote a program in C++ which does some long calculations. For information
> purpose it has a "cout" function which tels me about a progress of
> evaluation.
> I'm used to compile my program via TM with my own boundle-command script
> which looks like that:
> ------------------------------------------------------------
> echo "<html><body><pre>" 
> 
> make | pre
> 
> find_name="grep 'NAME=' ./makefile | cut -c 6- "
> cmd= `eval $find_name | awk '{print "./"$0}'`
> $cmd
> 
> echo "</pre></body></html>"
> ------------------------------------------------------------
> My problem is that the standard output (text that "cout" presents) is shown
> at once after program is finished (but non during program is running) so I
> don't see progress of calculation.
> 
> Is there a way for presenting standard output in these case (in real-time)?

The first thing to try is getting rid of the <pre> tags, since these
explicitly *prevent* output from appearing in real time. 

If that works, then you may notice that you're losing the formatting
advantage of using <pre>. You can work around this, and keep the <pre>,
by appending <br> tags to each line as it appears, but to do that you're
probably going to need to pipe your output through something else.

For example, what I do (since Ruby is what I happen to use) is wrap the
call to my script in a Ruby script which redirects stdout to pass thru
my own class. Here are some relevant excerpts:

require "#{ENV["TM_SUPPORT_PATH"]}/lib/web_preview.rb"
require "#{ENV["TM_SUPPORT_PATH"]}/lib/escape.rb"

    def write(s)
      s = htmlize(s, :no_newline_after_br => true)
      @old_stdout.print s
    end

So, what happens is as output occurs it is passed to me, because I am
substituting myself for stdout. (Heh heh.) Meanwhile the real stdout has
been saved as @old_stdout. So my write() is called (because I appear to
be stdout), I fix up the output with a <br> using TextMate's built-in
htmlize(), and then pass the line on out to the real stdout, thus
causing it to appear in TextMate's output window, in real time.

So you might be able to set up a pipe that does something similar. There
are buffering issues, of course, which are too elaborate to discuss
here... :)

m.

-- 
matt neuburg, phd = matt at tidbits.com <http://www.tidbits.com/matt/>
A fool + a tool + an autorelease pool = cool!
AppleScript: the Definitive Guide - Second Edition!
http://www.tidbits.com/matt/default.html#applescriptthings




More information about the textmate mailing list