]> git.lizzy.rs Git - linenoise.git/commitdiff
Fix arrow keys on some terminals
authorSteve Bennett <steveb@workware.net.au>
Thu, 30 Sep 2010 20:01:27 +0000 (06:01 +1000)
committerSteve Bennett <steveb@workware.net.au>
Fri, 8 Apr 2011 01:37:19 +0000 (11:37 +1000)
Some terminals use ^[OA instead of ^[[A for up arrow, etc.

Signed-off-by: Steve Bennett <steveb@workware.net.au>
linenoise.c

index b824dff7c4ea1172d5e8212448fd55b90f0183fe..96e4369d42bd9654e442abc85b4e1813b1627b46 100644 (file)
@@ -305,6 +305,7 @@ static int linenoisePrompt(int fd, char *buf, size_t buflen, const char *prompt)
     while(1) {
         char c;
         int nread;
+        int ext;
         char seq[2], seq2[2];
 
         nread = read(fd,&c,1);
@@ -373,21 +374,22 @@ static int linenoisePrompt(int fd, char *buf, size_t buflen, const char *prompt)
             break;
         case 27:    /* escape sequence */
             if (read(fd,seq,2) == -1) break;
-            if (seq[0] == 91 && seq[1] == 68) {
+            ext = (seq[0] == 91 || seq[0] == 79);
+            if (ext && seq[1] == 68) {
 left_arrow:
                 /* left arrow */
                 if (pos > 0) {
                     pos--;
                     refreshLine(fd,prompt,buf,len,pos,cols);
                 }
-            } else if (seq[0] == 91 && seq[1] == 67) {
+            } else if (ext && seq[1] == 67) {
 right_arrow:
                 /* right arrow */
                 if (pos != len) {
                     pos++;
                     refreshLine(fd,prompt,buf,len,pos,cols);
                 }
-            } else if (seq[0] == 91 && (seq[1] == 65 || seq[1] == 66)) {
+            } else if (ext && (seq[1] == 65 || seq[1] == 66)) {
 up_down_arrow:
                 /* up and down arrow: history */
                 if (history_len > 1) {