degesch: customize C-l behaviour

Reprint the backlog.
This commit is contained in:
Přemysl Eric Janouch 2015-05-08 05:03:36 +02:00
parent bdbc4b33f0
commit cc505090d4
1 changed files with 66 additions and 4 deletions

View File

@ -2220,11 +2220,8 @@ buffer_remove (struct app_context *ctx, struct buffer *buffer)
}
static void
buffer_activate (struct app_context *ctx, struct buffer *buffer)
buffer_print_backlog (struct app_context *ctx, struct buffer *buffer)
{
if (ctx->current_buffer == buffer)
return;
print_status ("%s", buffer->name);
// That is, minus the buffer switch line and the readline prompt
@ -2238,6 +2235,16 @@ buffer_activate (struct app_context *ctx, struct buffer *buffer)
buffer_line_display (ctx, line, false);
buffer->unseen_messages_count = 0;
refresh_prompt (ctx);
}
static void
buffer_activate (struct app_context *ctx, struct buffer *buffer)
{
if (ctx->current_buffer == buffer)
return;
buffer_print_backlog (ctx, buffer);
input_switch_buffer (&ctx->input, buffer->input_data);
// Now at last we can switch the pointers
@ -5365,6 +5372,25 @@ make_completions (struct app_context *ctx, char *line, int start, int end)
return completions;
}
// --- Common code for user actions --------------------------------------------
static bool
redraw_screen (struct app_context *ctx)
{
if (!soft_assert (clear_screen != NULL))
return false;
input_hide (&ctx->input);
terminal_printer_fn printer = get_attribute_printer (stdout);
tputs (clear_screen, 1, printer);
fflush (stdout);
buffer_print_backlog (ctx, ctx->current_buffer);
input_show (&ctx->input);
return true;
}
// --- GNU Readline user actions -----------------------------------------------
#ifdef HAVE_READLINE
@ -5411,6 +5437,18 @@ on_readline_next_buffer (int count, int key)
return 0;
}
static int
on_readline_redraw_screen (int count, int key)
{
(void) count;
(void) key;
struct app_context *ctx = g_ctx;
if (!redraw_screen (ctx))
input_ding (&ctx->input);
return 0;
}
static int
on_readline_return (int count, int key)
{
@ -5503,6 +5541,12 @@ app_readline_init (void)
if (key_f6)
rl_bind_keyseq (key_f6, rl_named_function ("next-buffer"));
if (clear_screen)
{
rl_add_defun ("redraw-screen", on_readline_redraw_screen, -1);
rl_bind_keyseq ("\\C-l", rl_named_function ("redraw-screen"));
}
// We need to hide the prompt first
rl_bind_key (RETURN, on_readline_return);
@ -5564,6 +5608,17 @@ on_editline_next_buffer (EditLine *editline, int key)
return CC_NORM;
}
static unsigned char
on_editline_redraw_screen (EditLine *editline, int key)
{
(void) editline;
(void) key;
if (!redraw_screen (g_ctx))
return CC_ERROR;
return CC_NORM;
}
static unsigned char
on_editline_complete (EditLine *editline, int key)
{
@ -5676,6 +5731,13 @@ app_editline_init (struct input *self)
if (key_f6)
el_set (self->editline, EL_BIND, key_f6, "next-buffer", NULL);
if (clear_screen)
{
el_set (self->editline, EL_ADDFN, "redraw-screen",
"Redraw screen", on_editline_redraw_screen);
el_set (self->editline, EL_BIND, "^L", "redraw-screen", NULL);
}
// Source the user's defaults file
el_source (self->editline, NULL);