summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-01-31 14:27:04 +0100
committerBram Moolenaar <Bram@vim.org>2019-01-31 14:27:04 +0100
commitc45eb770a5988734ff2c572e5e2ce307158c33c8 (patch)
tree59f8558a427adce223171b44a09d385e57d3f93a
parentce655743ba5c56c00769e57e6a6608c0088211ab (diff)
downloadvim-git-8.1.0859.tar.gz
patch 8.1.0859: "%v" in 'errorformat' does handle multi-byte charactersv8.1.0859
Problem: "%v" in 'errorformat' does handle multi-byte characters. Solution: Handle multi-byte characters. (Yegappan Lakshmanan, closes #3700)
-rw-r--r--src/quickfix.c27
-rw-r--r--src/testdir/test_quickfix.vim56
-rw-r--r--src/version.c2
3 files changed, 61 insertions, 24 deletions
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
@@ -784,6 +784,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 859,
+/**/
858,
/**/
857,