let goto_error file line start stop error =
  match !Ed_sourceview.active_sourceview with
    None -> ()
  | Some v ->
      let com = Printf.sprintf "open_file \"%s\" %d,%d" file (line-1) start in
      Cam_commands.eval_command com;
      v#set_location ((line-1), start);
      let mes = Printf.sprintf "Line %d, chars %d-%d: %s" line start stop error in
      Ed_misc.error_message (Ed_misc.to_utf8 mes);
      let line_offset =
        let it = v#file#buffer#get_iter (`LINE (line-1)) in
        it#offset
      in
      let from_display =
        v#file#mode_from_display
          (v#file#buffer#get_text ())
      in
      let (left, right) =
        let left =
          Cam_misc.utf8_string_length
            (v#file#mode_to_display
             (String.sub from_display 0 (line_offset + start)))
        in
        let right =
          Cam_misc.utf8_string_length
            (v#file#mode_to_display
             (String.sub from_display 0 (line_offset + stop)))
        in
        (left, right)
      in
      let start = v#file#buffer#get_iter (`OFFSET left) in
      let stop = v#file#buffer#get_iter (`OFFSET right) in
      v#file#buffer#select_range start stop