mirror of
https://github.com/neovim/neovim.git
synced 2024-12-24 13:15:09 -07:00
vim-patch:8.1.0859: handle multibyte "%v" in 'errorformat' #11285
Problem: "%v" in 'errorformat' does handle multi-byte characters.
Solution: Handle multi-byte characters. (Yegappan Lakshmanan, closes vim/vim#3700)
c45eb770a5
This commit is contained in:
parent
99aa166cb1
commit
0b771cd9aa
@ -2437,9 +2437,6 @@ static void qf_jump_goto_line(linenr_T qf_lnum, int qf_col, char_u qf_viscol,
|
||||
char_u *qf_pattern)
|
||||
{
|
||||
linenr_T i;
|
||||
char_u *line;
|
||||
colnr_T screen_col;
|
||||
colnr_T char_col;
|
||||
|
||||
if (qf_pattern == NULL) {
|
||||
// Go to line with error, unless qf_lnum is 0.
|
||||
@ -2451,26 +2448,11 @@ static void qf_jump_goto_line(linenr_T qf_lnum, int qf_col, char_u qf_viscol,
|
||||
curwin->w_cursor.lnum = i;
|
||||
}
|
||||
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 = get_cursor_line_ptr();
|
||||
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();
|
||||
|
@ -3643,3 +3643,59 @@ func Test_curswant()
|
||||
call assert_equal(getcurpos()[4], virtcol('.'))
|
||||
cclose | helpclose
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user