diff options
| -rw-r--r-- | src/file-utils.c | 7 | ||||
| -rw-r--r-- | src/file-utils.h | 16 | ||||
| -rw-r--r-- | src/ring.c | 17 |
3 files changed, 26 insertions, 14 deletions
diff --git a/src/file-utils.c b/src/file-utils.c index 7c37b27..8555271 100644 --- a/src/file-utils.c +++ b/src/file-utils.c @@ -439,10 +439,15 @@ teco_file_auto_complete(const gchar *filename, GFileTest file_test, teco_string_ strcat(strcpy(cur_filename, dirname), cur_basename.data); /* + * In addition to files not passing the GFileTest, + * exclude hidden files and recovery files (unless you already typed + * part of the file name). + * * NOTE: This avoids g_file_test() for G_FILE_TEST_EXISTS * since the file we process here should always exist. */ - if ((!*basename && !teco_file_is_visible(cur_filename)) || + if ((!*basename && (!teco_file_is_visible(cur_filename) || + teco_file_is_recovery(cur_filename))) || (file_test != G_FILE_TEST_EXISTS && !g_file_test(cur_filename, file_test))) { g_free(cur_filename); diff --git a/src/file-utils.h b/src/file-utils.h index 11d6650..2b9003d 100644 --- a/src/file-utils.h +++ b/src/file-utils.h @@ -66,6 +66,22 @@ teco_file_normalize_path(gchar *path) gboolean teco_file_is_visible(const gchar *path); +static inline gboolean +teco_file_is_recovery(const gchar *path) +{ + g_autofree gchar *basename = g_path_get_basename(path); + gsize len = strlen(basename); + return len > 2 && basename[0] == '#' && basename[len-1] == '#'; +} + +static inline gchar * +teco_file_get_recovery(const gchar *path) +{ + g_autofree gchar *dirname = g_path_get_dirname(path); + g_autofree gchar *basename = g_path_get_basename(path); + return g_strconcat(dirname, G_DIR_SEPARATOR_S, "#", basename, "#", NULL); +} + /** * Get absolute path of the program executable. * @@ -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) |
