lineedit: add support for M-b, M-f, M-d, M-Backspace

function                                             old     new   delta
ctrl_left                                              -      96     +96
ctrl_right                                             -      76     +76
static.esccmds                                        81      93     +12
read_line_input                                     3876    3885      +9
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 2/0 up/down: 193/0)             Total: 193 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2011-11-03 13:28:22 +01:00
parent 45cdf166dc
commit 9ce09bc9cb
3 changed files with 77 additions and 20 deletions

View File

@@ -2504,6 +2504,44 @@ int FAST_FUNC read_line_input(line_input_t *st, const char *prompt, char *comman
vi_cmdmode = 1;
input_backward(1);
}
/* Handle a few ESC-<key> combinations the same way
* standard readline bindings (IOW: bash) do.
* Often, Alt-<key> generates ESC-<key>.
*/
ic = lineedit_read_key(read_key_buffer, timeout);
switch (ic) {
//case KEYCODE_LEFT: - bash doesn't do this
case 'b':
ctrl_left();
break;
//case KEYCODE_RIGHT: - bash doesn't do this
case 'f':
ctrl_right();
break;
//case KEYCODE_DELETE: - bash doesn't do this
case 'd': /* Alt-D */
{
/* Delete word forward */
int nc, sc = cursor;
ctrl_right();
nc = cursor;
input_backward(cursor - sc);
while (--nc >= cursor)
input_delete(1);
break;
}
case '\b': /* Alt-Backspace(?) */
case '\x7f': /* Alt-Backspace(?) */
//case 'w': - bash doesn't do this
{
/* Delete word backward */
int sc = cursor;
ctrl_left();
while (sc-- > cursor)
input_delete(1);
break;
}
}
break;
#endif /* FEATURE_COMMAND_EDITING_VI */
@@ -2532,9 +2570,11 @@ int FAST_FUNC read_line_input(line_input_t *st, const char *prompt, char *comman
input_backward(1);
break;
case KEYCODE_CTRL_LEFT:
case KEYCODE_ALT_LEFT: /* bash doesn't do it */
ctrl_left();
break;
case KEYCODE_CTRL_RIGHT:
case KEYCODE_ALT_RIGHT: /* bash doesn't do it */
ctrl_right();
break;
case KEYCODE_HOME:

View File

@@ -40,13 +40,14 @@ int64_t FAST_FUNC read_key(int fd, char *buffer, int timeout)
'[','C' |0x80,KEYCODE_RIGHT ,
'[','D' |0x80,KEYCODE_LEFT ,
/* ESC [ 1 ; 2 x, where x = A/B/C/D: Shift-<arrow> */
/* ESC [ 1 ; 3 x, where x = A/B/C/D: Alt-<arrow> */
/* ESC [ 1 ; 3 x, where x = A/B/C/D: Alt-<arrow> - implemented below */
/* ESC [ 1 ; 4 x, where x = A/B/C/D: Alt-Shift-<arrow> */
/* ESC [ 1 ; 5 x, where x = A/B/C/D: Ctrl-<arrow> - implemented below */
/* ESC [ 1 ; 6 x, where x = A/B/C/D: Ctrl-Shift-<arrow> */
'[','H' |0x80,KEYCODE_HOME , /* xterm */
/* [ESC] ESC [ [2] H - [Alt-][Shift-]Home */
'[','F' |0x80,KEYCODE_END , /* xterm */
/* [ESC] ESC [ [2] H - [Alt-][Shift-]Home (End similarly?) */
/* '[','Z' |0x80,KEYCODE_SHIFT_TAB, */
'[','1','~' |0x80,KEYCODE_HOME , /* vt100? linux vt? or what? */
'[','2','~' |0x80,KEYCODE_INSERT ,
/* ESC [ 2 ; 3 ~ - Alt-Insert */
@@ -86,8 +87,12 @@ int64_t FAST_FUNC read_key(int fd, char *buffer, int timeout)
/* '[','1',';','5','B' |0x80,KEYCODE_CTRL_DOWN , - unused */
'[','1',';','5','C' |0x80,KEYCODE_CTRL_RIGHT,
'[','1',';','5','D' |0x80,KEYCODE_CTRL_LEFT ,
/* '[','1',';','3','A' |0x80,KEYCODE_ALT_UP , - unused */
/* '[','1',';','3','B' |0x80,KEYCODE_ALT_DOWN , - unused */
'[','1',';','3','C' |0x80,KEYCODE_ALT_RIGHT,
'[','1',';','3','D' |0x80,KEYCODE_ALT_LEFT ,
/* '[','3',';','3','~' |0x80,KEYCODE_ALT_DELETE, - unused */
0
/* ESC [ Z - Shift-Tab */
};
pfd.fd = fd;