changeset 14247:381b01f77461 v8.1.0140

patch 8.1.0140: recording into a register has focus events commit https://github.com/vim/vim/commit/972bfddc6b3f52ae0865ad8c0bf6089bc8a9883a Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jul 3 14:48:15 2018 +0200 patch 8.1.0140: recording into a register has focus events Problem: Recording into a register has focus events. (Michael Naumann) Solution: Don't record K_FOCUSGAINED and K_FOCUSLOST. (closes https://github.com/vim/vim/issues/3143)
author Christian Brabandt <cb@256bit.org>
date Tue, 03 Jul 2018 15:00:09 +0200
parents bdcaa04baead
children 6d5195298b47
files src/getchar.c src/version.c
diffstat 2 files changed, 32 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -1246,27 +1246,43 @@ del_typebuf(int len, int offset)
     static void
 gotchars(char_u *chars, int len)
 {
-    char_u	*s = chars;
-    int		c;
-    char_u	buf[2];
-    int		todo = len;
-
-    /* remember how many chars were last recorded */
-    if (reg_recording != 0)
-	last_recorded_len += len;
-
-    buf[1] = NUL;
+    char_u		*s = chars;
+    int			i;
+    static char_u	buf[4];
+    static int		buflen = 0;
+    int			todo = len;
+
     while (todo--)
     {
+	buf[buflen++] = *s++;
+
+	// When receiving a special key sequence, store it until we have all
+	// the bytes and we can decide what to do with it.
+	if (buflen == 1 && buf[0] == K_SPECIAL)
+	    continue;
+	if (buflen == 2)
+	    continue;
+	if (buflen == 3 && buf[1] == KS_EXTRA
+		       && (buf[2] == KE_FOCUSGAINED || buf[2] == KE_FOCUSLOST))
+	{
+	    // Drop K_FOCUSGAINED and K_FOCUSLOST, they are not useful in a
+	    // recording.
+	    buflen = 0;
+	    continue;
+	}
+
 	/* Handle one byte at a time; no translation to be done. */
-	c = *s++;
-	updatescript(c);
+	for (i = 0; i < buflen; ++i)
+	    updatescript(buf[i]);
 
 	if (reg_recording != 0)
 	{
-	    buf[0] = c;
-	    add_buff(&recordbuff, buf, 1L);
+	    buf[buflen] = NUL;
+	    add_buff(&recordbuff, buf, (long)buflen);
+	    /* remember how many chars were last recorded */
+	    last_recorded_len += buflen;
 	}
+	buflen = 0;
     }
     may_sync_undo();
 
--- a/src/version.c
+++ b/src/version.c
@@ -790,6 +790,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    140,
+/**/
     139,
 /**/
     138,