aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ring.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ring.c')
-rw-r--r--src/ring.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/src/ring.c b/src/ring.c
index 548173b..cda15c4 100644
--- a/src/ring.c
+++ b/src/ring.c
@@ -76,15 +76,6 @@ teco_buffer_undo_edit(teco_buffer_t *ctx)
}
/** @private @memberof teco_buffer_t */
-static inline gchar *
-teco_buffer_get_recovery(teco_buffer_t *ctx)
-{
- g_autofree gchar *dirname = g_path_get_dirname(ctx->filename);
- g_autofree gchar *basename = g_path_get_basename(ctx->filename);
- return g_strconcat(dirname, G_DIR_SEPARATOR_S, "#", basename, "#", NULL);
-}
-
-/** @private @memberof teco_buffer_t */
static gboolean
teco_buffer_load(teco_buffer_t *ctx, const gchar *filename, GError **error)
{
@@ -119,7 +110,7 @@ teco_buffer_save(teco_buffer_t *ctx, const gchar *filename, GError **error)
if (ctx == teco_ring_current && !teco_qreg_current)
undo__teco_interface_info_update_buffer(ctx);
if (ctx->state > TECO_BUFFER_DIRTY_NO_DUMP) {
- g_autofree gchar *filename_recovery = teco_buffer_get_recovery(ctx);
+ g_autofree gchar *filename_recovery = teco_file_get_recovery(ctx->filename);
g_unlink(filename_recovery);
/* on rubout, we do not restore the recovery file */
ctx->state = TECO_BUFFER_DIRTY_NO_DUMP;
@@ -149,7 +140,7 @@ teco_buffer_free(teco_buffer_t *ctx)
*/
if (ctx->state > TECO_BUFFER_DIRTY_NO_DUMP &&
teco_interrupted != TECO_TERMINATED) {
- g_autofree gchar *filename_recovery = teco_buffer_get_recovery(ctx);
+ g_autofree gchar *filename_recovery = teco_file_get_recovery(ctx->filename);
g_unlink(filename_recovery);
}
@@ -250,7 +241,7 @@ static void
teco_ring_undirtify(void)
{
if (teco_ring_current->state > TECO_BUFFER_DIRTY_NO_DUMP) {
- g_autofree gchar *filename_recovery = teco_buffer_get_recovery(teco_ring_current);
+ g_autofree gchar *filename_recovery = teco_file_get_recovery(teco_ring_current->filename);
g_unlink(filename_recovery);
}
@@ -346,7 +337,7 @@ teco_ring_dump_recovery(void)
if (!buffer->filename)
continue;
- g_autofree gchar *filename_recovery = teco_buffer_get_recovery(buffer);
+ g_autofree gchar *filename_recovery = teco_file_get_recovery(buffer->filename);
g_autoptr(GIOChannel) channel = g_io_channel_new_file(filename_recovery, "w", NULL);
if (!channel)
@@ -736,19 +727,24 @@ teco_state_read_file_done(teco_machine_main_t *ctx, teco_string_t str, GError **
if (ctx->flags.mode > TECO_MODE_NORMAL)
return &teco_state_start;
- sptr_t pos = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
- teco_undo_int(teco_ranges[0].from) = teco_interface_bytes2glyphs(pos);
+ sptr_t from = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
+ teco_undo_int(teco_ranges[0].from) = teco_current_doc_get_dot();;
g_autofree gchar *filename = teco_file_expand_path(str.data);
/* FIXME: Add wrapper to interface.h? */
if (!teco_view_load(teco_interface_current_view, filename, FALSE, error))
return NULL;
- pos = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
- teco_undo_int(teco_ranges[0].to) = teco_interface_bytes2glyphs(pos);
+ /*
+ * FIXME: Perhaps teco_view_load() should return the number of glyphs added.
+ */
+ sptr_t to = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
+ teco_undo_int(teco_ranges[0].to) = teco_interface_bytes2glyphs_rel(teco_ranges[0].from,
+ from, to-from);
teco_undo_guint(teco_ranges_count) = 1;
if (teco_ranges[0].from != teco_ranges[0].to) {
+ teco_current_doc_set_dot(teco_ranges[0].to);
teco_ring_dirtify();
if (teco_current_doc_must_undo())