# HG changeset patch # User Christian Brabandt # Date 1471381206 -7200 # Node ID 7b39615c0db1d0a0261acb55e5b98836319a8466 # Parent 1e88c3dd0ae2c83ce164e88bcbc3350e34dc623b commit https://github.com/vim/vim/commit/6bff02eb530aa29aafa2cb5627399837be7a5dd5 Author: Bram Moolenaar Date: Tue Aug 16 22:50:55 2016 +0200 patch 7.4.2222 Problem: Sourcing a script where a character has 0x80 as a second byte does not work. (Filipe L B Correia) Solution: Turn 0x80 into K_SPECIAL KS_SPECIAL KE_FILLER. (Christian Brabandt, closes #728) Add a test case. diff --git a/src/getchar.c b/src/getchar.c --- a/src/getchar.c +++ b/src/getchar.c @@ -3060,7 +3060,7 @@ inchar( if (typebuf_changed(tb_change_cnt)) return 0; - return fix_input_buffer(buf, len, script_char >= 0); + return fix_input_buffer(buf, len); } /* @@ -3069,10 +3069,7 @@ inchar( * Returns the new length. */ int -fix_input_buffer( - char_u *buf, - int len, - int script) /* TRUE when reading from a script */ +fix_input_buffer(char_u *buf, int len) { int i; char_u *p = buf; @@ -3083,7 +3080,6 @@ fix_input_buffer( * Replace NUL by K_SPECIAL KS_ZERO KE_FILLER * Replace K_SPECIAL by K_SPECIAL KS_SPECIAL KE_FILLER * Replace CSI by K_SPECIAL KS_EXTRA KE_CSI - * Don't replace K_SPECIAL when reading a script file. */ for (i = len; --i >= 0; ++p) { @@ -3106,7 +3102,7 @@ fix_input_buffer( } else #endif - if (p[0] == NUL || (p[0] == K_SPECIAL && !script + if (p[0] == NUL || (p[0] == K_SPECIAL #ifdef FEAT_AUTOCMD /* timeout may generate K_CURSORHOLD */ && (i < 2 || p[1] != KS_EXTRA || p[2] != (int)KE_CURSORHOLD) diff --git a/src/misc1.c b/src/misc1.c --- a/src/misc1.c +++ b/src/misc1.c @@ -3416,7 +3416,7 @@ get_keystroke(void) if (n > 0) { /* Replace zero and CSI by a special key code. */ - n = fix_input_buffer(buf + len, n, FALSE); + n = fix_input_buffer(buf + len, n); len += n; waited = 0; } diff --git a/src/proto/getchar.pro b/src/proto/getchar.pro --- a/src/proto/getchar.pro +++ b/src/proto/getchar.pro @@ -47,7 +47,7 @@ int vpeekc_nomap(void); int vpeekc_any(void); int char_avail(void); void vungetc(int c); -int fix_input_buffer(char_u *buf, int len, int script); +int fix_input_buffer(char_u *buf, int len); int input_available(void); int do_map(int maptype, char_u *arg, int mode, int abbrev); int get_map_mode(char_u **cmdp, int forceit); diff --git a/src/testdir/test_regexp_utf8.vim b/src/testdir/test_regexp_utf8.vim --- a/src/testdir/test_regexp_utf8.vim +++ b/src/testdir/test_regexp_utf8.vim @@ -25,11 +25,13 @@ endfunc func Test_equivalence_re1() set re=1 call s:equivalence_test() + set re=0 endfunc func Test_equivalence_re2() set re=2 call s:equivalence_test() + set re=0 endfunc func s:classes_test() @@ -82,9 +84,26 @@ endfunc func Test_classes_re1() set re=1 call s:classes_test() + set re=0 endfunc func Test_classes_re2() set re=2 call s:classes_test() + set re=0 endfunc + +func Test_source_utf8() + " check that sourcing a script with 0x80 as second byte works + new + call setline(1, [':%s/àx/--à1234--/g', ':%s/Àx/--À1234--/g']) + write! Xscript + bwipe! + new + call setline(1, [' àx ', ' Àx ']) + source! Xscript | echo + call assert_equal(' --à1234-- ', getline(1)) + call assert_equal(' --À1234-- ', getline(2)) + bwipe! + call delete('Xscript') +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2222, +/**/ 2221, /**/ 2220,