]> granicus.if.org Git - vim/commitdiff
patch 8.0.0250: virtcol() does not work well for multi-byte characters v8.0.0250
authorBram Moolenaar <Bram@vim.org>
Sat, 28 Jan 2017 12:48:10 +0000 (13:48 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 28 Jan 2017 12:48:10 +0000 (13:48 +0100)
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.

src/Makefile
src/charset.c
src/testdir/Make_all.mak
src/testdir/test_alot_utf8.vim
src/testdir/test_utf8.in [deleted file]
src/testdir/test_utf8.ok [deleted file]
src/testdir/test_utf8.vim [new file with mode: 0644]
src/version.c

index a588219946d446e67b2a46580519da41dd497768..f993c852817f9a0fc7832a8687fcfd8e2f0f97ab 100644 (file)
@@ -2058,7 +2058,6 @@ test1 \
        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 \
@@ -2183,6 +2182,7 @@ test_arglist \
        test_undo \
        test_unlet \
        test_usercommands \
+       test_utf8 \
        test_viminfo \
        test_viml \
        test_visual \
index c047afec7ff4c0749a619ec181b3d295e5281caf..e766fa5f6b58eaa96a73782fa0a0bd85dc463484 100644 (file)
@@ -1296,7 +1296,14 @@ getvcol(
     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.
index 613b86804e127c3c08154200c1beb03c7f30241d..c3db6fe3032706f0a92ac8d7d3efa9b8588da015 100644 (file)
@@ -84,7 +84,6 @@ SCRIPTS_ALL = \
        test_listchars.out \
        test_listlbr.out \
        test_search_mbyte.out \
-       test_utf8.out \
        test_wordcount.out
 
 
index 539e0e1e43843af55858a0ec3afed870d967ec49..90b2aab467f55f6faac5cd68424d1c3a4909da81 100644 (file)
@@ -9,3 +9,4 @@ source test_expr_utf8.vim
 source test_matchadd_conceal_utf8.vim
 source test_regexp_utf8.vim
 source test_source_utf8.vim
+source test_utf8.vim
diff --git a/src/testdir/test_utf8.in b/src/testdir/test_utf8.in
deleted file mode 100644 (file)
index 1d6a7a4..0000000
+++ /dev/null
@@ -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:
diff --git a/src/testdir/test_utf8.ok b/src/testdir/test_utf8.ok
deleted file mode 100644 (file)
index c655922..0000000
+++ /dev/null
@@ -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
diff --git a/src/testdir/test_utf8.vim b/src/testdir/test_utf8.vim
new file mode 100644 (file)
index 0000000..24e3db8
--- /dev/null
@@ -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
index b543b273a0b37dd0167d93714927b11246e6466e..94b47bb813f84968fcfcb8fd0c1d62f6b74119ac 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    250,
 /**/
     249,
 /**/