changeset 30920:93b603c24d23 v9.0.0794

patch 9.0.0794: there is no way to find out if modifyOtherKeys has been seen Commit: https://github.com/vim/vim/commit/9f62ea01a08e69f44050f59469a0e64beddefac0 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Oct 19 13:07:03 2022 +0100 patch 9.0.0794: there is no way to find out if modifyOtherKeys has been seen Problem: There is no way to find out if an escape sequence with modifyOtherKeys has been seen. Solution: Add a notice with ":verbose map".
author Bram Moolenaar <Bram@vim.org>
date Wed, 19 Oct 2022 14:15:03 +0200
parents c26edfb0de48
children 546eac4f9926
files runtime/doc/map.txt src/map.c src/version.c
diffstat 3 files changed, 70 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -989,6 +989,11 @@ mapping, see |map-bar|.
 WARNING: if you map <C-[> you may very well break any key codes that start
 with Esc.  Make sure it comes AFTER other mappings.
 
+Vim automatically detects if the modifyOtherKeys mode was enabled when it
+spots an escape sequence that must have been created by it.  To see if Vim
+detected such an escape sequence use `:verbose map`, the first line will then
+show "Seen modifyOtherKeys: true" (possibly translated).
+
 A known side effect is that in Insert mode the raw escape sequence is inserted
 after the CTRL-V key.  This can be used to check whether modifyOtherKeys is
 enabled: In Insert mode type CTRL-SHIFT-V CTRL-V, if you get one byte then
--- a/src/map.c
+++ b/src/map.c
@@ -136,6 +136,9 @@ map_mode_to_chars(int mode)
     return (char_u *)mapmode.ga_data;
 }
 
+/*
+ * Output a line for one mapping.
+ */
     static void
 showmap(
     mapblock_T	*mp,
@@ -282,6 +285,61 @@ map_add(
 }
 
 /*
+ * List mappings.  When "haskey" is FALSE all mappings, otherwise mappings that
+ * match "keys[keys_len]".
+ */
+    static void
+list_mappings(
+	int	keyround,
+	int	abbrev,
+	int	haskey,
+	char_u	*keys,
+	int	keys_len,
+	int	mode,
+	int	*did_local)
+{
+    if (p_verbose > 0 && keyround == 1 && seenModifyOtherKeys)
+	msg_puts(_("Seen modifyOtherKeys: true"));
+
+    // need to loop over all global hash lists
+    for (int hash = 0; hash < 256 && !got_int; ++hash)
+    {
+	mapblock_T	*mp;
+
+	if (abbrev)
+	{
+	    if (hash != 0)	// there is only one abbreviation list
+		break;
+	    mp = curbuf->b_first_abbr;
+	}
+	else
+	    mp = curbuf->b_maphash[hash];
+	for ( ; mp != NULL && !got_int; mp = mp->m_next)
+	{
+	    // check entries with the same mode
+	    if (!mp->m_simplified && (mp->m_mode & mode) != 0)
+	    {
+		if (!haskey)		    // show all entries
+		{
+		    showmap(mp, TRUE);
+		    *did_local = TRUE;
+		}
+		else
+		{
+		    int n = mp->m_keylen;
+		    if (STRNCMP(mp->m_keys, keys,
+				   (size_t)(n < keys_len ? n : keys_len)) == 0)
+		    {
+			showmap(mp, TRUE);
+			*did_local = TRUE;
+		    }
+		}
+	    }
+	}
+    }
+}
+
+/*
  * map[!]		    : show all key mappings
  * map[!] {lhs}		    : show key mapping for {lhs}
  * map[!] {lhs} {rhs}	    : set key mapping for {lhs} to {rhs}
@@ -503,8 +561,6 @@ do_map(
 	int	did_local = FALSE;
 	int	keyround1_simplified = keyround == 1 && did_simplify;
 	int	round;
-	int	hash;
-	int	new_hash;
 
 	if (keyround == 2)
 	{
@@ -585,7 +641,7 @@ do_map(
 			       && haskey && hasarg && maptype != MAPTYPE_UNMAP)
 	{
 	    // need to loop over all global hash lists
-	    for (hash = 0; hash < 256 && !got_int; ++hash)
+	    for (int hash = 0; hash < 256 && !got_int; ++hash)
 	    {
 		if (abbrev)
 		{
@@ -619,42 +675,8 @@ do_map(
 	// When listing global mappings, also list buffer-local ones here.
 	if (map_table != curbuf->b_maphash && !hasarg
 						   && maptype != MAPTYPE_UNMAP)
-	{
-	    // need to loop over all global hash lists
-	    for (hash = 0; hash < 256 && !got_int; ++hash)
-	    {
-		if (abbrev)
-		{
-		    if (hash != 0)	// there is only one abbreviation list
-			break;
-		    mp = curbuf->b_first_abbr;
-		}
-		else
-		    mp = curbuf->b_maphash[hash];
-		for ( ; mp != NULL && !got_int; mp = mp->m_next)
-		{
-		    // check entries with the same mode
-		    if (!mp->m_simplified && (mp->m_mode & mode) != 0)
-		    {
-			if (!haskey)		    // show all entries
-			{
-			    showmap(mp, TRUE);
-			    did_local = TRUE;
-			}
-			else
-			{
-			    n = mp->m_keylen;
-			    if (STRNCMP(mp->m_keys, keys,
-					     (size_t)(n < len ? n : len)) == 0)
-			    {
-				showmap(mp, TRUE);
-				did_local = TRUE;
-			    }
-			}
-		    }
-		}
-	    }
-	}
+	    list_mappings(keyround, abbrev, haskey, keys, len,
+							     mode, &did_local);
 
 	// Find an entry in the maphash[] list that matches.
 	// For :unmap we may loop two times: once to try to unmap an entry with
@@ -666,7 +688,7 @@ do_map(
 					       && !did_it && !got_int; ++round)
 	{
 	    // need to loop over all hash lists
-	    for (hash = 0; hash < 256 && !got_int; ++hash)
+	    for (int hash = 0; hash < 256 && !got_int; ++hash)
 	    {
 		if (abbrev)
 		{
@@ -792,7 +814,7 @@ do_map(
 
 			    // May need to put this entry into another hash
 			    // list.
-			    new_hash = MAP_HASH(mp->m_mode, mp->m_keys[0]);
+			    int new_hash = MAP_HASH(mp->m_mode, mp->m_keys[0]);
 			    if (!abbrev && new_hash != hash)
 			    {
 				*mpp = mp->m_next;
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    794,
+/**/
     793,
 /**/
     792,