From 8ab9f3ca383bab73dbb71c5b3335334e1385dde6 Mon Sep 17 00:00:00 2001 From: Marin Hannache Date: Tue, 19 Aug 2014 12:05:36 +0100 Subject: [readline] Add CTRL-W shortcut to remove a word Signed-off-by: Marin Hannache Modified-by: Michael Brown Signed-off-by: Michael Brown --- src/hci/editstring.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'src/hci') diff --git a/src/hci/editstring.c b/src/hci/editstring.c index 8c56d233..5f6f04d5 100644 --- a/src/hci/editstring.c +++ b/src/hci/editstring.c @@ -21,6 +21,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include +#include #include #include @@ -37,6 +38,8 @@ static void insert_character ( struct edit_string *string, unsigned int character ) __nonnull; static void delete_character ( struct edit_string *string ) __nonnull; static void backspace ( struct edit_string *string ) __nonnull; +static void previous_word ( struct edit_string *string ) __nonnull; +static void kill_word ( struct edit_string *string ) __nonnull; static void kill_sol ( struct edit_string *string ) __nonnull; static void kill_eol ( struct edit_string *string ) __nonnull; @@ -110,10 +113,37 @@ static void backspace ( struct edit_string *string ) { } } +/** + * Move to start of previous word + * + * @v string Editable string + */ +static void previous_word ( struct edit_string *string ) { + while ( string->cursor && + isspace ( string->buf[ string->cursor - 1 ] ) ) { + string->cursor--; + } + while ( string->cursor && + ( ! isspace ( string->buf[ string->cursor - 1 ] ) ) ) { + string->cursor--; + } +} + +/** + * Delete to end of previous word + * + * @v string Editable string + */ +static void kill_word ( struct edit_string *string ) { + size_t old_cursor = string->cursor; + previous_word ( string ); + insert_delete ( string, ( old_cursor - string->cursor ), NULL ); +} + /** * Delete to start of line * - * @v string Editable string + * @v string Editable string */ static void kill_sol ( struct edit_string *string ) { size_t old_cursor = string->cursor; @@ -181,6 +211,10 @@ int edit_string ( struct edit_string *string, int key ) { /* Delete character */ delete_character ( string ); break; + case CTRL_W: + /* Delete word */ + kill_word ( string ); + break; case CTRL_U: /* Delete to start of line */ kill_sol ( string ); -- cgit v1.2.3-55-g7522