To: vim_dev@googlegroups.com Subject: Patch 8.0.0250 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.0250 Problem: When virtcol() gets a column that is not the first byte of a multi-byte character the result is unpredictable. (Christian Ludwig) Solution: Correct the column to the first byte of a multi-byte character. Change the utf-8 test to new style. Files: src/charset.c, src/testdir/test_utf8.in, src/testdir/test_utf8.ok, src/testdir/test_utf8.vim, src/Makefile, src/testdir/Make_all.mak, src/testdir/test_alot_utf8.vim *** ../vim-8.0.0249/src/charset.c 2017-01-22 18:34:53.680030808 +0100 --- src/charset.c 2017-01-28 13:09:08.113016078 +0100 *************** *** 1296,1302 **** --- 1296,1309 ---- if (pos->col == MAXCOL) posptr = NULL; /* continue until the NUL */ else + { posptr = ptr + pos->col; + #ifdef FEAT_MBYTE + if (has_mbyte) + /* always start on the first byte */ + posptr -= (*mb_head_off)(line, posptr); + #endif + } /* * This function is used very often, do some speed optimizations. *** ../vim-8.0.0249/src/testdir/test_utf8.in 2015-11-22 15:04:56.000000000 +0100 --- src/testdir/test_utf8.in 1970-01-01 01:00:00.000000000 +0100 *************** *** 1,46 **** - Tests for Unicode manipulations vim: set ft=vim : - - STARTTEST - :so small.vim - :set encoding=utf-8 - :" - :" Visual block Insert adjusts for multi-byte char - :new - :call setline(1, ["aaa", "あああ", "bbb"]) - :exe ":norm! gg0l\jjIx\" - :let r = getline(1, '$') - :" - :bwipeout! - :$put=r - :" - :" Test for built-in function strchars() - :for str in ["a", "あいa", "A\u20dd", "A\u20dd\u20dd", "\u20dd"] - : $put=strchars(str) - : $put=strchars(str, 0) - : $put=strchars(str, 1) - :endfor - :" - :" Test for customlist completion - :function! CustomComplete1(lead, line, pos) - : return ['あ', 'い'] - :endfunction - :command -nargs=1 -complete=customlist,CustomComplete1 Test1 echo - :call feedkeys(":Test1 \'\$put='\", 'it') - :" - :function! CustomComplete2(lead, line, pos) - : return ['あたし', 'あたま', 'あたりめ'] - :endfunction - :command -nargs=1 -complete=customlist,CustomComplete2 Test2 echo - :call feedkeys(":Test2 \'\$put='\", 'it') - :" - :function! CustomComplete3(lead, line, pos) - : return ['Nこ', 'Nん', 'Nぶ'] - :endfunction - :command -nargs=1 -complete=customlist,CustomComplete3 Test3 echo - :call feedkeys(":Test3 \'\$put='\", 'it') - :" - :call garbagecollect(1) - :/^start:/,$wq! test.out - ENDTEST - - start: --- 0 ---- *** ../vim-8.0.0249/src/testdir/test_utf8.ok 2015-11-19 18:42:47.000000000 +0100 --- src/testdir/test_utf8.ok 1970-01-01 01:00:00.000000000 +0100 *************** *** 1,22 **** - start: - axaa - xあああ - bxbb - 1 - 1 - 1 - 3 - 3 - 3 - 2 - 2 - 1 - 3 - 3 - 1 - 1 - 1 - 1 - Test1 - Test2 あた - Test3 N --- 0 ---- *** ../vim-8.0.0249/src/testdir/test_utf8.vim 2017-01-28 13:46:00.323189782 +0100 --- src/testdir/test_utf8.vim 2017-01-28 13:36:55.086595457 +0100 *************** *** 0 **** --- 1,65 ---- + " Tests for Unicode manipulations + if !has('multi_byte') + finish + endif + + + " Visual block Insert adjusts for multi-byte char + func Test_visual_block_insert() + new + call setline(1, ["aaa", "あああ", "bbb"]) + exe ":norm! gg0l\jjIx\" + call assert_equal(['axaa', 'xあああ', 'bxbb'], getline(1, '$')) + bwipeout! + endfunc + + " Test for built-in function strchars() + func Test_strchars() + let inp = ["a", "あいa", "A\u20dd", "A\u20dd\u20dd", "\u20dd"] + let exp = [[1, 1, 1], [3, 3, 3], [2, 2, 1], [3, 3, 1], [1, 1, 1]] + for i in range(len(inp)) + call assert_equal(exp[i][0], strchars(inp[i])) + call assert_equal(exp[i][1], strchars(inp[i], 0)) + call assert_equal(exp[i][2], strchars(inp[i], 1)) + endfor + endfunc + + " Test for customlist completion + function! CustomComplete1(lead, line, pos) + return ['あ', 'い'] + endfunction + + function! CustomComplete2(lead, line, pos) + return ['あたし', 'あたま', 'あたりめ'] + endfunction + + function! CustomComplete3(lead, line, pos) + return ['Nこ', 'Nん', 'Nぶ'] + endfunction + + func Test_customlist_completion() + command -nargs=1 -complete=customlist,CustomComplete1 Test1 echo + call feedkeys(":Test1 \\\"\", 'itx') + call assert_equal('"Test1 ', getreg(':')) + + command -nargs=1 -complete=customlist,CustomComplete2 Test2 echo + call feedkeys(":Test2 \\\"\", 'itx') + call assert_equal('"Test2 あた', getreg(':')) + + command -nargs=1 -complete=customlist,CustomComplete3 Test3 echo + call feedkeys(":Test3 \\\"\", 'itx') + call assert_equal('"Test3 N', getreg(':')) + + call garbagecollect(1) + endfunc + + " Yank one 3 byte character and check the mark columns. + func Test_getvcol() + new + call setline(1, "x\u2500x") + normal 0lvy + call assert_equal(2, col("'[")) + call assert_equal(4, col("']")) + call assert_equal(2, virtcol("'[")) + call assert_equal(2, virtcol("']")) + endfunc *** ../vim-8.0.0249/src/Makefile 2017-01-24 18:58:14.910505196 +0100 --- src/Makefile 2017-01-28 13:13:36.431338517 +0100 *************** *** 2058,2064 **** test_listlbr \ test_listlbr_utf8 \ test_search_mbyte \ - test_utf8 \ test_wordcount \ test3 test4 test5 test6 test7 test8 test9 \ test11 test12 test14 test15 test17 test18 test19 \ --- 2058,2063 ---- *************** *** 2183,2188 **** --- 2182,2188 ---- test_undo \ test_unlet \ test_usercommands \ + test_utf8 \ test_viminfo \ test_viml \ test_visual \ *** ../vim-8.0.0249/src/testdir/Make_all.mak 2017-01-24 18:58:14.910505196 +0100 --- src/testdir/Make_all.mak 2017-01-28 13:13:49.311257953 +0100 *************** *** 84,90 **** test_listchars.out \ test_listlbr.out \ test_search_mbyte.out \ - test_utf8.out \ test_wordcount.out --- 84,89 ---- *** ../vim-8.0.0249/src/testdir/test_alot_utf8.vim 2016-08-17 21:29:14.000000000 +0200 --- src/testdir/test_alot_utf8.vim 2017-01-28 13:14:29.783004807 +0100 *************** *** 9,11 **** --- 9,12 ---- source test_matchadd_conceal_utf8.vim source test_regexp_utf8.vim source test_source_utf8.vim + source test_utf8.vim *** ../vim-8.0.0249/src/version.c 2017-01-27 22:20:09.539496898 +0100 --- src/version.c 2017-01-28 13:45:18.595450378 +0100 *************** *** 766,767 **** --- 766,769 ---- { /* Add new patch number below this line */ + /**/ + 250, /**/ -- MARTHA'S WAY: Don't throw out all that leftover wine. Freeze into ice cubes for future use in casseroles and sauces. MY WAY: What leftover wine? /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///