[PATCH 04/15] Added keyboard shortcuts Ctrl-B, F, G, P, N, T and U and move command executed from the history to the fore in the history, a la linux bash
Ric Claus
claus at slac.stanford.edu
Tue Nov 27 03:26:42 UTC 2012
---
cpukit/libmisc/shell/shell.c | 220 ++++++++++++++++++++++++++++-------------
1 files changed, 150 insertions(+), 70 deletions(-)
diff --git a/cpukit/libmisc/shell/shell.c b/cpukit/libmisc/shell/shell.c
index aea6b98..90bb512 100644
--- a/cpukit/libmisc/shell/shell.c
+++ b/cpukit/libmisc/shell/shell.c
@@ -173,70 +173,24 @@ static int rtems_shell_line_editor(
break;
case RTEMS_SHELL_KEYS_LARROW:
- if (col > 0)
- {
- col--;
- if (output)
- fputc('\b', out);
- }
+ c = 2;
+ extended_key = 0;
break;
- case RTEMS_SHELL_KEYS_RARROW:
- if ((col < size) && (line[col] != '\0'))
- {
- if (output)
- fprintf(out, "%c", line[col]);
- col++;
- }
- break;
+ case RTEMS_SHELL_KEYS_RARROW:
+ c = 6;
+ extended_key = 0;
+ break;
case RTEMS_SHELL_KEYS_UARROW:
- if ((cmd >= (count - 1)) || (strlen(cmds[cmd + 1]) == 0)) {
- if (output)
- fputc('\x7', out);
- break;
- }
-
- up = 1;
+ c = 16;
+ extended_key = 0;
+ break;
- /* drop through */
case RTEMS_SHELL_KEYS_DARROW:
-
- {
- int last_cmd = cmd;
- int clen = strlen (line);
-
- if (prompt)
- clen += strlen(prompt);
-
- if (up) {
- cmd++;
- } else {
- if (cmd < 0) {
- if (output)
- fprintf(out, "\x7");
- break;
- }
- else
- cmd--;
- }
-
- if ((last_cmd < 0) || (strcmp(cmds[last_cmd], line) != 0))
- memcpy (new_line, line, size);
-
- if (cmd < 0)
- memcpy (line, new_line, size);
- else
- memcpy (line, cmds[cmd], size);
-
- col = strlen (line);
-
- if (output) {
- fprintf(out,"\r%*c", clen, ' ');
- fprintf(out,"\r%s%s", prompt, line);
- }
- }
- break;
+ c = 14;
+ extended_key = 0;
+ break;
case RTEMS_SHELL_KEYS_DEL:
if (line[col] != '\0')
@@ -258,11 +212,11 @@ static int rtems_shell_line_editor(
break;
}
}
- else
+ if (!extended_key)
{
switch (c)
{
- case 1:/*Control-a*/
+ case 1: /*Control-a*/
if (output) {
if (prompt)
fprintf(out,"\r%s", prompt);
@@ -270,13 +224,59 @@ static int rtems_shell_line_editor(
col = 0;
break;
- case 5:/*Control-e*/
+ case 2: /* Control-B */
+ if (col > 0)
+ {
+ col--;
+ if (output)
+ fputc('\b', out);
+ }
+ break;
+
+ case 4: /* Control-D */
+ if (strlen(line)) {
+ if (col < strlen(line)) {
+ strcpy (line + col, line + col + 1);
+ if (output) {
+ int bs;
+ fprintf(out,"%s \b", line + col);
+ for (bs = 0; bs < ((int) strlen (line) - col); bs++)
+ fputc('\b', out);
+ }
+ }
+ break;
+ }
+ /* Fall through */
+
+ case EOF:
+ if (output)
+ fputc('\n', out);
+ return -2;
+
+ case 5: /*Control-e*/
if (output)
fprintf(out, "%s", line + col);
col = (int) strlen (line);
break;
- case 11:/*Control-k*/
+ case 6: /* Control-F */
+ if ((col < size) && (line[col] != '\0')) {
+ if (output)
+ fputc(line[col], out);
+ col++;
+ }
+ break;
+
+ case 7: /* Control-G */
+ if (output) {
+ fprintf(out,"\r%s%*c", prompt, strlen (line), ' ');
+ fprintf(out,"\r%s\x7", prompt);
+ }
+ memset (line, '\0', strlen(line));
+ col = 0;
+ break;
+
+ case 11: /*Control-k*/
if (line[col]) {
if (output) {
int end = strlen(line);
@@ -289,14 +289,6 @@ static int rtems_shell_line_editor(
}
break;
- case 0x04:/*Control-d*/
- if (strlen(line))
- break;
- case EOF:
- if (output)
- fputc('\n', out);
- return -2;
-
case '\f':
if (output) {
int end;
@@ -345,11 +337,99 @@ static int rtems_shell_line_editor(
memmove(cmds[1], cmds[0], (count - 1) * size);
memmove (cmds[0], line, size);
cmd = 0;
+ } else {
+ if ((cmd > 1) && (strcmp(line, cmds[cmd]) == 0)) {
+ memmove(cmds[1], cmds[0], cmd * size);
+ memmove (cmds[0], line, size);
+ cmd = 0;
+ }
}
}
}
return cmd;
+ case 16: /* Control-P */
+ if ((cmd >= (count - 1)) || (strlen(cmds[cmd + 1]) == 0)) {
+ if (output)
+ fputc('\x7', out);
+ break;
+ }
+
+ up = 1;
+ /* drop through */
+
+ case 14: /* Control-N */
+ {
+ int last_cmd = cmd;
+ int clen = strlen (line);
+
+ if (prompt)
+ clen += strlen(prompt);
+
+ if (up) {
+ cmd++;
+ } else {
+ if (cmd < 0) {
+ if (output)
+ fprintf(out, "\x7");
+ break;
+ }
+ else
+ cmd--;
+ }
+
+ if ((last_cmd < 0) || (strcmp(cmds[last_cmd], line) != 0))
+ memcpy (new_line, line, size);
+
+ if (cmd < 0)
+ memcpy (line, new_line, size);
+ else
+ memcpy (line, cmds[cmd], size);
+
+ col = strlen (line);
+
+ if (output) {
+ fprintf(out,"\r%s%*c", prompt, clen, ' ');
+ fprintf(out,"\r%s%s", prompt, line);
+ }
+ }
+ break;
+
+ case 20: /* Control-T */
+ if (col > 0)
+ {
+ char tmp;
+ if (col == strlen(line)) {
+ col--;
+ if (output)
+ fprintf(out,"\b");
+ }
+ tmp = line[col];
+ line[col] = line[col - 1];
+ line[col - 1] = tmp;
+ if (output)
+ fprintf(out,"\b%c%c", line[col - 1], line[col]);
+ col++;
+ } else {
+ if (output)
+ fputc('\x7', out);
+ }
+ break;
+
+ case 21: /* Control-U */
+ if (col > 0)
+ {
+ int clen = strlen (line);
+
+ strcpy (line, line + col);
+ if (output) {
+ fprintf(out,"\r%s%*c", prompt, clen, ' ');
+ fprintf(out,"\r%s%s", prompt, line);
+ }
+ col = 0;
+ }
+ break;
+
default:
if ((col < (size - 1)) && (c >= ' ') && (c <= '~')) {
int end = strlen (line);
--
1.7.1
More information about the devel
mailing list