mirror of
https://github.com/vim/vim.git
synced 2025-09-26 04:04:07 -04:00
patch 8.0.0250: virtcol() does not work well for multi-byte characters
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.
This commit is contained in:
@@ -2058,7 +2058,6 @@ test1 \
|
|||||||
test_listlbr \
|
test_listlbr \
|
||||||
test_listlbr_utf8 \
|
test_listlbr_utf8 \
|
||||||
test_search_mbyte \
|
test_search_mbyte \
|
||||||
test_utf8 \
|
|
||||||
test_wordcount \
|
test_wordcount \
|
||||||
test3 test4 test5 test6 test7 test8 test9 \
|
test3 test4 test5 test6 test7 test8 test9 \
|
||||||
test11 test12 test14 test15 test17 test18 test19 \
|
test11 test12 test14 test15 test17 test18 test19 \
|
||||||
@@ -2183,6 +2182,7 @@ test_arglist \
|
|||||||
test_undo \
|
test_undo \
|
||||||
test_unlet \
|
test_unlet \
|
||||||
test_usercommands \
|
test_usercommands \
|
||||||
|
test_utf8 \
|
||||||
test_viminfo \
|
test_viminfo \
|
||||||
test_viml \
|
test_viml \
|
||||||
test_visual \
|
test_visual \
|
||||||
|
@@ -1296,7 +1296,14 @@ getvcol(
|
|||||||
if (pos->col == MAXCOL)
|
if (pos->col == MAXCOL)
|
||||||
posptr = NULL; /* continue until the NUL */
|
posptr = NULL; /* continue until the NUL */
|
||||||
else
|
else
|
||||||
|
{
|
||||||
posptr = ptr + pos->col;
|
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.
|
* This function is used very often, do some speed optimizations.
|
||||||
|
@@ -84,7 +84,6 @@ SCRIPTS_ALL = \
|
|||||||
test_listchars.out \
|
test_listchars.out \
|
||||||
test_listlbr.out \
|
test_listlbr.out \
|
||||||
test_search_mbyte.out \
|
test_search_mbyte.out \
|
||||||
test_utf8.out \
|
|
||||||
test_wordcount.out
|
test_wordcount.out
|
||||||
|
|
||||||
|
|
||||||
|
@@ -9,3 +9,4 @@ source test_expr_utf8.vim
|
|||||||
source test_matchadd_conceal_utf8.vim
|
source test_matchadd_conceal_utf8.vim
|
||||||
source test_regexp_utf8.vim
|
source test_regexp_utf8.vim
|
||||||
source test_source_utf8.vim
|
source test_source_utf8.vim
|
||||||
|
source test_utf8.vim
|
||||||
|
@@ -1,46 +0,0 @@
|
|||||||
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:
|
|
@@ -1,22 +0,0 @@
|
|||||||
start:
|
|
||||||
axaa
|
|
||||||
xあああ
|
|
||||||
bxbb
|
|
||||||
1
|
|
||||||
1
|
|
||||||
1
|
|
||||||
3
|
|
||||||
3
|
|
||||||
3
|
|
||||||
2
|
|
||||||
2
|
|
||||||
1
|
|
||||||
3
|
|
||||||
3
|
|
||||||
1
|
|
||||||
1
|
|
||||||
1
|
|
||||||
1
|
|
||||||
Test1
|
|
||||||
Test2 あた
|
|
||||||
Test3 N
|
|
65
src/testdir/test_utf8.vim
Normal file
65
src/testdir/test_utf8.vim
Normal file
@@ -0,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
|
@@ -764,6 +764,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
250,
|
||||||
/**/
|
/**/
|
||||||
249,
|
249,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user