# HG changeset patch # User Bram Moolenaar # Date 1591792204 -7200 # Node ID c4bce986c31a2404607a1a51068da06dba8a8219 # Parent 93e66f657101aeba37a26596ca262ccbf7a512e9 patch 8.2.0943: displaying ^M or ^J depends on current buffer Commit: https://github.com/vim/vim/commit/32ee627750e8b7b3fa6516b893e72f6e6af54710 Author: Bram Moolenaar Date: Wed Jun 10 14:16:49 2020 +0200 patch 8.2.0943: displaying ^M or ^J depends on current buffer Problem: Displaying ^M or ^J depends on current buffer. Solution: Pass the displayed buffer to transchar(). (closes https://github.com/vim/vim/issues/6225) diff --git a/src/charset.c b/src/charset.c --- a/src/charset.c +++ b/src/charset.c @@ -499,18 +499,24 @@ str_foldcase( * Also doesn't work for the first byte of a multi-byte, "c" must be a * character! */ -static char_u transchar_buf[7]; +static char_u transchar_charbuf[7]; char_u * transchar(int c) { + return transchar_buf(curbuf, c); +} + + char_u * +transchar_buf(buf_T *buf, int c) +{ int i; i = 0; if (IS_SPECIAL(c)) // special key code, display as ~@ char { - transchar_buf[0] = '~'; - transchar_buf[1] = '@'; + transchar_charbuf[0] = '~'; + transchar_charbuf[1] = '@'; i = 2; c = K_SECOND(c); } @@ -524,12 +530,12 @@ transchar(int c) )) || (c < 256 && vim_isprintc_strict(c))) { // printable character - transchar_buf[i] = c; - transchar_buf[i + 1] = NUL; + transchar_charbuf[i] = c; + transchar_charbuf[i + 1] = NUL; } else - transchar_nonprint(transchar_buf + i, c); - return transchar_buf; + transchar_nonprint(buf, transchar_charbuf + i, c); + return transchar_charbuf; } /* @@ -541,27 +547,27 @@ transchar_byte(int c) { if (enc_utf8 && c >= 0x80) { - transchar_nonprint(transchar_buf, c); - return transchar_buf; + transchar_nonprint(curbuf, transchar_charbuf, c); + return transchar_charbuf; } return transchar(c); } /* * Convert non-printable character to two or more printable characters in - * "buf[]". "buf" needs to be able to hold five bytes. + * "buf[]". "charbuf" needs to be able to hold five bytes. * Does NOT work for multi-byte characters, c must be <= 255. */ void -transchar_nonprint(char_u *buf, int c) +transchar_nonprint(buf_T *buf, char_u *charbuf, int c) { if (c == NL) c = NUL; // we use newline in place of a NUL - else if (c == CAR && get_fileformat(curbuf) == EOL_MAC) + else if (c == CAR && get_fileformat(buf) == EOL_MAC) c = NL; // we use CR in place of NL in this case if (dy_flags & DY_UHEX) // 'display' has "uhex" - transchar_hex(buf, c); + transchar_hex(charbuf, c); #ifdef EBCDIC // For EBCDIC only the characters 0-63 and 255 are not printable @@ -570,35 +576,35 @@ transchar_nonprint(char_u *buf, int c) else if (c <= 0x7f) // 0x00 - 0x1f and 0x7f #endif { - buf[0] = '^'; + charbuf[0] = '^'; #ifdef EBCDIC if (c == DEL) - buf[1] = '?'; // DEL displayed as ^? + charbuf[1] = '?'; // DEL displayed as ^? else - buf[1] = CtrlChar(c); + charbuf[1] = CtrlChar(c); #else - buf[1] = c ^ 0x40; // DEL displayed as ^? + charbuf[1] = c ^ 0x40; // DEL displayed as ^? #endif - buf[2] = NUL; + charbuf[2] = NUL; } else if (enc_utf8 && c >= 0x80) { - transchar_hex(buf, c); + transchar_hex(charbuf, c); } #ifndef EBCDIC else if (c >= ' ' + 0x80 && c <= '~' + 0x80) // 0xa0 - 0xfe { - buf[0] = '|'; - buf[1] = c - 0x80; - buf[2] = NUL; + charbuf[0] = '|'; + charbuf[1] = c - 0x80; + charbuf[2] = NUL; } #else else if (c < 64) { - buf[0] = '~'; - buf[1] = MetaChar(c); - buf[2] = NUL; + charbuf[0] = '~'; + charbuf[1] = MetaChar(c); + charbuf[2] = NUL; } #endif else // 0x80 - 0x9f and 0xff @@ -607,13 +613,13 @@ transchar_nonprint(char_u *buf, int c) * TODO: EBCDIC I don't know what to do with this chars, so I display * them as '~?' for now */ - buf[0] = '~'; + charbuf[0] = '~'; #ifdef EBCDIC - buf[1] = '?'; // 0xff displayed as ~? + charbuf[1] = '?'; // 0xff displayed as ~? #else - buf[1] = (c - 0x80) ^ 0x40; // 0xff displayed as ~? + charbuf[1] = (c - 0x80) ^ 0x40; // 0xff displayed as ~? #endif - buf[2] = NUL; + charbuf[2] = NUL; } } diff --git a/src/drawline.c b/src/drawline.c --- a/src/drawline.c +++ b/src/drawline.c @@ -1764,7 +1764,7 @@ win_line( { // head byte at end of line mb_l = 1; - transchar_nonprint(extra, c); + transchar_nonprint(wp->w_buffer, extra, c); } else { @@ -2224,7 +2224,7 @@ win_line( } else if (c != NUL) { - p_extra = transchar(c); + p_extra = transchar_buf(wp->w_buffer, c); if (n_extra == 0) n_extra = byte2cells(c) - 1; #ifdef FEAT_RIGHTLEFT diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -69,7 +69,7 @@ do_ascii(exarg_T *eap UNUSED) #endif )) { - transchar_nonprint(buf3, c); + transchar_nonprint(curbuf, buf3, c); vim_snprintf(buf1, sizeof(buf1), " <%s>", (char *)buf3); } else @@ -2556,7 +2556,7 @@ do_ecmd( } /* - * if the file was changed we may not be allowed to abandon it + * If the file was changed we may not be allowed to abandon it: * - if we are going to re-edit the same file * - or if we are the only window on this file and if ECMD_HIDE is FALSE */ diff --git a/src/gui_beval.c b/src/gui_beval.c --- a/src/gui_beval.c +++ b/src/gui_beval.c @@ -840,7 +840,7 @@ set_printable_label_text(GtkLabel *label } else { - transchar_nonprint(pdest, *p); // ^X + transchar_nonprint(curbuf, pdest, *p); // ^X outlen = 2; } if (pixel != INVALCOLOR) diff --git a/src/message.c b/src/message.c --- a/src/message.c +++ b/src/message.c @@ -1752,7 +1752,7 @@ str2special( // For multi-byte characters check for an illegal byte. if (has_mbyte && MB_BYTE2LEN(*str) > len) { - transchar_nonprint(buf, c); + transchar_nonprint(curbuf, buf, c); *sp = str + 1; return buf; } diff --git a/src/proto/charset.pro b/src/proto/charset.pro --- a/src/proto/charset.pro +++ b/src/proto/charset.pro @@ -5,8 +5,9 @@ void trans_characters(char_u *buf, int b char_u *transstr(char_u *s); char_u *str_foldcase(char_u *str, int orglen, char_u *buf, int buflen); char_u *transchar(int c); +char_u *transchar_buf(buf_T *buf, int c); char_u *transchar_byte(int c); -void transchar_nonprint(char_u *buf, int c); +void transchar_nonprint(buf_T *buf, char_u *charbuf, int c); void transchar_hex(char_u *buf, int c); int byte2cells(int b); int char2cells(int c); diff --git a/src/testdir/dumps/Test_display_unprintable_01.dump b/src/testdir/dumps/Test_display_unprintable_01.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_display_unprintable_01.dump @@ -0,0 +1,9 @@ +>m+0&#ffffff0|a|c| @46 +|^+0#0000e05&|J|t+0#0000000&|w|o|^+0#0000e05&|J| +0#0000000&@42 +|~+0#4040ff13&| @48 +|X+3#0000000&|m|a|c|.|t|x|t| @23|1|,|1| @11|A|l@1 +|u+0&&|n|i|x|^+0#0000e05&|M| +0#0000000&@43 +|t|w|o| @46 +|~+0#4040ff13&| @48 +|X+1#0000000&|u|n|i|x|.|t|x|t| @22|1|,|1| @11|A|l@1 +|"+0&&|X|m|a|c|.|t|x|t|"| |[|n|o|e|o|l|]|[|m|a|c|]| |2|L|,| |9|C| @19 diff --git a/src/testdir/dumps/Test_display_unprintable_02.dump b/src/testdir/dumps/Test_display_unprintable_02.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_display_unprintable_02.dump @@ -0,0 +1,9 @@ +|m+0&#ffffff0|a|c| @46 +|^+0#0000e05&|J|t+0#0000000&|w|o|^+0#0000e05&|J| +0#0000000&@42 +|~+0#4040ff13&| @48 +|X+1#0000000&|m|a|c|.|t|x|t| @23|1|,|1| @11|A|l@1 +>u+0&&|n|i|x|^+0#0000e05&|M| +0#0000000&@43 +|t|w|o| @46 +|~+0#4040ff13&| @48 +|X+3#0000000&|u|n|i|x|.|t|x|t| @22|1|,|1| @11|A|l@1 +| +0&&@49 diff --git a/src/testdir/test_display.vim b/src/testdir/test_display.vim --- a/src/testdir/test_display.vim +++ b/src/testdir/test_display.vim @@ -197,3 +197,26 @@ func Test_edit_long_file_name() call delete(longName) endfunc +func Test_unprintable_fileformats() + CheckScreendump + + call writefile(["unix\r", "two"], 'Xunix.txt') + call writefile(["mac\r", "two"], 'Xmac.txt') + let lines =<< trim END + edit Xunix.txt + split Xmac.txt + edit ++ff=mac + END + let filename = 'Xunprintable' + call writefile(lines, filename) + let buf = RunVimInTerminal('-S '.filename, #{rows: 9, cols: 50}) + call VerifyScreenDump(buf, 'Test_display_unprintable_01', {}) + call term_sendkeys(buf, "\\\") + call VerifyScreenDump(buf, 'Test_display_unprintable_02', {}) + + " clean up + call StopVimInTerminal(buf) + call delete('Xunix.txt') + call delete('Xmac.txt') + call delete(filename) +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 943, +/**/ 942, /**/ 941,