mirror of https://github.com/ipxe/ipxe.git
[readline] Add CTRL-W shortcut to remove a word
Signed-off-by: Marin Hannache <git@mareo.fr> Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/25/head
parent
8b2942a7db
commit
8ab9f3ca38
|
@ -21,6 +21,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <ipxe/keys.h>
|
#include <ipxe/keys.h>
|
||||||
#include <ipxe/editstring.h>
|
#include <ipxe/editstring.h>
|
||||||
|
|
||||||
|
@ -37,6 +38,8 @@ static void insert_character ( struct edit_string *string,
|
||||||
unsigned int character ) __nonnull;
|
unsigned int character ) __nonnull;
|
||||||
static void delete_character ( struct edit_string *string ) __nonnull;
|
static void delete_character ( struct edit_string *string ) __nonnull;
|
||||||
static void backspace ( 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_sol ( struct edit_string *string ) __nonnull;
|
||||||
static void kill_eol ( struct edit_string *string ) __nonnull;
|
static void kill_eol ( struct edit_string *string ) __nonnull;
|
||||||
|
|
||||||
|
@ -110,6 +113,33 @@ 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
|
* Delete to start of line
|
||||||
*
|
*
|
||||||
|
@ -181,6 +211,10 @@ int edit_string ( struct edit_string *string, int key ) {
|
||||||
/* Delete character */
|
/* Delete character */
|
||||||
delete_character ( string );
|
delete_character ( string );
|
||||||
break;
|
break;
|
||||||
|
case CTRL_W:
|
||||||
|
/* Delete word */
|
||||||
|
kill_word ( string );
|
||||||
|
break;
|
||||||
case CTRL_U:
|
case CTRL_U:
|
||||||
/* Delete to start of line */
|
/* Delete to start of line */
|
||||||
kill_sol ( string );
|
kill_sol ( string );
|
||||||
|
|
Loading…
Reference in New Issue