Patch 8.1.0859
Problem:    "%v" in 'errorformat' does handle multi-byte characters.
Solution:   Handle multi-byte characters. (Yegappan Lakshmanan, closes #3700)
Files:      src/quickfix.c, src/testdir/test_quickfix.vim


*** ../vim-8.1.0858/src/quickfix.c      2019-01-26 17:43:16.226527267 +0100
--- src/quickfix.c      2019-01-31 14:24:27.575216468 +0100
***************
*** 3047,3055 ****
        char_u          *qf_pattern)
  {
      linenr_T          i;
-     char_u            *line;
-     colnr_T           screen_col;
-     colnr_T           char_col;
  
      if (qf_pattern == NULL)
      {
--- 3047,3052 ----
***************
*** 3063,3091 ****
        }
        if (qf_col > 0)
        {
-           curwin->w_cursor.col = qf_col - 1;
            curwin->w_cursor.coladd = 0;
            if (qf_viscol == TRUE)
!           {
!               // Check each character from the beginning of the error
!               // line up to the error column.  For each tab character
!               // found, reduce the error column value by the length of
!               // a tab character.
!               line = ml_get_curline();
!               screen_col = 0;
!               for (char_col = 0; char_col < curwin->w_cursor.col; ++char_col)
!               {
!                   if (*line == NUL)
!                       break;
!                   if (*line++ == '\t')
!                   {
!                       curwin->w_cursor.col -= 7 - (screen_col % 8);
!                       screen_col += 8 - (screen_col % 8);
!                   }
!                   else
!                       ++screen_col;
!               }
!           }
            curwin->w_set_curswant = TRUE;
            check_cursor();
        }
--- 3060,3070 ----
        }
        if (qf_col > 0)
        {
            curwin->w_cursor.coladd = 0;
            if (qf_viscol == TRUE)
!               coladvance(qf_col - 1);
!           else
!               curwin->w_cursor.col = qf_col - 1;
            curwin->w_set_curswant = TRUE;
            check_cursor();
        }
*** ../vim-8.1.0858/src/testdir/test_quickfix.vim       2019-01-11 
14:49:25.380107431 +0100
--- src/testdir/test_quickfix.vim       2019-01-31 14:26:43.042269859 +0100
***************
*** 3843,3845 ****
--- 3843,3901 ----
    call delete('Xtestfile1')
    call delete('Xtestfile2')
  endfunc
+ 
+ " Test for parsing entries using visual screen column
+ func Test_viscol()
+   enew
+   call writefile(["Col1\tCol2\tCol3"], 'Xfile1')
+   edit Xfile1
+ 
+   " Use byte offset for column number
+   set efm&
+   cexpr "Xfile1:1:5:XX\nXfile1:1:9:YY\nXfile1:1:20:ZZ"
+   call assert_equal([5, 8], [col('.'), virtcol('.')])
+   cnext
+   call assert_equal([9, 12], [col('.'), virtcol('.')])
+   cnext
+   call assert_equal([14, 20], [col('.'), virtcol('.')])
+ 
+   " Use screen column offset for column number
+   set efm=%f:%l:%v:%m
+   cexpr "Xfile1:1:8:XX\nXfile1:1:12:YY\nXfile1:1:20:ZZ"
+   call assert_equal([5, 8], [col('.'), virtcol('.')])
+   cnext
+   call assert_equal([9, 12], [col('.'), virtcol('.')])
+   cnext
+   call assert_equal([14, 20], [col('.'), virtcol('.')])
+   cexpr "Xfile1:1:6:XX\nXfile1:1:15:YY\nXfile1:1:24:ZZ"
+   call assert_equal([5, 8], [col('.'), virtcol('.')])
+   cnext
+   call assert_equal([10, 16], [col('.'), virtcol('.')])
+   cnext
+   call assert_equal([14, 20], [col('.'), virtcol('.')])
+ 
+   enew
+   call writefile(["Col1\täü\töß\tCol4"], 'Xfile1')
+ 
+   " Use byte offset for column number
+   set efm&
+   cexpr "Xfile1:1:8:XX\nXfile1:1:11:YY\nXfile1:1:16:ZZ"
+   call assert_equal([8, 10], [col('.'), virtcol('.')])
+   cnext
+   call assert_equal([11, 17], [col('.'), virtcol('.')])
+   cnext
+   call assert_equal([16, 25], [col('.'), virtcol('.')])
+ 
+   " Use screen column offset for column number
+   set efm=%f:%l:%v:%m
+   cexpr "Xfile1:1:10:XX\nXfile1:1:17:YY\nXfile1:1:25:ZZ"
+   call assert_equal([8, 10], [col('.'), virtcol('.')])
+   cnext
+   call assert_equal([11, 17], [col('.'), virtcol('.')])
+   cnext
+   call assert_equal([16, 25], [col('.'), virtcol('.')])
+ 
+   enew | only
+   set efm&
+   call delete('Xfile1')
+ endfunc
*** ../vim-8.1.0858/src/version.c       2019-01-31 14:12:52.760076333 +0100
--- src/version.c       2019-01-31 14:22:32.848018305 +0100
***************
*** 785,786 ****
--- 785,788 ----
  {   /* Add new patch number below this line */
+ /**/
+     859,
  /**/

-- 
There are 10 kinds of people: Those who understand binary and those who don't.

 /// 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.

Raspunde prin e-mail lui