]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[readline] Add CTRL-W shortcut to remove a word
authorMarin Hannache <git@mareo.fr>
Tue, 19 Aug 2014 11:05:36 +0000 (12:05 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 19 Aug 2014 11:05:36 +0000 (12:05 +0100)
Signed-off-by: Marin Hannache <git@mareo.fr>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/hci/editstring.c

index 8c56d2337b524eb4570405699fee13c295413548..5f6f04d51b36e5abefffd55dcbf363066df4390a 100644 (file)
@@ -21,6 +21,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 
 #include <assert.h>
 #include <string.h>
+#include <ctype.h>
 #include <ipxe/keys.h>
 #include <ipxe/editstring.h>
 
@@ -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 );