aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2011-11-03 13:28:22 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2011-11-03 13:28:22 +0100
commit9ce09bc9cb7743f87eb3e536c81d8c303e12bc81 (patch)
treead65a2f47136af7a730b630c4e08532c02ff0fb6 /libbb
parent45cdf166dccb4981004bae822f52e48df05aab91 (diff)
downloadbusybox-w32-9ce09bc9cb7743f87eb3e536c81d8c303e12bc81.tar.gz
busybox-w32-9ce09bc9cb7743f87eb3e536c81d8c303e12bc81.tar.bz2
busybox-w32-9ce09bc9cb7743f87eb3e536c81d8c303e12bc81.zip
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>
Diffstat (limited to 'libbb')
-rw-r--r--libbb/lineedit.c40
-rw-r--r--libbb/read_key.c11
2 files changed, 48 insertions, 3 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index 603bbfcae..0d232889b 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -2504,6 +2504,44 @@ int FAST_FUNC read_line_input(line_input_t *st, const char *prompt, char *comman
2504 vi_cmdmode = 1; 2504 vi_cmdmode = 1;
2505 input_backward(1); 2505 input_backward(1);
2506 } 2506 }
2507 /* Handle a few ESC-<key> combinations the same way
2508 * standard readline bindings (IOW: bash) do.
2509 * Often, Alt-<key> generates ESC-<key>.
2510 */
2511 ic = lineedit_read_key(read_key_buffer, timeout);
2512 switch (ic) {
2513 //case KEYCODE_LEFT: - bash doesn't do this
2514 case 'b':
2515 ctrl_left();
2516 break;
2517 //case KEYCODE_RIGHT: - bash doesn't do this
2518 case 'f':
2519 ctrl_right();
2520 break;
2521 //case KEYCODE_DELETE: - bash doesn't do this
2522 case 'd': /* Alt-D */
2523 {
2524 /* Delete word forward */
2525 int nc, sc = cursor;
2526 ctrl_right();
2527 nc = cursor;
2528 input_backward(cursor - sc);
2529 while (--nc >= cursor)
2530 input_delete(1);
2531 break;
2532 }
2533 case '\b': /* Alt-Backspace(?) */
2534 case '\x7f': /* Alt-Backspace(?) */
2535 //case 'w': - bash doesn't do this
2536 {
2537 /* Delete word backward */
2538 int sc = cursor;
2539 ctrl_left();
2540 while (sc-- > cursor)
2541 input_delete(1);
2542 break;
2543 }
2544 }
2507 break; 2545 break;
2508#endif /* FEATURE_COMMAND_EDITING_VI */ 2546#endif /* FEATURE_COMMAND_EDITING_VI */
2509 2547
@@ -2532,9 +2570,11 @@ int FAST_FUNC read_line_input(line_input_t *st, const char *prompt, char *comman
2532 input_backward(1); 2570 input_backward(1);
2533 break; 2571 break;
2534 case KEYCODE_CTRL_LEFT: 2572 case KEYCODE_CTRL_LEFT:
2573 case KEYCODE_ALT_LEFT: /* bash doesn't do it */
2535 ctrl_left(); 2574 ctrl_left();
2536 break; 2575 break;
2537 case KEYCODE_CTRL_RIGHT: 2576 case KEYCODE_CTRL_RIGHT:
2577 case KEYCODE_ALT_RIGHT: /* bash doesn't do it */
2538 ctrl_right(); 2578 ctrl_right();
2539 break; 2579 break;
2540 case KEYCODE_HOME: 2580 case KEYCODE_HOME:
diff --git a/libbb/read_key.c b/libbb/read_key.c
index 5dcd19c3f..8d72d2a63 100644
--- a/libbb/read_key.c
+++ b/libbb/read_key.c
@@ -40,13 +40,14 @@ int64_t FAST_FUNC read_key(int fd, char *buffer, int timeout)
40 '[','C' |0x80,KEYCODE_RIGHT , 40 '[','C' |0x80,KEYCODE_RIGHT ,
41 '[','D' |0x80,KEYCODE_LEFT , 41 '[','D' |0x80,KEYCODE_LEFT ,
42 /* ESC [ 1 ; 2 x, where x = A/B/C/D: Shift-<arrow> */ 42 /* ESC [ 1 ; 2 x, where x = A/B/C/D: Shift-<arrow> */
43 /* ESC [ 1 ; 3 x, where x = A/B/C/D: Alt-<arrow> */ 43 /* ESC [ 1 ; 3 x, where x = A/B/C/D: Alt-<arrow> - implemented below */
44 /* ESC [ 1 ; 4 x, where x = A/B/C/D: Alt-Shift-<arrow> */ 44 /* ESC [ 1 ; 4 x, where x = A/B/C/D: Alt-Shift-<arrow> */
45 /* ESC [ 1 ; 5 x, where x = A/B/C/D: Ctrl-<arrow> - implemented below */ 45 /* ESC [ 1 ; 5 x, where x = A/B/C/D: Ctrl-<arrow> - implemented below */
46 /* ESC [ 1 ; 6 x, where x = A/B/C/D: Ctrl-Shift-<arrow> */ 46 /* ESC [ 1 ; 6 x, where x = A/B/C/D: Ctrl-Shift-<arrow> */
47 '[','H' |0x80,KEYCODE_HOME , /* xterm */ 47 '[','H' |0x80,KEYCODE_HOME , /* xterm */
48 /* [ESC] ESC [ [2] H - [Alt-][Shift-]Home */
49 '[','F' |0x80,KEYCODE_END , /* xterm */ 48 '[','F' |0x80,KEYCODE_END , /* xterm */
49 /* [ESC] ESC [ [2] H - [Alt-][Shift-]Home (End similarly?) */
50 /* '[','Z' |0x80,KEYCODE_SHIFT_TAB, */
50 '[','1','~' |0x80,KEYCODE_HOME , /* vt100? linux vt? or what? */ 51 '[','1','~' |0x80,KEYCODE_HOME , /* vt100? linux vt? or what? */
51 '[','2','~' |0x80,KEYCODE_INSERT , 52 '[','2','~' |0x80,KEYCODE_INSERT ,
52 /* ESC [ 2 ; 3 ~ - Alt-Insert */ 53 /* ESC [ 2 ; 3 ~ - Alt-Insert */
@@ -86,8 +87,12 @@ int64_t FAST_FUNC read_key(int fd, char *buffer, int timeout)
86 /* '[','1',';','5','B' |0x80,KEYCODE_CTRL_DOWN , - unused */ 87 /* '[','1',';','5','B' |0x80,KEYCODE_CTRL_DOWN , - unused */
87 '[','1',';','5','C' |0x80,KEYCODE_CTRL_RIGHT, 88 '[','1',';','5','C' |0x80,KEYCODE_CTRL_RIGHT,
88 '[','1',';','5','D' |0x80,KEYCODE_CTRL_LEFT , 89 '[','1',';','5','D' |0x80,KEYCODE_CTRL_LEFT ,
90 /* '[','1',';','3','A' |0x80,KEYCODE_ALT_UP , - unused */
91 /* '[','1',';','3','B' |0x80,KEYCODE_ALT_DOWN , - unused */
92 '[','1',';','3','C' |0x80,KEYCODE_ALT_RIGHT,
93 '[','1',';','3','D' |0x80,KEYCODE_ALT_LEFT ,
94 /* '[','3',';','3','~' |0x80,KEYCODE_ALT_DELETE, - unused */
89 0 95 0
90 /* ESC [ Z - Shift-Tab */
91 }; 96 };
92 97
93 pfd.fd = fd; 98 pfd.fd = fd;