X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/ff4058183bc6dfdc130a7172105bb0a02f76b4ec..4eddb121563a9e50cf2ee66e2a0ff7c186dd696a:/deps/linenoise/linenoise.c diff --git a/deps/linenoise/linenoise.c b/deps/linenoise/linenoise.c index 0ebef2e9..18a15cc4 100644 --- a/deps/linenoise/linenoise.c +++ b/deps/linenoise/linenoise.c @@ -9,6 +9,8 @@ * the 2010 UNIX computers around. * * Copyright (c) 2010, Salvatore Sanfilippo + * Copyright (c) 2010, Pieter Noordhuis + * * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -66,6 +68,17 @@ * CUF (CUrsor Forward) * Sequence: ESC [ n C * Effect: moves cursor forward of n chars + * + * The following are used to clear the screen: ESC [ H ESC [ 2 J + * This is actually composed of two sequences: + * + * cursorhome + * Sequence: ESC [ H + * Effect: moves the cursor to upper left corner + * + * ED2 (Clear entire screen) + * Sequence: ESC [ 2 J + * Effect: clear the whole screen * */ @@ -243,10 +256,14 @@ static int completeLine(int fd, const char *prompt, char *buf, size_t buflen, si if (i == lc.len) beep(); break; case 27: /* escape */ + /* Re-show original buffer */ + if (i < lc.len) { + refreshLine(fd,prompt,buf,*len,*pos,cols); + } stop = 1; break; default: - /* update buffer and return */ + /* Update buffer and return */ if (i < lc.len) { nwritten = snprintf(buf,buflen,"%s",lc.cvec[i]); *len = *pos = nwritten; @@ -261,6 +278,12 @@ static int completeLine(int fd, const char *prompt, char *buf, size_t buflen, si return c; /* Return last read character */ } +void linenoiseClearScreen(void) { + if (write(STDIN_FILENO,"\x1b[H\x1b[2J",7) <= 0) { + /* nothing to do, just to avoid warning. */ + } +} + static int linenoisePrompt(int fd, char *buf, size_t buflen, const char *prompt) { size_t plen = strlen(prompt); size_t pos = 0; @@ -297,10 +320,9 @@ static int linenoisePrompt(int fd, char *buf, size_t buflen, const char *prompt) switch(c) { case 13: /* enter */ - case 4: /* ctrl-d */ history_len--; free(history[history_len]); - return (len == 0 && c == 4) ? -1 : (int)len; + return (int)len; case 3: /* ctrl-c */ errno = EAGAIN; return -1; @@ -314,6 +336,18 @@ static int linenoisePrompt(int fd, char *buf, size_t buflen, const char *prompt) refreshLine(fd,prompt,buf,len,pos,cols); } break; + case 4: /* ctrl-d, remove char at right of cursor */ + if (len > 1 && pos < (len-1)) { + memmove(buf+pos,buf+pos+1,len-pos); + len--; + buf[len] = '\0'; + refreshLine(fd,prompt,buf,len,pos,cols); + } else if (len == 0) { + history_len--; + free(history[history_len]); + return -1; + } + break; case 20: /* ctrl-t */ if (pos > 0 && pos < len) { int aux = buf[pos-1]; @@ -428,6 +462,9 @@ up_down_arrow: pos = len; refreshLine(fd,prompt,buf,len,pos,cols); break; + case 12: /* ctrl+l, clear screen */ + linenoiseClearScreen(); + refreshLine(fd,prompt,buf,len,pos,cols); } } return len;