    # File lib/vmail/imap_client.rb, line 416
        def show_message(uid, raw=false)
          log "show message: #{uid}"
          return @current_mail.to_s if raw
          uid = uid.to_i
          if uid == @current_message_uid
            return @current_message
          end

          #prefetch_adjacent(index) # deprecated

          # TODO keep state in vim buffers, instead of on Vmail Ruby client
          # envelope_data[:row_text] = envelope_data[:row_text].gsub(/^\+ /, '  ').gsub(/^\*\+/, '* ') # mark as read in cache
          #seqno = envelope_data[:seqno]

          log "showing message uid: #{uid}"
          data = if x = message_cache[[@mailbox, uid]]
                   log "- message cache hit"
                   x
                 else
                   log "- fetching and storing to message_cache[[#{@mailbox}, #{uid}]]"
                   fetch_and_cache(uid)
                 end
          if data.nil?
            # retry, though this is a hack!
            log "- data is nil. retrying..."
            return show_message(uid, raw)
          end
          # make this more DRY later by directly using a ref to the hash
          mail = data[:mail]
          size = data[:size]
          @current_message_uid = uid
          log "- setting @current_mail"
          @current_mail = mail # used later to show raw message or extract attachments if any
          @current_message = data[:message_text]
        rescue
          log "parsing error"
          "Error encountered parsing this message:\n#{$!}\n#{$!.backtrace.join("\n")}"
        end