changeset 275:fb70e333c94e

updated for version 7.0074
author vimboss
date Fri, 20 May 2005 21:19:57 +0000
parents 8fa8d7964cf1
children b15976488069
files src/getchar.c src/message.c src/normal.c
diffstat 3 files changed, 53 insertions(+), 35 deletions(-) [+]
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;
+		}
 	    }
 	}
 
--- a/src/message.c
+++ b/src/message.c
@@ -3785,18 +3785,18 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
 	    if (!justify_left)
 	    {
 		/* left padding with blank or zero */
-		int n = min_field_width - (str_arg_l + number_of_zeros_to_pad);
-
-		if (n > 0)
+		int pn = min_field_width - (str_arg_l + number_of_zeros_to_pad);
+
+		if (pn > 0)
 		{
 		    if (str_l < str_m)
 		    {
 			size_t avail = str_m - str_l;
 
 			vim_memset(str + str_l, zero_padding ? '0' : ' ',
-						       n > avail ? avail : n);
+					     (size_t)pn > avail ? avail : pn);
 		    }
-		    str_l += n;
+		    str_l += pn;
 		}
 	    }
 
@@ -3812,41 +3812,42 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
 	    {
 		/* insert first part of numerics (sign or '0x') before zero
 		 * padding */
-		int n = zero_padding_insertion_ind;
-
-		if (n > 0)
+		int zn = zero_padding_insertion_ind;
+
+		if (zn > 0)
 		{
 		    if (str_l < str_m)
 		    {
 			size_t avail = str_m - str_l;
 
 			mch_memmove(str + str_l, str_arg,
-						       n > avail ? avail : n);
+					     (size_t)zn > avail ? avail : zn);
 		    }
-		    str_l += n;
+		    str_l += zn;
 		}
 
 		/* insert zero padding as requested by the precision or min
 		 * field width */
-		n = number_of_zeros_to_pad;
-		if (n > 0)
+		zn = number_of_zeros_to_pad;
+		if (zn > 0)
 		{
 		    if (str_l < str_m)
 		    {
 			size_t avail = str_m-str_l;
 
-			vim_memset(str + str_l, '0', n > avail ? avail : n);
+			vim_memset(str + str_l, '0',
+					     (size_t)zn > avail ? avail : zn);
 		    }
-		    str_l += n;
+		    str_l += zn;
 		}
 	    }
 
 	    /* insert formatted string
 	     * (or as-is conversion specifier for unknown conversions) */
 	    {
-		int n = str_arg_l - zero_padding_insertion_ind;
-
-		if (n > 0)
+		int sn = str_arg_l - zero_padding_insertion_ind;
+
+		if (sn > 0)
 		{
 		    if (str_l < str_m)
 		    {
@@ -3854,9 +3855,9 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
 
 			mch_memmove(str + str_l,
 				str_arg + zero_padding_insertion_ind,
-				n > avail ? avail : n);
+				(size_t)sn > avail ? avail : sn);
 		    }
-		    str_l += n;
+		    str_l += sn;
 		}
 	    }
 
@@ -3864,17 +3865,18 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3
 	    if (justify_left)
 	    {
 		/* right blank padding to the field width */
-		int n = min_field_width - (str_arg_l + number_of_zeros_to_pad);
-
-		if (n > 0)
+		int pn = min_field_width - (str_arg_l + number_of_zeros_to_pad);
+
+		if (pn > 0)
 		{
 		    if (str_l < str_m)
 		    {
 			size_t avail = str_m - str_l;
 
-			vim_memset(str + str_l, ' ', n > avail ? avail : n);
+			vim_memset(str + str_l, ' ',
+					     (size_t)pn > avail ? avail : pn);
 		    }
-		    str_l += n;
+		    str_l += pn;
 		}
 	    }
 	}
--- a/src/normal.c
+++ b/src/normal.c
@@ -651,12 +651,17 @@ normal_cmd(oap, toplevel)
 	buf[0] = c;
 	buf[1] = NUL;
 # endif
-	/* Fake a "c"hange command.
+	/* Fake a "c"hange command.  When "restart_edit" is set (e.g., because
+	 * 'insertmode' is set) fake a "d"elete command, Insert mode will
+	 * restart automatically.
 	 * Insert the typed character in the typeahead buffer, so that it will
 	 * be mapped in Insert mode.  Required for ":lmap" to work.  May cause
 	 * mapping a character from ":vnoremap"... */
 	(void)ins_typebuf(buf, REMAP_YES, 0, !KeyTyped, FALSE);
-	c = 'c';
+	if (restart_edit != 0)
+	    c = 'd';
+	else
+	    c = 'c';
     }
 #endif