]> git.lizzy.rs Git - linenoise.git/commitdiff
Allow ^V to enter arbitrary control characters
authorSteve Bennett <steveb@workware.net.au>
Thu, 30 Sep 2010 22:25:56 +0000 (08:25 +1000)
committerSteve Bennett <steveb@workware.net.au>
Fri, 8 Apr 2011 01:37:19 +0000 (11:37 +1000)
Signed-off-by: Steve Bennett <steveb@workware.net.au>
linenoise.c

index c496841e46405eb6c31596a6c29846ad745d62de..8c448e6ca1889226bf3d86d0b6dd637b888018e4 100644 (file)
@@ -459,6 +459,29 @@ process_char:
                 refreshLine(fd,prompt,buf,len,pos,cols);
             }
             break;
+        case 22:    /* ctrl-v */
+            if (len < buflen) {
+                /* Insert the ^V first */
+                memmove(buf+pos+1,buf+pos,len-pos);
+                buf[pos] = c;
+                len++;
+                pos++;
+                buf[len] = '\0';
+                refreshLine(fd,prompt,buf,len,pos,cols);
+                /* Now wait for the next char. Can insert anything except \0 */
+                nread = read(fd,&c,1);
+                if (nread == 1 && c) {
+                    /* Replace the ^V with the actual char */
+                    buf[pos - 1] = c;
+                }
+                else {
+                    /* Remove the ^V */
+                    pos--;
+                    memmove(buf+pos,buf+pos+1,len-pos);
+                }
+                refreshLine(fd,prompt,buf,len,pos,cols);
+            }
+            break;
         case 2:     /* ctrl-b */
             goto left_arrow;
         case 6:     /* ctrl-f */