From 6de2ff28fef27421f6b9a6c1f4ef53d1bd8c7c6e Mon Sep 17 00:00:00 2001 From: Chris Luke Date: Fri, 29 Apr 2016 08:53:46 -0400 Subject: [PATCH] VPP-26 Iterate through empty command line in cli history When cursoring through the command history in the CLI, when you reach the end of the history (ie, back at "where you started") most CLI's typically show a blank line. This is a visual cue that you are back where you started. Change-Id: I5733dbd0dcdc6deac6a0a856cfadbdb987456ec0 Signed-off-by: Chris Luke --- vlib/vlib/unix/cli.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/vlib/vlib/unix/cli.c b/vlib/vlib/unix/cli.c index 7fb20560d77..0aa7f23cbc3 100644 --- a/vlib/vlib/unix/cli.c +++ b/vlib/vlib/unix/cli.c @@ -1048,18 +1048,32 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, cf->excursion += delta; - if (cf->excursion > (i32) vec_len (cf->command_history) -1) - cf->excursion = 0; + if (cf->excursion == vec_len (cf->command_history)) + { + /* down-arrowed to last entry - want a blank line */ + _vec_len (cf->current_command) = 0; + } else if (cf->excursion < 0) - cf->excursion = vec_len (cf->command_history) -1; + { + /* up-arrowed over the start to the end, want a blank line */ + cf->excursion = vec_len (cf->command_history); + _vec_len (cf->current_command) = 0; + } + else + { + if (cf->excursion > (i32) vec_len (cf->command_history) -1) + /* down-arrowed past end - wrap to start */ + cf->excursion = 0; - prev = cf->command_history [cf->excursion]; - vec_validate (cf->current_command, vec_len(prev)-1); + /* Print the command at the current position */ + prev = cf->command_history [cf->excursion]; + vec_validate (cf->current_command, vec_len(prev)-1); - clib_memcpy (cf->current_command, prev, vec_len(prev)); - _vec_len (cf->current_command) = vec_len(prev); - unix_vlib_cli_output_cooked (cf, uf, cf->current_command, - vec_len (cf->current_command)); + clib_memcpy (cf->current_command, prev, vec_len(prev)); + _vec_len (cf->current_command) = vec_len(prev); + unix_vlib_cli_output_cooked (cf, uf, cf->current_command, + vec_len (cf->current_command)); + } cf->cursor = vec_len(cf->current_command); break; @@ -1422,10 +1436,10 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, } else vec_reset_length (cf->current_command); + cf->excursion = vec_len (cf->command_history); } else /* history disabled */ vec_reset_length (cf->current_command); - cf->excursion = 0; cf->search_mode = 0; vec_reset_length (cf->search_key); cf->cursor = 0; -- 2.16.6