Mercurial > vim
changeset 15504:247511eadb7a v8.1.0760
patch 8.1.0760: no proper test for using 'termencoding'
commit https://github.com/vim/vim/commit/617d7ef0462e86ec946d8932e4d157e65bbc9aa8
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Jan 17 13:04:30 2019 +0100
patch 8.1.0760: no proper test for using 'termencoding'
Problem: No proper test for using 'termencoding'.
Solution: Add a screendump test. Fix using double width characters in a
screendump.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 17 Jan 2019 13:15:07 +0100 |
parents | 65eb414db805 |
children | 181490db95f9 |
files | src/terminal.c src/testdir/Make_all.mak src/testdir/dumps/Test_tenc_euc_jp_01.dump src/testdir/test_termencoding.vim src/version.c |
diffstat | 5 files changed, 110 insertions(+), 53 deletions(-) [+] |
line wrap: on
line diff
--- a/src/terminal.c +++ b/src/terminal.c @@ -4031,7 +4031,6 @@ f_term_dumpwrite(typval_T *argvars, typv if (cell.width == 2) { fputs("*", fd); - ++pos.col; } else fputs("+", fd); @@ -4062,6 +4061,9 @@ f_term_dumpwrite(typval_T *argvars, typv prev_cell = cell; } + + if (cell.width == 2) + ++pos.col; } if (repeat > 0) fprintf(fd, "@%d", repeat); @@ -4103,6 +4105,7 @@ read_dump_file(FILE *fd, VTermPos *curso char_u *prev_char = NULL; int attr = 0; cellattr_T cell; + cellattr_T empty_cell; term_T *term = curbuf->b_term; int max_cells = 0; int start_row = term->tl_scrollback.ga_len; @@ -4110,6 +4113,7 @@ read_dump_file(FILE *fd, VTermPos *curso ga_init2(&ga_text, 1, 90); ga_init2(&ga_cell, sizeof(cellattr_T), 90); vim_memset(&cell, 0, sizeof(cell)); + vim_memset(&empty_cell, 0, sizeof(empty_cell)); cursor_pos->row = -1; cursor_pos->col = -1; @@ -4208,66 +4212,68 @@ read_dump_file(FILE *fd, VTermPos *curso c = fgetc(fd); } hl2vtermAttr(attr, &cell); + + /* is_bg == 0: fg, is_bg == 1: bg */ + for (is_bg = 0; is_bg <= 1; ++is_bg) + { + if (c == '&') + { + /* use same color as previous cell */ + c = fgetc(fd); + } + else if (c == '#') + { + int red, green, blue, index = 0; + + c = fgetc(fd); + red = hex2nr(c); + c = fgetc(fd); + red = (red << 4) + hex2nr(c); + c = fgetc(fd); + green = hex2nr(c); + c = fgetc(fd); + green = (green << 4) + hex2nr(c); + c = fgetc(fd); + blue = hex2nr(c); + c = fgetc(fd); + blue = (blue << 4) + hex2nr(c); + c = fgetc(fd); + if (!isdigit(c)) + dump_is_corrupt(&ga_text); + while (isdigit(c)) + { + index = index * 10 + (c - '0'); + c = fgetc(fd); + } + + if (is_bg) + { + cell.bg.red = red; + cell.bg.green = green; + cell.bg.blue = blue; + cell.bg.ansi_index = index; + } + else + { + cell.fg.red = red; + cell.fg.green = green; + cell.fg.blue = blue; + cell.fg.ansi_index = index; + } + } + else + dump_is_corrupt(&ga_text); + } } else dump_is_corrupt(&ga_text); - - /* is_bg == 0: fg, is_bg == 1: bg */ - for (is_bg = 0; is_bg <= 1; ++is_bg) - { - if (c == '&') - { - /* use same color as previous cell */ - c = fgetc(fd); - } - else if (c == '#') - { - int red, green, blue, index = 0; - - c = fgetc(fd); - red = hex2nr(c); - c = fgetc(fd); - red = (red << 4) + hex2nr(c); - c = fgetc(fd); - green = hex2nr(c); - c = fgetc(fd); - green = (green << 4) + hex2nr(c); - c = fgetc(fd); - blue = hex2nr(c); - c = fgetc(fd); - blue = (blue << 4) + hex2nr(c); - c = fgetc(fd); - if (!isdigit(c)) - dump_is_corrupt(&ga_text); - while (isdigit(c)) - { - index = index * 10 + (c - '0'); - c = fgetc(fd); - } - - if (is_bg) - { - cell.bg.red = red; - cell.bg.green = green; - cell.bg.blue = blue; - cell.bg.ansi_index = index; - } - else - { - cell.fg.red = red; - cell.fg.green = green; - cell.fg.blue = blue; - cell.fg.ansi_index = index; - } - } - else - dump_is_corrupt(&ga_text); - } } else dump_is_corrupt(&ga_text); append_cell(&ga_cell, &cell); + if (cell.width == 2) + append_cell(&ga_cell, &empty_cell); } else if (c == '@') {
--- a/src/testdir/Make_all.mak +++ b/src/testdir/Make_all.mak @@ -243,6 +243,7 @@ NEW_TESTS = \ test_tagjump \ test_taglist \ test_tcl \ + test_termencoding \ test_terminal \ test_terminal_fail \ test_textformat \ @@ -389,6 +390,7 @@ NEW_TESTS_RES = \ test_system.res \ test_tab.res \ test_tcl.res \ + test_termencoding.res \ test_terminal.res \ test_terminal_fail.res \ test_textformat.res \
new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_tenc_euc_jp_01.dump @@ -0,0 +1,10 @@ +>E+0&#ffffff0|8|9|:| |バ*&|ッ|フ|ァ| +&|%|l|d| |の*&|変|更|は|保|存|さ|れ|て|い|ま|せ|ん| +&|(|!| |で*&|変|更|を|破|棄|)+&| @13 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|X+3#0000000&|e|u|c|_|j|p|.|t|x|t| @45|1|,|1| @11|A|l@1 +|E+0&&|8|3|:| |バ*&|ッ|フ|ァ|を|作|成|で|き|な|い|の|で|、|他|の|を|使|用|し|ま|す|.+&@2| @22 +|~+0#4040ff13&| @73 +|~| @73 +|[+1#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|5|2| @10|A|l@1 +| +0&&@74
new file mode 100644 --- /dev/null +++ b/src/testdir/test_termencoding.vim @@ -0,0 +1,37 @@ +" Test for setting 'encoding' to something else than the terminal uses, then +" setting 'termencoding' to make it work. + +" This only works with "iconv". +if !has('multi_byte') || !has('iconv') + finish +endif + +source screendump.vim +if !CanRunVimInTerminal() + finish +endif + +" This Vim is running with 'encoding' "utf-8", the Vim in the terminal is +" running with 'encoding' "euc-jp". We need to make sure the text is in the +" right encoding, this is a bit tricky. +func Test_termencoding_euc_jp() + new + call setline(1, 'E89: バッファ %ld の変更は保存されていません (! で変更を破棄)') + write ++enc=euc-jp Xeuc_jp.txt + quit + + call writefile([ + \ 'set encoding=euc-jp', + \ 'set termencoding=utf-8', + \ 'scriptencoding utf-8', + \ 'exe "normal aE83: バッファを作成できないので、他のを使用します...\<Esc>"', + \ 'split Xeuc_jp.txt', + \ ], 'XTest_tenc_euc_jp') + let buf = RunVimInTerminal('-S XTest_tenc_euc_jp', {'rows': 10}) + call VerifyScreenDump(buf, 'Test_tenc_euc_jp_01', {}) + + " clean up + call StopVimInTerminal(buf) + call delete('Xeuc_jp.txt') + call delete('XTest_tenc_euc_jp') +endfunc