method select_location loc =
      let (l,c) = line_char_of_location buffer (Some loc) in
      self#set_location (l,c);
      buffer#place_cursor ~where: (buffer#get_iter (`LINECHAR (l,c)));
      let (start,stop) =
        match loc with
        | Linechar (l,c) ->
            let n = (buffer#get_iter (`LINECHAR (l,c)))#offset in
            (n, n)
        | Linechars (l,(start,stop)) ->
            let it = buffer#get_iter (`LINECHAR (l,c)) in
            let start2 = it#offset in
            let stop = (it#forward_cursor_positions (stop-start))#offset in
            (start2, stop)
        | Chars (start,stop) -> (start,stop)
        | Char start -> (start,start)
      in
      buffer#select_range
        (buffer#get_iter (`OFFSET start))
        (buffer#get_iter (`OFFSET stop))