diff src/ex_getln.c @ 18717:14d2a210fab1 v8.1.2350

patch 8.1.2350: other text for CTRL-V in Insert mode with modifyOtherKeys Commit: https://github.com/vim/vim/commit/fc4ea2a72d36de1196a3ce17352e72f8fe90f4bb Author: Bram Moolenaar <Bram@vim.org> Date: Tue Nov 26 19:33:22 2019 +0100 patch 8.1.2350: other text for CTRL-V in Insert mode with modifyOtherKeys Problem: Other text for CTRL-V in Insert mode with modifyOtherKeys. Solution: Convert the Escape sequence back to key as if modifyOtherKeys is not set, and use CTRL-SHIFT-V to get the Escape sequence itself. (closes #5254)
author Bram Moolenaar <Bram@vim.org>
date Tue, 26 Nov 2019 19:45:04 +0100
parents ac08c7ad9d37
children 8f05b3cf8557
line wrap: on
line diff
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -2208,18 +2208,31 @@ getcmdline_int(
 
 	case Ctrl_V:
 	case Ctrl_Q:
-		ignore_drag_release = TRUE;
-		putcmdline('^', TRUE);
-		c = get_literal();	    /* get next (two) character(s) */
-		do_abbr = FALSE;	    /* don't do abbreviation now */
-		extra_char = NUL;
-		/* may need to remove ^ when composing char was typed */
-		if (enc_utf8 && utf_iscomposing(c) && !cmd_silent)
 		{
-		    draw_cmdline(ccline.cmdpos, ccline.cmdlen - ccline.cmdpos);
-		    msg_putchar(' ');
-		    cursorcmd();
+		    int	 prev_mod_mask = mod_mask;
+
+		    ignore_drag_release = TRUE;
+		    putcmdline('^', TRUE);
+		    c = get_literal();	    // get next (two) character(s)
+		    do_abbr = FALSE;	    // don't do abbreviation now
+		    extra_char = NUL;
+		    // may need to remove ^ when composing char was typed
+		    if (enc_utf8 && utf_iscomposing(c) && !cmd_silent)
+		    {
+			draw_cmdline(ccline.cmdpos,
+						ccline.cmdlen - ccline.cmdpos);
+			msg_putchar(' ');
+			cursorcmd();
+		    }
+
+		    if ((c == ESC || c == CSI)
+					  && !(prev_mod_mask & MOD_MASK_SHIFT))
+			// Using CTRL-V: Change any modifyOtherKeys ESC
+			// sequence to a normal key.  Don't do this for
+			// CTRL-SHIFT-V.
+			c = decodeModifyOtherKeys(c);
 		}
+
 		break;
 
 #ifdef FEAT_DIGRAPHS