--- charset.c	2006-05-08 13:21:48.816375000 -0600
+++ charset.c.new	2006-05-08 13:22:35.613250000 -0600
@@ -328,6 +328,7 @@
 {
     char_u	*res;
     char_u	*p;
+    int		res_added = 0;
 #ifdef FEAT_MBYTE
     int		l, len, c;
     char_u	hexbuf[11];
@@ -386,7 +387,41 @@
 	    }
 	    else
 #endif
-		STRCAT(res, transchar_byte(*p++));
+	    {
+		if ( *p == K_SPECIAL )
+		{
+		    int	    key = 0;
+		    char_u  *key_name;
+		    int	    modifiers = 0;
+
+		    key = TERMCAP2KEY( *(p+1), *(p+2) );
+
+		    if ( find_special_key_in_table(key) > 0 )
+		    {
+
+			key = extract_modifiers( key, &modifiers );
+			key_name = get_special_key_name( key, modifiers);
+
+			if ( *key_name != '\0' && STRCMP( key_name, "<>" ) && STRCMP( key_name, "" ) 
+				&& STRCMP( key_name, "<\\200>") )
+			{
+			    char_u res1;
+
+			    p += 3;
+			    res_added += STRLEN( key_name );
+			    // vim_realloc does a free()
+			    res = realloc( res, 
+				    (unsigned)(vim_strsize(s) + 1) + res_added );
+			    STRCAT( res, key_name );
+			}
+		    }
+		    else
+			STRCAT(res, transchar_byte(*p++));
+
+		}
+		else
+		    STRCAT(res, transchar_byte(*p++));
+	    }
 	}
     }
     return res;
