Mercurial > vim
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();