let rec create_view ?(attributes=[]) topwin file =
  let v = new sourceview ~attributes topwin on_view_destroy
    set_active_sourceview dup file_rename file
  in
  ignore(v#source_view#connect#destroy (fun () -> on_view_destroy v));
  views := v :: !views;
  v

and dup file topwin =
  (create_view topwin file :> Ed_view.gui_view)

and file_rename oldname newname =
  try
    ignore(List.find (fun b -> Ed_misc.safe_same_files b#filename newname) !buffers);
    let mes = Printf.sprintf "%s is already open. Close it before." newname in
    failwith mes
  with Not_found ->
      (* search on names here, not dev/inode *)
      let views = List.filter (fun v -> v#filename = oldname) !views in
      let b = get_buffer oldname in
      let old_buffer_name = b#name in
      b#set_filename newname;
      b#set_name (get_fresh_buffer_name (Filename.basename newname));
      rename_buffer_in_history old_buffer_name b#name;
      List.iter (fun v -> v#my_set_label; v#display_state) views