0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

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.
This commit is contained in:
Bram Moolenaar
2016-08-16 22:50:55 +02:00
parent 91984b9034
commit 6bff02eb53
5 changed files with 26 additions and 9 deletions

View File

@@ -3060,7 +3060,7 @@ inchar(
if (typebuf_changed(tb_change_cnt)) if (typebuf_changed(tb_change_cnt))
return 0; 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. * Returns the new length.
*/ */
int int
fix_input_buffer( fix_input_buffer(char_u *buf, int len)
char_u *buf,
int len,
int script) /* TRUE when reading from a script */
{ {
int i; int i;
char_u *p = buf; char_u *p = buf;
@@ -3083,7 +3080,6 @@ fix_input_buffer(
* Replace NUL by K_SPECIAL KS_ZERO KE_FILLER * Replace NUL by K_SPECIAL KS_ZERO KE_FILLER
* Replace K_SPECIAL by K_SPECIAL KS_SPECIAL KE_FILLER * Replace K_SPECIAL by K_SPECIAL KS_SPECIAL KE_FILLER
* Replace CSI by K_SPECIAL KS_EXTRA KE_CSI * 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) for (i = len; --i >= 0; ++p)
{ {
@@ -3106,7 +3102,7 @@ fix_input_buffer(
} }
else else
#endif #endif
if (p[0] == NUL || (p[0] == K_SPECIAL && !script if (p[0] == NUL || (p[0] == K_SPECIAL
#ifdef FEAT_AUTOCMD #ifdef FEAT_AUTOCMD
/* timeout may generate K_CURSORHOLD */ /* timeout may generate K_CURSORHOLD */
&& (i < 2 || p[1] != KS_EXTRA || p[2] != (int)KE_CURSORHOLD) && (i < 2 || p[1] != KS_EXTRA || p[2] != (int)KE_CURSORHOLD)

View File

@@ -3416,7 +3416,7 @@ get_keystroke(void)
if (n > 0) if (n > 0)
{ {
/* Replace zero and CSI by a special key code. */ /* 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; len += n;
waited = 0; waited = 0;
} }

View File

@@ -47,7 +47,7 @@ int vpeekc_nomap(void);
int vpeekc_any(void); int vpeekc_any(void);
int char_avail(void); int char_avail(void);
void vungetc(int c); 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 input_available(void);
int do_map(int maptype, char_u *arg, int mode, int abbrev); int do_map(int maptype, char_u *arg, int mode, int abbrev);
int get_map_mode(char_u **cmdp, int forceit); int get_map_mode(char_u **cmdp, int forceit);

View File

@@ -25,11 +25,13 @@ endfunc
func Test_equivalence_re1() func Test_equivalence_re1()
set re=1 set re=1
call s:equivalence_test() call s:equivalence_test()
set re=0
endfunc endfunc
func Test_equivalence_re2() func Test_equivalence_re2()
set re=2 set re=2
call s:equivalence_test() call s:equivalence_test()
set re=0
endfunc endfunc
func s:classes_test() func s:classes_test()
@@ -82,9 +84,26 @@ endfunc
func Test_classes_re1() func Test_classes_re1()
set re=1 set re=1
call s:classes_test() call s:classes_test()
set re=0
endfunc endfunc
func Test_classes_re2() func Test_classes_re2()
set re=2 set re=2
call s:classes_test() 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 endfunc

View File

@@ -763,6 +763,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2222,
/**/ /**/
2221, 2221,
/**/ /**/