aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/file-utils.c7
-rw-r--r--src/file-utils.h16
-rw-r--r--src/ring.c17
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.
*
diff --git a/src/ring.c b/src/ring.c
index ceeb730..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)