[TxMt] Re: error messages - R-Bundle

Hans-Jörg Bibiko bibiko at eva.mpg.de
Sat Feb 4 17:16:09 UTC 2012


Hi,

maybe I found a fix for that issue (at least my test script now runs :) ):

The new R.tmbundle stuff I host at https://github.com/avian/r.tmbundle/
thus here the code which should be tested.

Please replace everything in between

STDOUT.sync = true {... and ...} STDOUT.flush

in file tmR.rb by:

STDOUT.sync = false
STDERR.sync = false

descriptors = [stdout, stderr]
descriptors.each { |fd| fd.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK) }
until descriptors.empty?
  select(descriptors).shift.each do |io|
    begin
      str = io.readline
    rescue
      descriptors.delete io
      io.close
      break
    end
    if str.nil? or str.empty?
      descriptors.delete io
      io.close
    elsif io == stderr
      # just in case
      print hideStartMessageJS
      print %{<span style="color: red">#{esc str}</span>}
    elsif io == stdout
      print hideStartMessageJS
      str.each_line do |line|
        # line counter for top level source
        if line.include?("#{linecountermarker}")
          linecounter += 1
          line.sub!("#{linecountermarker}", '')
        end
        # check for a comment sign at the beginning of a line
        if line.match(/>\s*#/)
          print "<i><font color=blue>#{esc line.chomp}</font></i>\n"
        # check for a comment within a line - regexp should be improved yet!
        elsif m=line.match(/(.*?)(#[^"']*)$/)
          print esc(m[1]).gsub(/^(>|\+)/,'<a class="prompt" href="txmt://open?line='+linecounter.to_s+'">\1</a>')
          print "<i><font color=blue>#{esc(m[2]).chomp}</font></i>\n"
        # check for error messages
        elsif m=line.match(/(?i)^\s*(error|erreur|fehler|errore|erro)( |:)/)
          where = (isSelection) ? " of selection" : ""
          print "<span style='color: red'>#{esc str.gsub(%r{(?m).*?#{m[1]}},m[1]).chomp}<br /><i>RMate</i> stopped at <a href='txmt://open?line=#{linecounter}'>line #{linecounter-selectionlinestart}#{where}</a></span><br />".gsub(%r{source\("(.*?)"\)},'source("<a href="txmt://open?url=file://\1">\1</a>")')
          print "<hr noshade width='300' size='2' align='left' color=lightgrey>"
          break
        # check for warnings
        elsif line.match(/^\s*(Warning|Warning messages?|Message d.avis|Warnmeldung|Messaggio di avvertimento|Mensagem de aviso):/)
          print "<span style='color: gray'>#{esc line}</span>"
        # print line simply with hyperlinked prompt if given
        elsif line.match(/_\x8./)
          print "#{line.gsub(/_\x8(.)/,'<b>\1</b>')}"
        else
          print esc(line).gsub(/^[\x0-\x9]?(>|\+)/,'<a class="prompt" href="txmt://open?line='+linecounter.to_s+'">\1</a>')
        end
      end
    end
  end
end

STDOUT.flush

Feedback is welcome :)

Cheers,
--Hans



More information about the textmate mailing list