diff options
author | Chris Luke <chrisy@flirble.org> | 2016-04-29 08:53:46 -0400 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2016-04-29 22:37:08 +0000 |
commit | 6de2ff28fef27421f6b9a6c1f4ef53d1bd8c7c6e (patch) | |
tree | 6c388fdabf4aaf744aedc0164de8682e4d558732 | |
parent | 7ef6d5bb681c60a4f7cde2f5c8fb6283907d39bc (diff) |
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 <chrisy@flirble.org>
-rw-r--r-- | vlib/vlib/unix/cli.c | 34 |
1 files 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; |