diff src/getchar.c @ 10:4e2284e71352

updated for version 7.0002
author vimboss
date Thu, 24 Jun 2004 15:53:16 +0000
parents 3fc0f57ecb91
children 125e80798a85
line wrap: on
line diff
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -100,6 +100,7 @@ static int		KeyNoremap = FALSE; /* remap
 #define RM_YES		0	/* tb_noremap: remap */
 #define RM_NONE		1	/* tb_noremap: don't remap */
 #define RM_SCRIPT	2	/* tb_noremap: remap local script mappings */
+#define RM_ABBR		4	/* tb_noremap: don't remap, do abbrev. */
 
 /* typebuf.tb_buf has three parts: room in front (for result of mappings), the
  * middle for typeahead and room for new characters (which needs to be 3 *
@@ -896,6 +897,8 @@ init_typebuf()
  *
  * If noremap is REMAP_YES, new string can be mapped again.
  * If noremap is REMAP_NONE, new string cannot be mapped again.
+ * If noremap is REMAP_SKIP, fist char of new string cannot be mapped again,
+ * but abbreviations are allowed.
  * If noremap is REMAP_SCRIPT, new string cannot be mapped again, except for
  *			script-local mappings.
  * If noremap is > 0, that many characters of the new string cannot be mapped.
@@ -993,6 +996,8 @@ ins_typebuf(str, noremap, offset, nottyp
     /* If noremap == REMAP_SCRIPT: do remap script-local mappings. */
     if (noremap == REMAP_SCRIPT)
 	val = RM_SCRIPT;
+    else if (noremap == REMAP_SKIP)
+	val = RM_ABBR;
     else
 	val = RM_NONE;
 
@@ -1004,7 +1009,9 @@ ins_typebuf(str, noremap, offset, nottyp
      * If noremap  > 0: "noremap" characters are not remappable, the rest
      *			mappable
      */
-    if (noremap < 0)
+    if (noremap == REMAP_SKIP)
+	nrm = 1;
+    else if (noremap < 0)
 	nrm = addlen;
     else
 	nrm = noremap;
@@ -1856,8 +1863,8 @@ vgetorpeek(advance)
 			    && (no_zero_mapping == 0 || c1 != '0')
 			    && (typebuf.tb_maplen == 0
 				|| (p_remap
-				    && typebuf.tb_noremap[typebuf.tb_off]
-								  != RM_NONE))
+				    && (typebuf.tb_noremap[typebuf.tb_off]
+						    & (RM_NONE|RM_ABBR)) == 0))
 			    && !(p_paste && (State & (INSERT + CMDLINE)))
 			    && !(State == HITRETURN && (c1 == CAR || c1 == ' '))
 			    && State != ASKMORE
@@ -1973,7 +1980,7 @@ vgetorpeek(advance)
 				     * remapped, skip the entry.
 				     */
 				    for (n = mlen; --n >= 0; )
-					if (*s++ == RM_NONE)
+					if (*s++ & (RM_NONE|RM_ABBR))
 					    break;
 				    if (n >= 0)
 					continue;
@@ -2132,7 +2139,8 @@ vgetorpeek(advance)
 							 + typebuf.tb_off, 1);
 				    }
 				    KeyNoremap = (typebuf.tb_noremap[
-						typebuf.tb_off] != REMAP_YES);
+						   typebuf.tb_off]
+						       & (RM_NONE|RM_SCRIPT));
 				    del_typebuf(1, 0);
 				}
 				break;	    /* got character, break for loop */
@@ -2233,7 +2241,8 @@ vgetorpeek(advance)
 			/*
 			 * Insert the 'to' part in the typebuf.tb_buf.
 			 * If 'from' field is the same as the start of the
-			 * 'to' field, don't remap the first character.
+			 * 'to' field, don't remap the first character (but do
+			 * allow abbreviations).
 			 * If m_noremap is set, don't remap the whole 'to'
 			 * part.
 			 */
@@ -2241,8 +2250,8 @@ vgetorpeek(advance)
 				mp->m_noremap != REMAP_YES
 					    ? mp->m_noremap
 					    : STRNCMP(mp->m_str, mp->m_keys,
-							       (size_t)keylen)
-							      ? REMAP_YES : 1,
+							  (size_t)keylen) != 0
+						     ? REMAP_YES : REMAP_SKIP,
 				0, TRUE, cmd_silent || mp->m_silent) == FAIL)
 			{
 			    c = -1;