summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-06-10 14:16:49 +0200
committerBram Moolenaar <Bram@vim.org>2020-06-10 14:16:49 +0200
commit32ee627750e8b7b3fa6516b893e72f6e6af54710 (patch)
treedfa25269bbbaaf317765ff0ef0b059362c33f920
parent0e390f40e944036fb558a63b91238cfda128d95f (diff)
patch 8.2.0943: displaying ^M or ^J depends on current bufferv8.2.0943
Problem: Displaying ^M or ^J depends on current buffer. Solution: Pass the displayed buffer to transchar(). (closes #6225)
-rw-r--r--src/charset.c64
-rw-r--r--src/drawline.c4
-rw-r--r--src/ex_cmds.c4
-rw-r--r--src/gui_beval.c2
-rw-r--r--src/message.c2
-rw-r--r--src/proto/charset.pro3
-rw-r--r--src/testdir/dumps/Test_display_unprintable_01.dump9
-rw-r--r--src/testdir/dumps/Test_display_unprintable_02.dump9
-rw-r--r--src/testdir/test_display.vim23
-rw-r--r--src/version.c2
10 files changed, 86 insertions, 36 deletions
diff --git a/src/charset.c b/src/charset.c
index 6cf4a2bb13..bf5af37205 100644
--- 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
index 0a5a4bd502..9d65aa43ec 100644
--- 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
index ac55c268a2..2280fcfa06 100644
--- 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
index d3def17c90..57122ffa9a 100644
--- a/src/gui_beval.c
+++ b/src/gui_beval.c
@@ -840,7 +840,7 @@ set_printable_label_text(GtkLabel *label, char_u *text)
}
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
index 45217e2c89..006e648fe1 100644
--- 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
index c582a8cf22..d364b8e49d 100644
--- a/src/proto/charset.pro
+++ b/src/proto/charset.pro
@@ -5,8 +5,9 @@ void trans_characters(char_u *buf, int bufsize);
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
index 0000000000..e4cc0d9c7f
--- /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
index 0000000000..63384658c0
--- /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
index 1093641783..ed111a585e 100644
--- 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, "\<C-W>\<C-W>\<C-L>")
+ 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
index 570ea1046e..251a0aa581 100644
--- 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,