From: Bram Moolenaar Date: Thu, 31 Jan 2019 13:27:04 +0000 (+0100) Subject: patch 8.1.0859: "%v" in 'errorformat' does handle multi-byte characters X-Git-Tag: v8.1.0859 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c45eb770a5988734ff2c572e5e2ce307158c33c8;p=vim patch 8.1.0859: "%v" in 'errorformat' does handle multi-byte characters Problem: "%v" in 'errorformat' does handle multi-byte characters. Solution: Handle multi-byte characters. (Yegappan Lakshmanan, closes #3700) --- diff --git a/src/quickfix.c b/src/quickfix.c index e292819f2..3bfa027d6 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -3047,9 +3047,6 @@ qf_jump_goto_line( char_u *qf_pattern) { linenr_T i; - char_u *line; - colnr_T screen_col; - colnr_T char_col; if (qf_pattern == NULL) { @@ -3063,29 +3060,11 @@ qf_jump_goto_line( } 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; - } - } + coladvance(qf_col - 1); + else + curwin->w_cursor.col = qf_col - 1; curwin->w_set_curswant = TRUE; check_cursor(); } diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim index db2a8e6c5..e7aa41ebf 100644 --- a/src/testdir/test_quickfix.vim +++ b/src/testdir/test_quickfix.vim @@ -3843,3 +3843,59 @@ func Test_splitview() 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 diff --git a/src/version.c b/src/version.c index 9422f8426..ed4c1b54d 100644 --- a/src/version.c +++ b/src/version.c @@ -783,6 +783,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 859, /**/ 858, /**/