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\<C-V>jjIx\<Esc>"
- :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 \<C-L>'\<C-B>$put='\<CR>", 'it')
- :"
- :function! CustomComplete2(lead, line, pos)
- : return ['あたし', 'あたま', 'あたりめ']
- :endfunction
- :command -nargs=1 -complete=customlist,CustomComplete2 Test2 echo
- :call feedkeys(":Test2 \<C-L>'\<C-B>$put='\<CR>", 'it')
- :"
- :function! CustomComplete3(lead, line, pos)
- : return ['Nこ', 'Nん', 'Nぶ']
- :endfunction
- :command -nargs=1 -complete=customlist,CustomComplete3 Test3 echo
- :call feedkeys(":Test3 \<C-L>'\<C-B>$put='\<CR>", '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\<C-V>jjIx\<Esc>"
+ 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 \<C-L>\<C-B>\"\<CR>", 'itx')
+ call assert_equal('"Test1 ', getreg(':'))
+
+ command -nargs=1 -complete=customlist,CustomComplete2 Test2 echo
+ call feedkeys(":Test2 \<C-L>\<C-B>\"\<CR>", 'itx')
+ call assert_equal('"Test2 あた', getreg(':'))
+
+ command -nargs=1 -complete=customlist,CustomComplete3 Test3 echo
+ call feedkeys(":Test3 \<C-L>\<C-B>\"\<CR>", '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 -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.