method transpose_words =
let b = file#buffer in
let insert = b#get_iter `INSERT in
try
let right_word_start =
if insert#starts_word then
insert
else
let it =
let itend =
if insert#inside_word then insert#forward_word_end else insert
in
let itend2 = itend#forward_word_end in
if itend2#equal itend or not itend2#ends_word then
raise Not_found
else
itend2#backward_word_start
in
if it#is_end or not it#starts_word then
raise Not_found
else
it
in
let right_word_end = right_word_start#forward_word_end in
let left_word_start =
let it = right_word_start#backward_word_start in
if it#equal right_word_start or not it#starts_word then
raise Not_found
else
it
in
let left_word_end = left_word_start#forward_word_end in
let rw_start_offset = right_word_start#offset in
let rw_end_offset = right_word_end#offset in
let rw_size = rw_end_offset - rw_start_offset in
let lw_start_offset = left_word_start#offset in
let lw_end_offset = left_word_end#offset in
let lw_size = lw_end_offset - lw_start_offset in
let rw = b#get_text ~start: right_word_start ~stop: right_word_end () in
let lw = b#get_text ~start: left_word_start ~stop: left_word_end () in
b#begin_user_action ();
b#delete ~start: right_word_start ~stop: right_word_end;
let left_word_start = b#get_iter (`OFFSET lw_start_offset) in
let left_word_end = b#get_iter (`OFFSET lw_end_offset) in
b#delete ~start: left_word_start ~stop: left_word_end;
let iter = b#get_iter (`OFFSET lw_start_offset) in
b#insert ~iter rw;
let iter = b#get_iter (`OFFSET (rw_start_offset - lw_size + rw_size)) in
let ins_offset = iter#offset in
b#insert ~iter lw;
self#place_cursor (b#get_iter (`OFFSET (ins_offset + lw_size)));
b#end_user_action ()
with
Not_found ->
()