diff src/getchar.c @ 275:fb70e333c94e

updated for version 7.0074
author vimboss
date Fri, 20 May 2005 21:19:57 +0000
parents 723a01584c3e
children 86cd0a77d2ae
line wrap: on
line diff
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -4522,14 +4522,16 @@ check_map_keycodes()
  * NULL otherwise
  */
     char_u *
-check_map(keys, mode, exact)
+check_map(keys, mode, exact, ign_mod)
     char_u	*keys;
     int		mode;
     int		exact;		/* require exact match */
+    int		ign_mod;	/* ignore preceding modifier */
 {
     int		hash;
     int		len, minlen;
     mapblock_T	*mp;
+    char_u	*s;
 #ifdef FEAT_LOCALMAP
     int		local;
 #endif
@@ -4553,14 +4555,23 @@ check_map(keys, mode, exact)
 	    {
 		/* skip entries with wrong mode, wrong length and not matching
 		 * ones */
-		if (mp->m_keylen < len)
-		    minlen = mp->m_keylen;
-		else
-		    minlen = len;
-		if ((mp->m_mode & mode)
-			&& (!exact || mp->m_keylen == len)
-			&& STRNCMP(mp->m_keys, keys, minlen) == 0)
-		    return mp->m_str;
+		if ((mp->m_mode & mode) && (!exact || mp->m_keylen == len))
+		{
+		    if (len > mp->m_keylen)
+			minlen = mp->m_keylen;
+		    else
+			minlen = len;
+		    s = mp->m_keys;
+		    if (ign_mod && s[0] == K_SPECIAL && s[1] == KS_MODIFIER
+							       && s[2] != NUL)
+		    {
+			s += 3;
+			if (len > mp->m_keylen - 3)
+			    minlen = mp->m_keylen - 3;
+		    }
+		    if (STRNCMP(s, keys, minlen) == 0)
+			return mp->m_str;
+		}
 	    }
 	}