Mercurial > vim
changeset 5718:f5120cbf16b9 v7.4.204
updated for version 7.4.204
Problem: A mapping where the second byte is 0x80 doesn't work.
Solution: Unescape before checking for incomplete multi-byte char. (Nobuhiro
Takasaki)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 12 Mar 2014 20:17:51 +0100 |
parents | 0cc52481bfd4 |
children | 41731b8ee4b8 |
files | src/getchar.c src/testdir/test75.in src/testdir/test75.ok src/version.c |
diffstat | 4 files changed, 30 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/getchar.c +++ b/src/getchar.c @@ -2206,10 +2206,16 @@ vgetorpeek(advance) #ifdef FEAT_MBYTE /* Don't allow mapping the first byte(s) of a * multi-byte char. Happens when mapping - * <M-a> and then changing 'encoding'. */ - if (has_mbyte && MB_BYTE2LEN(c1) - > (*mb_ptr2len)(mp->m_keys)) - mlen = 0; + * <M-a> and then changing 'encoding'. Beware + * that 0x80 is escaped. */ + { + char_u *p1 = mp->m_keys; + char_u *p2 = mb_unescape(&p1); + + if (has_mbyte && p2 != NULL + && MB_BYTE2LEN(c1) > MB_PTR2LEN(p2)) + mlen = 0; + } #endif /* * Check an entry whether it matches.
--- a/src/testdir/test75.in +++ b/src/testdir/test75.in @@ -1,8 +1,11 @@ Tests for maparg(). +Also test utf8 map with a 0x80 byte. STARTTEST :so small.vim +:so mbyte.vim :set cpo-=< +:set encoding=utf8 :" Test maparg() with a string result :map foo<C-V> is<F4>foo :vnoremap <script> <buffer> <expr> <silent> bar isbar @@ -17,6 +20,20 @@ STARTTEST :map abc y<S-char-114>y :call append('$', maparg('abc')) :" +Go:" +:" Outside of the range, minimum +:inoremap <Char-0x1040> a +:call feedkeys("a\u1040\<Esc>") +:" Inside of the range, minimum +:inoremap <Char-0x103f> b +:call feedkeys("a\u103f\<Esc>") +:" Inside of the range, maximum +:inoremap <Char-0xf03f> c +:call feedkeys("a\uf03f\<Esc>") +:" Outside of the range, maximum +:inoremap <Char-0xf040> d +:call feedkeys("a\uf040\<Esc>") +:" :/^eof/+1,$w! test.out :qa! ENDTEST