lineedit: fix handling of repeating Alt-b, Alt-f, Alt-d, Alt-Backspace

These key combinations should repeat correctly when the keys are
pressed and held.

Before this change, they do this erratically - many repeats are "eaten"
because they are treated as unrecognized ESC seqs:
ESC 0x7f is treated by Alt+baskspace, but ESC 0x7f ESC 0x7f ESC 0x7f
is unrecognized.

Escape sequences corresponding to these key combinations are moved from
read_line_input to lineedit_read_key.

Also, these key sequences are now enabled regardless of whether
FEATURE_EDITING_VI is set, since Vim does not actually support these key
combinations, but they are present in readline library.

function                                             old     new   delta
static.esccmds                                        93     103     +10
read_line_input                                     3737    3687     -50

Signed-off-by: Rostislav Skudnov <rostislav@tuxera.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Rostislav Skudnov
2016-11-24 15:04:00 +01:00
committed by Denys Vlasenko
parent cb810c48c0
commit 2e4ef38743
3 changed files with 67 additions and 79 deletions

View File

@@ -18,8 +18,20 @@ int64_t FAST_FUNC read_key(int fd, char *buffer, int timeout)
/* Known escape sequences for cursor and function keys.
* See "Xterm Control Sequences"
* http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
* Array should be sorted from shortest to longest.
*/
static const char esccmds[] ALIGN1 = {
'\x7f' |0x80,KEYCODE_ALT_BACKSPACE,
'\b' |0x80,KEYCODE_ALT_BACKSPACE,
'd' |0x80,KEYCODE_ALT_D ,
/* lineedit mimics bash: Alt-f and Alt-b are forward/backward
* word jumps. We cheat here and make them return ALT_LEFT/RIGHT
* keycodes. This way, lineedit need no special code to handle them.
* If we'll need to distinguish them, introduce new ALT_F/B keycodes,
* and update lineedit to react to them.
*/
'f' |0x80,KEYCODE_ALT_RIGHT,
'b' |0x80,KEYCODE_ALT_LEFT,
'O','A' |0x80,KEYCODE_UP ,
'O','B' |0x80,KEYCODE_DOWN ,
'O','C' |0x80,KEYCODE_RIGHT ,