xiaoxiang781216 commented on code in PR #3657:
URL: https://github.com/apache/nuttx-apps/pull/3657#discussion_r3652543670
##########
system/readline/readline_common.c:
##########
@@ -670,55 +1350,175 @@ ssize_t readline_common(FAR struct rl_common_s *vtbl,
FAR char *buf,
else if (ch == '\n')
{
-#ifdef CONFIG_READLINE_CMD_HISTORY
- /* Save history of command, only if there was something
- * typed besides return character.
- */
+ return submit_line(buf, nch);
+ }
- if (nch >= 1)
- {
- /* If this command is the one at the top of the circular
- * buffer, don't save it again.
- */
+ /* Emacs-style control keys */
- if (strncmp(buf, g_cmdhist.buf[g_cmdhist.head], nch + 1) != 0)
+#ifdef CONFIG_READLINE_EDIT_EMACS
+ else if (ch == CTRL_A) /* Ctrl+A = Home */
+ {
+ cursor = 0;
+ redraw_line(vtbl, buf, nch, cursor);
+ }
+ else if (ch == CTRL_B) /* Ctrl+B = Left */
+ {
+ if (cursor > 0)
+ {
+ cursor--;
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
+ }
+ }
+ else if (ch == CTRL_D) /* Ctrl+D = Delete at cursor */
+ {
+ if (cursor < nch)
+ {
+ int k;
+ for (k = cursor + 1; k < nch; k++)
+ buf[k - 1] = buf[k];
+ nch--;
+ RL_WRITE(vtbl, g_erasetoeol, sizeof(g_erasetoeol));
+ if (cursor < nch)
{
- g_cmdhist.head = (g_cmdhist.head + 1) % RL_CMDHIST_LEN;
-
- for (i = 0; (i < nch) && i < (RL_CMDHIST_LINELEN - 1); i++)
- {
- g_cmdhist.buf[g_cmdhist.head][i] = buf[i];
- }
+ RL_WRITE(vtbl, buf + cursor, nch - cursor);
+ for (k = nch; k > cursor; k--)
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
+ }
+ }
+ }
+ else if (ch == CTRL_E) /* Ctrl+E = End */
+ {
+ while (cursor < nch)
+ {
+ cursor++;
+ RL_WRITE(vtbl, g_curright, sizeof(g_curright));
+ }
+ }
+ else if (ch == CTRL_F) /* Ctrl+F = Right */
+ {
+ if (cursor < nch)
+ {
+ cursor++;
+ RL_WRITE(vtbl, g_curright, sizeof(g_curright));
+ }
+ }
+ else if (ch == CTRL_K) /* Ctrl+K = Kill to EOL */
+ {
+ nch = cursor;
+ buf[nch] = '\0';
+ RL_WRITE(vtbl, g_erasetoeol, sizeof(g_erasetoeol));
+ }
+ else if (ch == CTRL_U) /* Ctrl+U = Kill to BOL */
+ {
+ int j;
+ for (j = cursor; j < nch; j++)
+ buf[j - cursor] = buf[j];
+ nch -= cursor;
+ cursor = 0;
+ buf[nch] = '\0';
+ redraw_line(vtbl, buf, nch, cursor);
+ }
+ else if (ch == CTRL_W) /* Ctrl+W = Kill word backward (FIXME)
*/
+ {
+ int start, k;
+ start = cursor;
+ while (start > 0 && buf[start - 1] == ' ')
+ start--;
Review Comment:
add {}
##########
system/readline/readline_common.c:
##########
@@ -670,55 +1350,175 @@ ssize_t readline_common(FAR struct rl_common_s *vtbl,
FAR char *buf,
else if (ch == '\n')
{
-#ifdef CONFIG_READLINE_CMD_HISTORY
- /* Save history of command, only if there was something
- * typed besides return character.
- */
+ return submit_line(buf, nch);
+ }
- if (nch >= 1)
- {
- /* If this command is the one at the top of the circular
- * buffer, don't save it again.
- */
+ /* Emacs-style control keys */
- if (strncmp(buf, g_cmdhist.buf[g_cmdhist.head], nch + 1) != 0)
+#ifdef CONFIG_READLINE_EDIT_EMACS
+ else if (ch == CTRL_A) /* Ctrl+A = Home */
+ {
+ cursor = 0;
+ redraw_line(vtbl, buf, nch, cursor);
+ }
+ else if (ch == CTRL_B) /* Ctrl+B = Left */
+ {
+ if (cursor > 0)
+ {
+ cursor--;
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
+ }
+ }
+ else if (ch == CTRL_D) /* Ctrl+D = Delete at cursor */
+ {
+ if (cursor < nch)
+ {
+ int k;
+ for (k = cursor + 1; k < nch; k++)
+ buf[k - 1] = buf[k];
+ nch--;
+ RL_WRITE(vtbl, g_erasetoeol, sizeof(g_erasetoeol));
+ if (cursor < nch)
{
- g_cmdhist.head = (g_cmdhist.head + 1) % RL_CMDHIST_LEN;
-
- for (i = 0; (i < nch) && i < (RL_CMDHIST_LINELEN - 1); i++)
- {
- g_cmdhist.buf[g_cmdhist.head][i] = buf[i];
- }
+ RL_WRITE(vtbl, buf + cursor, nch - cursor);
+ for (k = nch; k > cursor; k--)
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
+ }
+ }
+ }
+ else if (ch == CTRL_E) /* Ctrl+E = End */
+ {
+ while (cursor < nch)
+ {
+ cursor++;
+ RL_WRITE(vtbl, g_curright, sizeof(g_curright));
+ }
+ }
+ else if (ch == CTRL_F) /* Ctrl+F = Right */
+ {
+ if (cursor < nch)
+ {
+ cursor++;
+ RL_WRITE(vtbl, g_curright, sizeof(g_curright));
+ }
+ }
+ else if (ch == CTRL_K) /* Ctrl+K = Kill to EOL */
+ {
+ nch = cursor;
+ buf[nch] = '\0';
+ RL_WRITE(vtbl, g_erasetoeol, sizeof(g_erasetoeol));
+ }
+ else if (ch == CTRL_U) /* Ctrl+U = Kill to BOL */
+ {
+ int j;
+ for (j = cursor; j < nch; j++)
+ buf[j - cursor] = buf[j];
+ nch -= cursor;
+ cursor = 0;
+ buf[nch] = '\0';
+ redraw_line(vtbl, buf, nch, cursor);
+ }
+ else if (ch == CTRL_W) /* Ctrl+W = Kill word backward (FIXME)
*/
+ {
+ int start, k;
+ start = cursor;
+ while (start > 0 && buf[start - 1] == ' ')
+ start--;
+ while (start > 0 && buf[start - 1] != ' ')
+ start--;
+ for (k = start; k < nch; k++)
+ buf[k - (cursor - start)] = buf[k];
+ nch -= (cursor - start);
+ cursor = start;
+ buf[nch] = '\0';
+ RL_WRITE(vtbl, g_erasetoeol, sizeof(g_erasetoeol));
+ if (cursor < nch)
+ {
+ RL_WRITE(vtbl, buf + cursor, nch - cursor);
+ for (k = nch; k > cursor; k--)
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
Review Comment:
add {}
##########
system/readline/readline_common.c:
##########
@@ -534,20 +860,255 @@ ssize_t readline_common(FAR struct rl_common_s *vtbl,
FAR char *buf,
return EOF;
}
+#ifdef CONFIG_READLINE_EDIT_EMACS_REVERSE_SEARCH
+ /* Are we in reverse incremental search mode (Ctrl+R)? If so,
+ * every subsequent keystroke is interpreted as part of the
+ * search until it is accepted, submitted, or cancelled.
+ */
+
+ else if (insearch)
+ {
+ if (ch == CTRL_R)
+ {
+ /* Repeat: search further back for another match of the
+ * same search string.
+ */
+
+ bool found = isearch_find(search, searchlen, searchoffset,
+ &searchoffset, buf, buflen, &nch);
+#ifdef CONFIG_READLINE_ECHO
+ isearch_redraw(vtbl, search, searchlen, buf, nch, !found);
+#endif
+ }
+ else if (ch == ASCII_BS || ch == ASCII_DEL)
+ {
+ if (searchlen > 0)
+ {
+ searchlen--;
+ searchoffset = 1;
+
+ if (searchlen > 0)
+ {
+ isearch_find(search, searchlen, searchoffset,
+ &searchoffset, buf, buflen, &nch);
+ }
+ else
+ {
+ nch = 0;
+ }
+ }
+
+#ifdef CONFIG_READLINE_ECHO
+ isearch_redraw(vtbl, search, searchlen, buf, nch,
+ searchlen > 0 && nch == 0);
+#endif
+ }
+ else if (ch == CTRL_G || ch == ASCII_ETX) /* ^G or ^C: cancel */
+ {
+ /* Cancel: restore the line exactly as it was before
+ * Ctrl+R was pressed.
+ */
+
+ insearch = false;
+ nch = savednch;
+ cursor = savedcursor;
+
+ for (i = 0; i < nch; i++)
+ {
+ buf[i] = savedbuf[i];
+ }
+
+ buf[nch] = '\0';
+
+#ifdef CONFIG_READLINE_ECHO
+ redraw_line(vtbl, buf, nch, cursor);
+#endif
+ }
+ else if (ch == '\n')
+ {
+ /* Accept the current match and submit it immediately,
+ * exactly as bash does.
+ */
+
+ insearch = false;
+ return submit_line(buf, nch);
+ }
+ else if (ch == ASCII_ESC)
+ {
+ /* Accept the current match into the line, then let the
+ * escape sequence that follows (if any) be processed
+ * normally against it on the next iteration(s).
+ */
+
+ insearch = false;
+ cursor = nch;
+ escape = 1;
+ }
+ else if (!iscntrl(ch & 0xff) && searchlen < RL_CMDHIST_LINELEN - 1)
+ {
+ search[searchlen++] = (char)ch;
+ searchoffset = 1;
+
+ bool found = isearch_find(search, searchlen, searchoffset,
+ &searchoffset, buf, buflen, &nch);
+#ifdef CONFIG_READLINE_ECHO
+ isearch_redraw(vtbl, search, searchlen, buf, nch, !found);
+#endif
+ }
+ else
+ {
+ /* Anything else (an unhandled control character) just
+ * accepts the current match and returns to normal
+ * editing.
+ */
+
+ insearch = false;
+ cursor = nch;
+
+#ifdef CONFIG_READLINE_ECHO
+ redraw_line(vtbl, buf, nch, cursor);
+#endif
+ }
+
+ continue;
+ }
+#endif
+
/* Are we processing a VT100 escape sequence */
else if (escape)
{
+#ifdef CONFIG_READLINE_EDIT
+ /* Delete key: ESC [ 3 ~ — waiting for '~' */
+
+ if (escape == 3)
+ {
+ escape = 0;
+ if (ch == '~' && cursor < nch)
+ {
+ int k;
+ for (k = cursor + 1; k < nch; k++)
+ buf[k - 1] = buf[k];
+ nch--;
+# ifdef CONFIG_READLINE_ECHO
+ /* Back up 1 — terminal echo of '~' advanced cursor */
+
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
+ RL_WRITE(vtbl, g_erasetoeol, sizeof(g_erasetoeol));
+ if (cursor < nch)
+ {
+ RL_WRITE(vtbl, buf + cursor, nch - cursor);
+ for (k = nch; k > cursor; k--)
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
+ }
+# endif
+ }
+ continue;
+ }
+
+ if (escape == 4 || escape == 5)
+ {
+ if (ch == '~')
+ {
+ /* Home (1~) or End (4~) */
+
+ cursor = (escape == 4) ? 0 : nch;
+ redraw_line(vtbl, buf, nch, cursor);
+ }
+
+ if (ch == ';')
+ {
+ escape = 8;
+ continue;
+ }
+
+ escape = 0;
+ continue;
+ }
+#endif
+
+#ifdef CONFIG_READLINE_EDIT
+ if (escape == 8) /* CSI ; — waiting for modifier digit */
+ {
+ if (ch == '5')
+ {
+ escape = 9; /* Ready for final char */
+ continue;
+ }
+
+ if (ch == ';')
+ {
+ escape = 8;
+ continue;
+ }
+
+ escape = 0;
+ continue;
+ }
+
+ if (escape == 9) /* CSI ;5 — waiting for D or C */
+ {
+ escape = 0;
+
+ if (ch == 'D') /* Ctrl+Left */
+ {
+ while (cursor > 0 && buf[cursor - 1] == ' ')
+ cursor--;
+ while (cursor > 0 && buf[cursor - 1] != ' ')
+ cursor--;
+
+ redraw_line(vtbl, buf, nch, cursor);
+ }
+ else if (ch == 'C') /* Ctrl+Right */
+ {
+ while (cursor < nch && buf[cursor] != ' ')
+ cursor++;
Review Comment:
add {}
##########
system/readline/readline_common.c:
##########
@@ -534,20 +860,255 @@ ssize_t readline_common(FAR struct rl_common_s *vtbl,
FAR char *buf,
return EOF;
}
+#ifdef CONFIG_READLINE_EDIT_EMACS_REVERSE_SEARCH
+ /* Are we in reverse incremental search mode (Ctrl+R)? If so,
+ * every subsequent keystroke is interpreted as part of the
+ * search until it is accepted, submitted, or cancelled.
+ */
+
+ else if (insearch)
+ {
+ if (ch == CTRL_R)
+ {
+ /* Repeat: search further back for another match of the
+ * same search string.
+ */
+
+ bool found = isearch_find(search, searchlen, searchoffset,
+ &searchoffset, buf, buflen, &nch);
+#ifdef CONFIG_READLINE_ECHO
+ isearch_redraw(vtbl, search, searchlen, buf, nch, !found);
+#endif
+ }
+ else if (ch == ASCII_BS || ch == ASCII_DEL)
+ {
+ if (searchlen > 0)
+ {
+ searchlen--;
+ searchoffset = 1;
+
+ if (searchlen > 0)
+ {
+ isearch_find(search, searchlen, searchoffset,
+ &searchoffset, buf, buflen, &nch);
+ }
+ else
+ {
+ nch = 0;
+ }
+ }
+
+#ifdef CONFIG_READLINE_ECHO
+ isearch_redraw(vtbl, search, searchlen, buf, nch,
+ searchlen > 0 && nch == 0);
+#endif
+ }
+ else if (ch == CTRL_G || ch == ASCII_ETX) /* ^G or ^C: cancel */
+ {
+ /* Cancel: restore the line exactly as it was before
+ * Ctrl+R was pressed.
+ */
+
+ insearch = false;
+ nch = savednch;
+ cursor = savedcursor;
+
+ for (i = 0; i < nch; i++)
+ {
+ buf[i] = savedbuf[i];
+ }
+
+ buf[nch] = '\0';
+
+#ifdef CONFIG_READLINE_ECHO
+ redraw_line(vtbl, buf, nch, cursor);
+#endif
+ }
+ else if (ch == '\n')
+ {
+ /* Accept the current match and submit it immediately,
+ * exactly as bash does.
+ */
+
+ insearch = false;
+ return submit_line(buf, nch);
+ }
+ else if (ch == ASCII_ESC)
+ {
+ /* Accept the current match into the line, then let the
+ * escape sequence that follows (if any) be processed
+ * normally against it on the next iteration(s).
+ */
+
+ insearch = false;
+ cursor = nch;
+ escape = 1;
+ }
+ else if (!iscntrl(ch & 0xff) && searchlen < RL_CMDHIST_LINELEN - 1)
+ {
+ search[searchlen++] = (char)ch;
+ searchoffset = 1;
+
+ bool found = isearch_find(search, searchlen, searchoffset,
+ &searchoffset, buf, buflen, &nch);
+#ifdef CONFIG_READLINE_ECHO
+ isearch_redraw(vtbl, search, searchlen, buf, nch, !found);
+#endif
+ }
+ else
+ {
+ /* Anything else (an unhandled control character) just
+ * accepts the current match and returns to normal
+ * editing.
+ */
+
+ insearch = false;
+ cursor = nch;
+
+#ifdef CONFIG_READLINE_ECHO
+ redraw_line(vtbl, buf, nch, cursor);
+#endif
+ }
+
+ continue;
+ }
+#endif
+
/* Are we processing a VT100 escape sequence */
else if (escape)
{
+#ifdef CONFIG_READLINE_EDIT
+ /* Delete key: ESC [ 3 ~ — waiting for '~' */
+
+ if (escape == 3)
+ {
+ escape = 0;
+ if (ch == '~' && cursor < nch)
+ {
+ int k;
+ for (k = cursor + 1; k < nch; k++)
+ buf[k - 1] = buf[k];
+ nch--;
+# ifdef CONFIG_READLINE_ECHO
+ /* Back up 1 — terminal echo of '~' advanced cursor */
+
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
+ RL_WRITE(vtbl, g_erasetoeol, sizeof(g_erasetoeol));
+ if (cursor < nch)
+ {
+ RL_WRITE(vtbl, buf + cursor, nch - cursor);
+ for (k = nch; k > cursor; k--)
+ RL_WRITE(vtbl, g_curleft, sizeof(g_curleft));
+ }
+# endif
+ }
+ continue;
+ }
+
+ if (escape == 4 || escape == 5)
+ {
+ if (ch == '~')
+ {
+ /* Home (1~) or End (4~) */
+
+ cursor = (escape == 4) ? 0 : nch;
+ redraw_line(vtbl, buf, nch, cursor);
+ }
+
+ if (ch == ';')
+ {
+ escape = 8;
+ continue;
+ }
+
+ escape = 0;
+ continue;
+ }
+#endif
+
+#ifdef CONFIG_READLINE_EDIT
+ if (escape == 8) /* CSI ; — waiting for modifier digit */
+ {
+ if (ch == '5')
+ {
+ escape = 9; /* Ready for final char */
+ continue;
+ }
+
+ if (ch == ';')
+ {
+ escape = 8;
+ continue;
+ }
+
+ escape = 0;
+ continue;
+ }
+
+ if (escape == 9) /* CSI ;5 — waiting for D or C */
+ {
+ escape = 0;
+
+ if (ch == 'D') /* Ctrl+Left */
+ {
+ while (cursor > 0 && buf[cursor - 1] == ' ')
+ cursor--;
+ while (cursor > 0 && buf[cursor - 1] != ' ')
+ cursor--;
Review Comment:
add {}
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]