method transpose_lines =
      let b = file#buffer in
      let insert = b#get_iter `INSERT in
      let line = insert#line in
      if line = 0 then
        ()
      else
        let (line1_start, line1_stop) =
          ((if insert#starts_line then insert else insert#backward_line#forward_line),
           (if insert#is_end then insert else insert#forward_line))
        in
        let prevline_start = line1_start#backward_line in
        (*
           prerr_endline (Printf.sprintf "prevline_start:%s" (string_of_location (location_of_iter prevline_start)));
        *)

        let prevline_stop =
          (* do not cut the line with the ending '\\' if we are at the end of the buffer,
             to prevent adding a new blank line *)

          if line1_stop#is_end or line1_start#equal line1_stop then
            prevline_start#forward_to_line_end
          else
            line1_start
        in
        (*
           prerr_endline (Printf.sprintf "prevline_stop:%s" (string_of_location (location_of_iter prevline_stop)));
        *)

        let prev_line = b#get_text ~start: prevline_start ~stop: prevline_stop () in
        let prev_line =
          if line1_stop#is_end or line1_start#equal line1_stop then
            "\n"^prev_line
          else
            prev_line
        in
        (*
           let sline = b#get_text ~start: line1_start ~stop: line1_stop () in
           prerr_endline (Printf.sprintf "prev_line=\"%s\"" (self#of_utf8 prev_line));
           prerr_endline (Printf.sprintf "line=\"%s\"" (self#of_utf8 sline));
        *)

        b#begin_user_action ();
      self#place_cursor line1_stop;
      b#delete ~start: prevline_start ~stop: line1_start;
      b#insert prev_line;
      self#goto_line (line + 1);
      b#end_user_action ()