vim-patch:8.2.3019: location list only has the start position.

Problem:    Location list only has the start position.
Solution:   Make it possible to add an end position. (Shane-XB-Qian,
            closes vim/vim#8393)
6864efa596

N/A patches for version.c:

vim-patch:8.2.3002: Vim doesn't abort on a fatal Tcl error

Problem:    Vim doesn't abort on a fatal Tcl error.
Solution:   Change emsg() to iemsg(). (Dominique Pellé, closes vim/vim#8383)
affd0bc626

vim-patch:8.2.3030: Coverity reports a memory leak

Problem:    Coverity reports a memory leak.
Solution:   Fix the leak and a few typos. (Dominique Pellé, closes vim/vim#8418)
cb54bc6562

Patch v8.2.3022 is mostly N/A but cannot be included here
because of new feature check for "has()".

vim-patch:8.2.3032: build problems with MSVC, other crypt issues with libsodium

Problem:    Build problems with MSVC, other crypt issues with libsodium.
Solution:   Adjust MSVC makefile. Disable swap file only when 'key' is set.
            Adjust error message used when key is wrong.  Fix Coverity issues.
            (Christian Brabandt, closes vim/vim#8420, closes vim/vim#8411)
226b28b961

vim-patch:8.2.3044: Amiga MorphOS and AROS: process ID is not valid

Problem:    Amiga MorphOS and AROS: process ID is not valid.
Solution:   Use FindTask to return something which is unique to all processes.
            (Ola Söder, closes vim/vim#8444)
3a62b14077

vim-patch:8.2.3046: Amiga MorphOS: Term mode is set using DOS packets

Problem:    Amiga MorphOS: Term mode is set using DOS packets.
Solution:   Use the same way of setting term mdoe on all next gen Amiga-like
            systems.  (Ola Söder, closes vim/vim#8445)
b420ac9d20
This commit is contained in:
Jan Edmund Lazo
2021-07-31 13:10:44 -04:00
parent 5f01714b25
commit 59e96717d2
4 changed files with 115 additions and 39 deletions

View File

@@ -4759,7 +4759,10 @@ getqflist([{what}]) *getqflist()*
bufname() to get the name bufname() to get the name
module module name module module name
lnum line number in the buffer (first line is 1) lnum line number in the buffer (first line is 1)
end_lnum
end of line number if the item is multiline
col column number (first column is 1) col column number (first column is 1)
end_col end of column number if the item has range
vcol |TRUE|: "col" is visual column vcol |TRUE|: "col" is visual column
|FALSE|: "col" is byte index |FALSE|: "col" is byte index
nr error number nr error number

View File

@@ -54,20 +54,23 @@ struct dir_stack_T {
// For each error the next struct is allocated and linked in a list. // For each error the next struct is allocated and linked in a list.
typedef struct qfline_S qfline_T; typedef struct qfline_S qfline_T;
struct qfline_S { struct qfline_S {
qfline_T *qf_next; ///< pointer to next error in the list qfline_T *qf_next; ///< pointer to next error in the list
qfline_T *qf_prev; ///< pointer to previous error in the list qfline_T *qf_prev; ///< pointer to previous error in the list
linenr_T qf_lnum; ///< line number where the error occurred linenr_T qf_lnum; ///< line number where the error occurred
int qf_fnum; ///< file number for the line linenr_T qf_end_lnum; ///< line number when the error has range or zero
int qf_col; ///< column where the error occurred
int qf_nr; ///< error number int qf_fnum; ///< file number for the line
char_u *qf_module; ///< module name for this error int qf_col; ///< column where the error occurred
char_u *qf_pattern; ///< search pattern for the error int qf_end_col; ///< column when the error has range or zero
char_u *qf_text; ///< description of the error int qf_nr; ///< error number
char_u qf_viscol; ///< set to TRUE if qf_col is screen column char_u *qf_module; ///< module name for this error
char_u qf_cleared; ///< set to TRUE if line has been deleted char_u *qf_pattern; ///< search pattern for the error
char_u qf_type; ///< type of the error (mostly 'E'); 1 for char_u *qf_text; ///< description of the error
// :helpgrep char_u qf_viscol; ///< set to TRUE if qf_col and qf_end_col is
char_u qf_valid; ///< valid error message detected // screen column
char_u qf_cleared; ///< set to TRUE if line has been deleted
char_u qf_type; ///< type of the error (mostly 'E'); 1 for :helpgrep
char_u qf_valid; ///< valid error message detected
}; };
// There is a stack of error lists. // There is a stack of error lists.
@@ -197,7 +200,9 @@ typedef struct {
char_u *errmsg; char_u *errmsg;
size_t errmsglen; size_t errmsglen;
long lnum; long lnum;
long end_lnum;
int col; int col;
int end_col;
bool use_viscol; bool use_viscol;
char_u *pattern; char_u *pattern;
int enr; int enr;
@@ -282,7 +287,9 @@ static int qf_init_process_nextline(qf_list_T *qfl,
0, 0,
fields->errmsg, fields->errmsg,
fields->lnum, fields->lnum,
fields->end_lnum,
fields->col, fields->col,
fields->end_col,
fields->use_viscol, fields->use_viscol,
fields->pattern, fields->pattern,
fields->enr, fields->enr,
@@ -1561,7 +1568,9 @@ static int qf_parse_get_fields(char_u *linebuf, size_t linelen, efm_T *fmt_ptr,
fields->errmsg[0] = NUL; fields->errmsg[0] = NUL;
} }
fields->lnum = 0; fields->lnum = 0;
fields->end_lnum = 0;
fields->col = 0; fields->col = 0;
fields->end_col = 0;
fields->use_viscol = false; fields->use_viscol = false;
fields->enr = -1; fields->enr = -1;
fields->type = 0; fields->type = 0;
@@ -1799,7 +1808,9 @@ void check_quickfix_busy(void)
/// @param bufnum buffer number or zero /// @param bufnum buffer number or zero
/// @param mesg message /// @param mesg message
/// @param lnum line number /// @param lnum line number
/// @param end_lnum line number for end
/// @param col column /// @param col column
/// @param end_col column for end
/// @param vis_col using visual column /// @param vis_col using visual column
/// @param pattern search pattern /// @param pattern search pattern
/// @param nr error number /// @param nr error number
@@ -1808,8 +1819,9 @@ void check_quickfix_busy(void)
/// ///
/// @returns QF_OK or QF_FAIL. /// @returns QF_OK or QF_FAIL.
static int qf_add_entry(qf_list_T *qfl, char_u *dir, char_u *fname, static int qf_add_entry(qf_list_T *qfl, char_u *dir, char_u *fname,
char_u *module, int bufnum, char_u *mesg, long lnum, char_u *module, int bufnum, char_u *mesg,
int col, char_u vis_col, char_u *pattern, int nr, long lnum, long end_lnum, int col, int end_col,
char_u vis_col, char_u *pattern, int nr,
char_u type, char_u valid) char_u type, char_u valid)
{ {
qfline_T *qfp = xmalloc(sizeof(qfline_T)); qfline_T *qfp = xmalloc(sizeof(qfline_T));
@@ -1828,7 +1840,9 @@ static int qf_add_entry(qf_list_T *qfl, char_u *dir, char_u *fname,
} }
qfp->qf_text = vim_strsave(mesg); qfp->qf_text = vim_strsave(mesg);
qfp->qf_lnum = lnum; qfp->qf_lnum = lnum;
qfp->qf_end_lnum = end_lnum;
qfp->qf_col = col; qfp->qf_col = col;
qfp->qf_end_col = end_col;
qfp->qf_viscol = vis_col; qfp->qf_viscol = vis_col;
if (pattern == NULL || *pattern == NUL) { if (pattern == NULL || *pattern == NUL) {
qfp->qf_pattern = NULL; qfp->qf_pattern = NULL;
@@ -1957,7 +1971,9 @@ static int copy_loclist_entries(const qf_list_T *from_qfl, qf_list_T *to_qfl)
0, 0,
from_qfp->qf_text, from_qfp->qf_text,
from_qfp->qf_lnum, from_qfp->qf_lnum,
from_qfp->qf_end_lnum,
from_qfp->qf_col, from_qfp->qf_col,
from_qfp->qf_end_col,
from_qfp->qf_viscol, from_qfp->qf_viscol,
from_qfp->qf_pattern, from_qfp->qf_pattern,
from_qfp->qf_nr, from_qfp->qf_nr,
@@ -3108,11 +3124,8 @@ static void qf_list_entry(qfline_T *qfp, int qf_idx, bool cursel)
} }
if (qfp->qf_lnum == 0) { if (qfp->qf_lnum == 0) {
IObuff[0] = NUL; IObuff[0] = NUL;
} else if (qfp->qf_col == 0) {
vim_snprintf((char *)IObuff, IOSIZE, "%" PRIdLINENR, qfp->qf_lnum);
} else { } else {
vim_snprintf((char *)IObuff, IOSIZE, "%" PRIdLINENR " col %d", qf_range_text(qfp, IObuff, IOSIZE);
qfp->qf_lnum, qfp->qf_col);
} }
vim_snprintf((char *)IObuff + STRLEN(IObuff), IOSIZE, "%s", vim_snprintf((char *)IObuff + STRLEN(IObuff), IOSIZE, "%s",
(char *)qf_types(qfp->qf_type, qfp->qf_nr)); (char *)qf_types(qfp->qf_type, qfp->qf_nr));
@@ -3232,6 +3245,32 @@ static void qf_fmt_text(const char_u *restrict text, char_u *restrict buf,
buf[i] = NUL; buf[i] = NUL;
} }
// Range information from lnum, col, end_lnum, and end_col.
// Put the result in "buf[bufsize]".
static void qf_range_text(const qfline_T *qfp, char_u *buf, int bufsize)
{
vim_snprintf((char *)buf, (size_t)bufsize, "%" PRIdLINENR, qfp->qf_lnum);
int len = (int)STRLEN(buf);
if (qfp->qf_end_lnum > 0 && qfp->qf_lnum != qfp->qf_end_lnum) {
vim_snprintf((char *)buf + len, (size_t)(bufsize - len),
"-%" PRIdLINENR, qfp->qf_end_lnum);
len += (int)STRLEN(buf + len);
}
if (qfp->qf_col > 0) {
vim_snprintf((char *)buf + len, (size_t)(bufsize - len),
" col %d", qfp->qf_col);
len += (int)STRLEN(buf + len);
if (qfp->qf_end_col > 0 && qfp->qf_col != qfp->qf_end_col) {
vim_snprintf((char *)buf + len, (size_t)(bufsize - len),
"-%d", qfp->qf_end_col);
len += (int)STRLEN(buf + len);
}
}
buf[len] = NUL;
}
/// Display information (list number, list size and the title) about a /// Display information (list number, list size and the title) about a
/// quickfix/location list. /// quickfix/location list.
static void qf_msg(qf_info_T *qi, int which, char *lead) static void qf_msg(qf_info_T *qi, int which, char *lead)
@@ -4005,16 +4044,9 @@ static int qf_buf_add_line(qf_list_T *qfl, buf_T *buf, linenr_T lnum,
IObuff[len++] = '|'; IObuff[len++] = '|';
} }
if (qfp->qf_lnum > 0) { if (qfp->qf_lnum > 0) {
snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), "%" PRId64, qf_range_text(qfp, IObuff + len, IOSIZE - len);
(int64_t)qfp->qf_lnum);
len += (int)STRLEN(IObuff + len); len += (int)STRLEN(IObuff + len);
if (qfp->qf_col > 0) {
snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), " col %d",
qfp->qf_col);
len += (int)STRLEN(IObuff + len);
}
snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), "%s", snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), "%s",
(char *)qf_types(qfp->qf_type, qfp->qf_nr)); (char *)qf_types(qfp->qf_type, qfp->qf_nr));
len += (int)STRLEN(IObuff + len); len += (int)STRLEN(IObuff + len);
@@ -5263,7 +5295,9 @@ static bool vgr_match_buflines(qf_list_T *qfl, char_u *fname, buf_T *buf,
ml_get_buf(buf, regmatch->startpos[0].lnum + lnum, ml_get_buf(buf, regmatch->startpos[0].lnum + lnum,
false), false),
regmatch->startpos[0].lnum + lnum, regmatch->startpos[0].lnum + lnum,
regmatch->endpos[0].lnum + lnum,
regmatch->startpos[0].col + 1, regmatch->startpos[0].col + 1,
regmatch->endpos[0].col + 1,
false, // vis_col false, // vis_col
NULL, // search pattern NULL, // search pattern
0, // nr 0, // nr
@@ -5765,7 +5799,11 @@ static int get_qfline_items(qfline_T *qfp, list_T *list)
if (tv_dict_add_nr(dict, S_LEN("bufnr"), (varnumber_T)bufnum) == FAIL if (tv_dict_add_nr(dict, S_LEN("bufnr"), (varnumber_T)bufnum) == FAIL
|| (tv_dict_add_nr(dict, S_LEN("lnum"), (varnumber_T)qfp->qf_lnum) || (tv_dict_add_nr(dict, S_LEN("lnum"), (varnumber_T)qfp->qf_lnum)
== FAIL) == FAIL)
|| (tv_dict_add_nr(dict, S_LEN("end_lnum"), (varnumber_T)qfp->qf_end_lnum)
== FAIL)
|| (tv_dict_add_nr(dict, S_LEN("col"), (varnumber_T)qfp->qf_col) == FAIL) || (tv_dict_add_nr(dict, S_LEN("col"), (varnumber_T)qfp->qf_col) == FAIL)
|| (tv_dict_add_nr(dict, S_LEN("end_col"), (varnumber_T)qfp->qf_end_col)
== FAIL)
|| (tv_dict_add_nr(dict, S_LEN("vcol"), (varnumber_T)qfp->qf_viscol) || (tv_dict_add_nr(dict, S_LEN("vcol"), (varnumber_T)qfp->qf_viscol)
== FAIL) == FAIL)
|| (tv_dict_add_nr(dict, S_LEN("nr"), (varnumber_T)qfp->qf_nr) == FAIL) || (tv_dict_add_nr(dict, S_LEN("nr"), (varnumber_T)qfp->qf_nr) == FAIL)
@@ -6263,7 +6301,9 @@ static int qf_add_entry_from_dict(
char *const module = tv_dict_get_string(d, "module", true); char *const module = tv_dict_get_string(d, "module", true);
int bufnum = (int)tv_dict_get_number(d, "bufnr"); int bufnum = (int)tv_dict_get_number(d, "bufnr");
const long lnum = (long)tv_dict_get_number(d, "lnum"); const long lnum = (long)tv_dict_get_number(d, "lnum");
const long end_lnum = (long)tv_dict_get_number(d, "end_lnum");
const int col = (int)tv_dict_get_number(d, "col"); const int col = (int)tv_dict_get_number(d, "col");
const int end_col = (int)tv_dict_get_number(d, "end_col");
const char_u vcol = (char_u)tv_dict_get_number(d, "vcol"); const char_u vcol = (char_u)tv_dict_get_number(d, "vcol");
const int nr = (int)tv_dict_get_number(d, "nr"); const int nr = (int)tv_dict_get_number(d, "nr");
const char *const type = tv_dict_get_string(d, "type", false); const char *const type = tv_dict_get_string(d, "type", false);
@@ -6301,7 +6341,9 @@ static int qf_add_entry_from_dict(
bufnum, bufnum,
(char_u *)text, (char_u *)text,
lnum, lnum,
end_lnum,
col, col,
end_col,
vcol, // vis_col vcol, // vis_col
(char_u *)pattern, // search pattern (char_u *)pattern, // search pattern
nr, nr,
@@ -7035,7 +7077,10 @@ static void hgr_search_file(
0, 0,
line, line,
lnum, lnum,
0,
(int)(p_regmatch->startp[0] - line) + 1, // col (int)(p_regmatch->startp[0] - line) + 1, // col
(int)(p_regmatch->endp[0] - line)
+ 1, // end_col
false, // vis_col false, // vis_col
NULL, // search pattern NULL, // search pattern
0, // nr 0, // nr

View File

@@ -134,6 +134,21 @@ func XlistTests(cchar)
call assert_equal([' 2 Xtestfile1:1 col 3: Line1', call assert_equal([' 2 Xtestfile1:1 col 3: Line1',
\ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l) \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2'], l)
" Ranged entries
call g:Xsetlist([{'lnum':10,'text':'Line1'},
\ {'lnum':20,'col':10,'text':'Line2'},
\ {'lnum':30,'col':15,'end_col':20,'text':'Line3'},
\ {'lnum':40,'end_lnum':45,'text':'Line4'},
\ {'lnum':50,'end_lnum':55,'col':15,'text':'Line5'},
\ {'lnum':60,'end_lnum':65,'col':25,'end_col':35,'text':'Line6'}])
let l = split(execute('Xlist', ""), "\n")
call assert_equal([' 1:10: Line1',
\ ' 2:20 col 10: Line2',
\ ' 3:30 col 15-20: Line3',
\ ' 4:40-45: Line4',
\ ' 5:50-55 col 15: Line5',
\ ' 6:60-65 col 25-35: Line6'], l)
" Different types of errors " Different types of errors
call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11}, call g:Xsetlist([{'lnum':10,'col':5,'type':'W', 'text':'Warning','nr':11},
\ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22}, \ {'lnum':20,'col':10,'type':'e','text':'Error','nr':22},
@@ -599,6 +614,7 @@ func s:test_xhelpgrep(cchar)
call assert_true(&buftype == 'help') call assert_true(&buftype == 'help')
call assert_true(winnr() == 1) call assert_true(winnr() == 1)
call assert_true(winnr('$') == 2) call assert_true(winnr('$') == 2)
call assert_match('|\d\+ col \d\+-\d\+|', getbufline(winbufnr(2), 1)[0])
" This wipes out the buffer, make sure that doesn't cause trouble. " This wipes out the buffer, make sure that doesn't cause trouble.
Xclose Xclose
@@ -1437,10 +1453,13 @@ func SetXlistTests(cchar, bnum)
call s:setup_commands(a:cchar) call s:setup_commands(a:cchar)
call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1}, call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 1},
\ {'bufnr': a:bnum, 'lnum': 2}]) \ {'bufnr': a:bnum, 'lnum': 2, 'end_lnum': 3, 'col': 4, 'end_col': 5}])
let l = g:Xgetlist() let l = g:Xgetlist()
call assert_equal(2, len(l)) call assert_equal(2, len(l))
call assert_equal(2, l[1].lnum) call assert_equal(2, l[1].lnum)
call assert_equal(3, l[1].end_lnum)
call assert_equal(4, l[1].col)
call assert_equal(5, l[1].end_col)
Xnext Xnext
call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a') call g:Xsetlist([{'bufnr': a:bnum, 'lnum': 3}], 'a')
@@ -2743,7 +2762,9 @@ func XvimgrepTests(cchar)
let l = g:Xgetlist() let l = g:Xgetlist()
call assert_equal(2, len(l)) call assert_equal(2, len(l))
call assert_equal(8, l[0].col) call assert_equal(8, l[0].col)
call assert_equal(11, l[0].end_col)
call assert_equal(12, l[1].col) call assert_equal(12, l[1].col)
call assert_equal(15, l[1].end_col)
1Xvimgrep ?Editor? Xtestfile* 1Xvimgrep ?Editor? Xtestfile*
let l = g:Xgetlist() let l = g:Xgetlist()
@@ -4850,7 +4871,7 @@ func Test_add_invalid_entry_with_qf_window()
call setqflist(['bb'], 'a') call setqflist(['bb'], 'a')
call assert_equal(1, line('$')) call assert_equal(1, line('$'))
call assert_equal(['Xfile1|10| aa'], getline(1, '$')) call assert_equal(['Xfile1|10| aa'], getline(1, '$'))
call assert_equal([{'lnum': 10, 'bufnr': bufnr('Xfile1'), 'col': 0, 'pattern': '', 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'module': '', 'text': 'aa'}], getqflist()) call assert_equal([{'lnum': 10, 'end_lnum': 0, 'bufnr': bufnr('Xfile1'), 'col': 0, 'end_col': 0, 'pattern': '', 'valid': 1, 'vcol': 0, 'nr': -1, 'type': '', 'module': '', 'text': 'aa'}], getqflist())
cclose cclose
endfunc endfunc
@@ -5001,15 +5022,21 @@ func Xtest_qftextfunc(cchar)
call assert_equal('Tqfexpr', &quickfixtextfunc) call assert_equal('Tqfexpr', &quickfixtextfunc)
call assert_equal('', call assert_equal('',
\ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc) \ g:Xgetlist({'quickfixtextfunc' : 1}).quickfixtextfunc)
Xexpr ['F1:10:2:green', 'F1:20:4:blue'] call g:Xsetlist([
\ { 'filename': 'F1', 'lnum': 10, 'col': 2,
\ 'end_col': 7, 'text': 'green'},
\ { 'filename': 'F1', 'lnum': 20, 'end_lnum': 25, 'col': 4,
\ 'end_col': 8, 'text': 'blue'},
\ ])
Xwindow Xwindow
call assert_equal('F1-L10C2-green', getline(1)) call assert_equal('F1-L10C2-green', getline(1))
call assert_equal('F1-L20C4-blue', getline(2)) call assert_equal('F1-L20C4-blue', getline(2))
Xclose Xclose
set quickfixtextfunc&vim set quickfixtextfunc&vim
Xwindow Xwindow
call assert_equal('F1|10 col 2| green', getline(1)) call assert_equal('F1|10 col 2-7| green', getline(1))
call assert_equal('F1|20 col 4| blue', getline(2)) call assert_equal('F1|20-25 col 4-8| blue', getline(2))
Xclose Xclose
set efm& set efm&
set quickfixtextfunc& set quickfixtextfunc&

View File

@@ -771,15 +771,16 @@ func Test_ltag()
ltag third ltag third
call assert_equal('Xfoo', bufname('')) call assert_equal('Xfoo', bufname(''))
call assert_equal(3, line('.')) call assert_equal(3, line('.'))
call assert_equal([{'lnum': 3, 'bufnr': bufnr('Xfoo'), 'col': 0, call assert_equal([{'lnum': 3, 'end_lnum': 0, 'bufnr': bufnr('Xfoo'),
\ 'pattern': '', 'valid': 1, 'vcol': 0, 'nr': 0, 'type': '', \ 'col': 0, 'end_col': 0, 'pattern': '', 'valid': 1, 'vcol': 0,
\ 'module': '', 'text': 'third'}], getloclist(0)) \ 'nr': 0, 'type': '', 'module': '', 'text': 'third'}], getloclist(0))
ltag second ltag second
call assert_equal(2, line('.')) call assert_equal(2, line('.'))
call assert_equal([{'lnum': 0, 'bufnr': bufnr('Xfoo'), 'col': 0, call assert_equal([{'lnum': 0, 'end_lnum': 0, 'bufnr': bufnr('Xfoo'),
\ 'pattern': '^\Vint second() {}\$', 'valid': 1, 'vcol': 0, 'nr': 0, \ 'col': 0, 'end_col': 0, 'pattern': '^\Vint second() {}\$',
\ 'type': '', 'module': '', 'text': 'second'}], getloclist(0)) \ 'valid': 1, 'vcol': 0, 'nr': 0, 'type': '', 'module': '',
\ 'text': 'second'}], getloclist(0))
call delete('Xtags') call delete('Xtags')
call delete('Xfoo') call delete('Xfoo')