Details are in the attached patch file.

Eliminate "Unknown ESC sequence: ..." messages caused by applying
modifiers (shift, alt and ctrl) to cursor keys.

Holding down a modifier key adds parameters to the cursor key escape
sequence. `ESC [ x` becomes `ESC [ 1 ; # x`, where `#` depends upon
the modifier key.

This patch causes ESCmap::is_equal() and ESCmap::has_prefix() to
ignore parameters when matching incoming key sequences. The cursor
keys now have identical behavior whether or not a modifier key is
present.


Index: src/LineInput.cc
===================================================================
--- src/LineInput.cc	(revision 501)
+++ src/LineInput.cc	(working copy)
@@ -80,13 +80,15 @@
 bool
 ESCmap::has_prefix(const char * seq, int seq_len) const
 {
-   if (seq_len >= len)   return false;
+   int ss = 0;
    loop(s, seq_len)
       {
-        if (seq[s] != seqence[s])   return false;
+        if (!isdigit(seq[s]) && seq[s] != ';') {
+          if (seq[s] != seqence[ss++])   return false;
+        }
       }
 
-   return true;
+   return ss < len;
 }
 //-----------------------------------------------------------------------------
 void
@@ -100,13 +102,15 @@
 bool
 ESCmap::is_equal(const char * seq, int seq_len) const
 {
-   if (len != seq_len)   return false;
+   int ss = 0;
    loop(s, seq_len)
       {
-        if (seq[s] != seqence[s])   return false;
+        if (!isdigit(seq[s]) && seq[s] != ';') {
+          if (seq[s] != seqence[ss++])   return false;
+        }
       }
 
-   return true;
+   return ss == len;
 }
 //=============================================================================
 LineHistory::LineHistory(int maxl)

Reply via email to