diff options
Diffstat (limited to 'xC.c')
-rw-r--r-- | xC.c | 31 |
1 files changed, 19 insertions, 12 deletions
@@ -2480,9 +2480,11 @@ static struct config_schema g_config_behaviour[] = .default_ = "1000", .on_change = on_config_backlog_limit_change }, { .name = "backlog_helper", - .comment = "Shell command to display a buffer's history", + .comment = "Shell command to page buffer history (args: name [path])", .type = CONFIG_ITEM_STRING, - .default_ = "\"LESSSECURE=1 less -M -R +Gb\"" }, + .default_ = "`name=$(echo \"$1\" | sed 's/[%?:.]/\\\\&/g'); " + "prompt='?f%F:'$name'. ?db- page %db?L of %D. .(?eEND:?PB%PB\\%..)'; " + "LESSSECURE=1 less +Gb -Ps\"$prompt\" \"${2:--R}\"`" }, { .name = "backlog_helper_strip_formatting", .comment = "Strip formatting from backlog helper input", .type = CONFIG_ITEM_BOOLEAN, @@ -13366,15 +13368,19 @@ input_editor_cleanup (struct app_context *ctx) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - static void -launch_backlog_helper (struct app_context *ctx, int backlog_fd) +launch_backlog_helper (struct app_context *ctx, int backlog_fd, + const char *name, const char *path) { hard_assert (!ctx->running_backlog_helper); switch (spawn_helper_child (ctx)) { case 0: dup2 (backlog_fd, STDIN_FILENO); - execl ("/bin/sh", "/bin/sh", "-c", get_config_string - (ctx->config.root, "behaviour.backlog_helper"), NULL); + char *localized_name = + iconv_xstrdup (ctx->term_from_utf8, (char *) name, -1, NULL); + execl ("/bin/sh", "/bin/sh", "-c", + get_config_string (ctx->config.root, "behaviour.backlog_helper"), + PROGRAM_NAME, localized_name, path, NULL); print_error ("%s: %s", "Failed to launch backlog helper", strerror (errno)); _exit (EXIT_FAILURE); @@ -13419,7 +13425,7 @@ display_backlog (struct app_context *ctx, int flush_opts) rewind (backlog); set_cloexec (fileno (backlog)); - launch_backlog_helper (ctx, fileno (backlog)); + launch_backlog_helper (ctx, fileno (backlog), buffer->name, NULL); fclose (backlog); return true; } @@ -13447,24 +13453,25 @@ on_display_full_log (int count, int key, void *user_data) (void) key; struct app_context *ctx = user_data; - char *path = buffer_get_log_path (ctx->current_buffer); + struct buffer *buffer = ctx->current_buffer; + char *path = buffer_get_log_path (buffer); FILE *full_log = fopen (path, "rb"); - free (path); - if (!full_log) { log_global_error (ctx, "Failed to open log file for #s: #l", ctx->current_buffer->name, strerror (errno)); + free (path); return false; } - if (ctx->current_buffer->log_file) + if (buffer->log_file) // The regular flush will log any error eventually - (void) fflush (ctx->current_buffer->log_file); + (void) fflush (buffer->log_file); set_cloexec (fileno (full_log)); - launch_backlog_helper (ctx, fileno (full_log)); + launch_backlog_helper (ctx, fileno (full_log), buffer->name, path); fclose (full_log); + free (path); return true; } |