summaryrefslogtreecommitdiff
path: root/ddb
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2022-12-11 23:07:16 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-12-11 23:27:26 +0100
commit6a643459ea45594d91984d0ad98e8d2d5fa7ca5a (patch)
tree829bf5d18415558d60949760b4133eed2ae7acda /ddb
parent9de9e186233d0b983231bf2a474c2cb1025ea283 (diff)
db: Add support for CSI-based arrows
Diffstat (limited to 'ddb')
-rw-r--r--ddb/db_input.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/ddb/db_input.c b/ddb/db_input.c
index 6b6db764..b70299d3 100644
--- a/ddb/db_input.c
+++ b/ddb/db_input.c
@@ -139,8 +139,14 @@ db_delete_line(void)
boolean_t
db_inputchar(int c)
{
+ static int escaped, csi;
+ int was_escaped = escaped, was_csi = csi;
+ escaped = 0;
+ csi = 0;
+
switch (c) {
case CTRL('b'):
+ left:
/* back up one character */
if (db_lc > db_lbuf_start) {
cnputc(BACKUP);
@@ -148,6 +154,7 @@ db_inputchar(int c)
}
break;
case CTRL('f'):
+ right:
/* forward one character */
if (db_lc < db_le) {
cnputc(*db_lc);
@@ -202,6 +209,7 @@ db_inputchar(int c)
break;
#if DB_HISTORY_SIZE != 0
case CTRL('p'):
+ up:
DEC_DB_CURR();
while (db_history_curr != db_history_last) {
DEC_DB_CURR();
@@ -227,6 +235,7 @@ db_inputchar(int c)
db_putstring(db_lbuf_start, db_le - db_lbuf_start);
break;
case CTRL('n'):
+ down:
while (db_history_curr != db_history_last) {
if (*db_history_curr == '\0')
break;
@@ -306,7 +315,38 @@ db_inputchar(int c)
#endif /* DB_HISTORY_SIZE */
*db_le++ = c;
return (TRUE);
+ case '\033':
+ escaped = 1;
+ break;
+ case '[':
+ if (was_escaped)
+ csi = 1;
+ else
+ goto plain;
+ break;
+ case 'A':
+ if (was_csi)
+ goto up;
+ else
+ goto plain;
+ case 'B':
+ if (was_csi)
+ goto down;
+ else
+ goto plain;
+ case 'C':
+ if (was_csi)
+ goto right;
+ else
+ goto plain;
+ case 'D':
+ if (was_csi)
+ goto left;
+ else
+ goto plain;
+
default:
+ plain:
if (db_le == db_lbuf_end) {
cnputc('\007');
}