mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge pull request #20629 from zeertzjq/vim-8.2.4453
vim-patch:8.2.{4453,4462}
This commit is contained in:
commit
186c489fd6
@ -3112,6 +3112,12 @@ void set_option_value_give_err(const char *name, long number, const char *string
|
||||
}
|
||||
}
|
||||
|
||||
bool is_option_allocated(const char *name)
|
||||
{
|
||||
int idx = findoption(name);
|
||||
return idx >= 0 && (options[idx].flags & P_ALLOCED);
|
||||
}
|
||||
|
||||
/// Return true if "name" is a string option.
|
||||
/// Returns false if option "name" does not exist.
|
||||
bool is_string_option(const char *name)
|
||||
|
@ -1790,7 +1790,7 @@ void check_quickfix_busy(void)
|
||||
/// @param type type character
|
||||
/// @param valid valid entry
|
||||
///
|
||||
/// @returns QF_OK or QF_FAIL.
|
||||
/// @return QF_OK on success or QF_FAIL on failure.
|
||||
static int qf_add_entry(qf_list_T *qfl, char *dir, char *fname, char *module, int bufnum,
|
||||
char *mesg, linenr_T lnum, linenr_T end_lnum, int col, int end_col,
|
||||
char vis_col, char *pattern, int nr, char type, char valid)
|
||||
@ -3461,12 +3461,10 @@ void qf_view_result(bool split)
|
||||
{
|
||||
qf_info_T *qi = &ql_info;
|
||||
|
||||
if (!bt_quickfix(curbuf)) {
|
||||
return;
|
||||
}
|
||||
if (IS_LL_WINDOW(curwin)) {
|
||||
qi = GET_LOC_LIST(curwin);
|
||||
}
|
||||
|
||||
if (qf_list_empty(qf_get_curlist(qi))) {
|
||||
emsg(_(e_no_errors));
|
||||
return;
|
||||
@ -3869,7 +3867,12 @@ static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last)
|
||||
if (curwin->w_llist == qi) {
|
||||
win = curwin;
|
||||
} else {
|
||||
// Find the file window (non-quickfix) with this location list
|
||||
win = qf_find_win_with_loclist(qi);
|
||||
if (win == NULL) {
|
||||
// File window is not found. Find the location list window.
|
||||
win = qf_find_win(qi);
|
||||
}
|
||||
if (win == NULL) {
|
||||
return;
|
||||
}
|
||||
@ -7065,6 +7068,7 @@ void ex_helpgrep(exarg_T *eap)
|
||||
bool updated = false;
|
||||
// Make 'cpoptions' empty, the 'l' flag should not be used here.
|
||||
char *const save_cpo = p_cpo;
|
||||
const bool save_cpo_allocated = is_option_allocated("cpo");
|
||||
p_cpo = empty_option;
|
||||
|
||||
bool new_qi = false;
|
||||
@ -7104,7 +7108,9 @@ void ex_helpgrep(exarg_T *eap)
|
||||
if (*p_cpo == NUL) {
|
||||
set_option_value_give_err("cpo", 0L, save_cpo, 0);
|
||||
}
|
||||
free_string_option(save_cpo);
|
||||
if (save_cpo_allocated) {
|
||||
free_string_option(save_cpo);
|
||||
}
|
||||
}
|
||||
|
||||
if (updated) {
|
||||
@ -7139,7 +7145,9 @@ void ex_helpgrep(exarg_T *eap)
|
||||
if (new_qi) {
|
||||
ll_free_all(&qi);
|
||||
}
|
||||
} else if (curwin->w_llist == NULL) {
|
||||
} else if (curwin->w_llist == NULL && new_qi) {
|
||||
// current window didn't have a location list associated with it
|
||||
// before. Associate the new location list now.
|
||||
curwin->w_llist = qi;
|
||||
}
|
||||
}
|
||||
|
@ -107,3 +107,19 @@ func Test_make()
|
||||
lclose
|
||||
endfor
|
||||
endfunc
|
||||
|
||||
" Test for an error file with a long line that needs an encoding conversion
|
||||
func Test_longline_conversion()
|
||||
new
|
||||
call setline(1, ['Xfile:10:' .. repeat("\xe0", 2000)])
|
||||
write ++enc=latin1 Xerr.out
|
||||
bw!
|
||||
set errorformat&
|
||||
set makeencoding=latin1
|
||||
cfile Xerr.out
|
||||
call assert_equal(repeat("\u00e0", 2000), getqflist()[0].text)
|
||||
call delete('Xerr.out')
|
||||
set makeencoding&
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
@ -261,6 +261,7 @@ func XwindowTests(cchar)
|
||||
" Opening the location list window without any errors should fail
|
||||
if a:cchar == 'l'
|
||||
call assert_fails('lopen', 'E776:')
|
||||
call assert_fails('lwindow', 'E776:')
|
||||
endif
|
||||
|
||||
" Create a list with no valid entries
|
||||
@ -714,6 +715,35 @@ func Test_helpgrep()
|
||||
call s:test_xhelpgrep('l')
|
||||
endfunc
|
||||
|
||||
" When running the :helpgrep command, if an autocmd modifies the 'cpoptions'
|
||||
" value, then Vim crashes. (issue fixed by 7.2b-004 and 8.2.4453)
|
||||
func Test_helpgrep_restore_cpo_aucmd()
|
||||
let save_cpo = &cpo
|
||||
augroup QF_Test
|
||||
au!
|
||||
autocmd BufNew * set cpo=acd
|
||||
augroup END
|
||||
|
||||
helpgrep quickfix
|
||||
call assert_equal('acd', &cpo)
|
||||
%bw!
|
||||
|
||||
set cpo&vim
|
||||
augroup QF_Test
|
||||
au!
|
||||
autocmd BufReadPost * set cpo=
|
||||
augroup END
|
||||
|
||||
helpgrep buffer
|
||||
call assert_equal('', &cpo)
|
||||
|
||||
augroup QF_Test
|
||||
au!
|
||||
augroup END
|
||||
%bw!
|
||||
let &cpo = save_cpo
|
||||
endfunc
|
||||
|
||||
func Test_errortitle()
|
||||
augroup QfBufWinEnter
|
||||
au!
|
||||
@ -1210,8 +1240,14 @@ func Xinvalid_efm_Tests(cchar)
|
||||
set efm=
|
||||
call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
|
||||
|
||||
" Empty directory name. When there is an error in parsing new entries, make
|
||||
" sure the previous quickfix list is made the current list.
|
||||
set efm&
|
||||
cexpr ["one", "two"]
|
||||
let qf_id = getqflist(#{id: 0}).id
|
||||
set efm=%DEntering\ dir\ abc,%f:%l:%m
|
||||
call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E379:')
|
||||
call assert_equal(qf_id, getqflist(#{id: 0}).id)
|
||||
|
||||
let &efm = save_efm
|
||||
endfunc
|
||||
@ -1465,7 +1501,7 @@ func XquickfixChangedByAutocmd(cchar)
|
||||
endfunc
|
||||
endif
|
||||
|
||||
augroup testgroup
|
||||
augroup QF_Test
|
||||
au!
|
||||
autocmd BufReadCmd test_changed.txt call ReadFunc()
|
||||
augroup END
|
||||
@ -1479,7 +1515,24 @@ func XquickfixChangedByAutocmd(cchar)
|
||||
endfor
|
||||
call assert_fails('Xrewind', ErrorNr . ':')
|
||||
|
||||
augroup! testgroup
|
||||
augroup QF_Test
|
||||
au!
|
||||
augroup END
|
||||
|
||||
if a:cchar == 'c'
|
||||
cexpr ["Xtest1:1:Line"]
|
||||
cwindow
|
||||
only
|
||||
augroup QF_Test
|
||||
au!
|
||||
autocmd WinEnter * call setqflist([], 'f')
|
||||
augroup END
|
||||
call assert_fails('exe "normal \<CR>"', 'E925:')
|
||||
augroup QF_Test
|
||||
au!
|
||||
augroup END
|
||||
endif
|
||||
%bw!
|
||||
endfunc
|
||||
|
||||
func Test_quickfix_was_changed_by_autocmd()
|
||||
@ -1617,6 +1670,9 @@ func SetXlistTests(cchar, bnum)
|
||||
\ " {'bufnr':999, 'lnum':5}])", 'E92:')
|
||||
call g:Xsetlist([[1, 2,3]])
|
||||
call assert_equal(0, len(g:Xgetlist()))
|
||||
call assert_fails('call g:Xsetlist([], [])', 'E928:')
|
||||
call g:Xsetlist([v:_null_dict])
|
||||
call assert_equal([], g:Xgetlist())
|
||||
endfunc
|
||||
|
||||
func Test_setqflist()
|
||||
@ -2890,6 +2946,19 @@ func XvimgrepTests(cchar)
|
||||
call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
|
||||
call assert_equal([], getbufinfo('Xtestfile2'))
|
||||
|
||||
" Test for opening the dummy buffer used by vimgrep in a window. The new
|
||||
" window should be closed
|
||||
%bw!
|
||||
augroup QF_Test
|
||||
au!
|
||||
autocmd BufReadPre * exe "sb " .. expand("<abuf>")
|
||||
augroup END
|
||||
call assert_fails("Xvimgrep /sublime/ Xtestfile1", 'E480:')
|
||||
call assert_equal(1, winnr('$'))
|
||||
augroup QF_Test
|
||||
au!
|
||||
augroup END
|
||||
|
||||
call delete('Xtestfile1')
|
||||
call delete('Xtestfile2')
|
||||
endfunc
|
||||
@ -4061,14 +4130,19 @@ endfunc
|
||||
" The following test used to crash Vim
|
||||
func Test_lhelpgrep_autocmd()
|
||||
lhelpgrep quickfix
|
||||
autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
|
||||
augroup QF_Test
|
||||
au!
|
||||
autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
|
||||
augroup END
|
||||
lhelpgrep buffer
|
||||
call assert_equal('help', &filetype)
|
||||
call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
|
||||
lhelpgrep tabpage
|
||||
call assert_equal('help', &filetype)
|
||||
call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
|
||||
au! QuickFixCmdPost
|
||||
augroup QF_Test
|
||||
au!
|
||||
augroup END
|
||||
|
||||
new | only
|
||||
augroup QF_Test
|
||||
@ -4081,7 +4155,7 @@ func Test_lhelpgrep_autocmd()
|
||||
wincmd w
|
||||
call assert_fails('helpgrep quickfix', 'E925:')
|
||||
augroup QF_Test
|
||||
au! BufEnter
|
||||
au!
|
||||
augroup END
|
||||
|
||||
new | only
|
||||
@ -4091,7 +4165,7 @@ func Test_lhelpgrep_autocmd()
|
||||
augroup END
|
||||
call assert_fails('helpgrep quickfix', 'E925:')
|
||||
augroup QF_Test
|
||||
au! BufEnter
|
||||
au!
|
||||
augroup END
|
||||
|
||||
new | only
|
||||
@ -4101,10 +4175,43 @@ func Test_lhelpgrep_autocmd()
|
||||
augroup END
|
||||
call assert_fails('lhelpgrep quickfix', 'E926:')
|
||||
augroup QF_Test
|
||||
au! BufEnter
|
||||
au!
|
||||
augroup END
|
||||
|
||||
" Replace the contents of a help window location list when it is still in
|
||||
" use.
|
||||
new | only
|
||||
lhelpgrep quickfix
|
||||
wincmd w
|
||||
augroup QF_Test
|
||||
au!
|
||||
autocmd WinEnter * call setloclist(0, [], 'r')
|
||||
augroup END
|
||||
call assert_fails('lhelpgrep win_getid', 'E926:')
|
||||
augroup QF_Test
|
||||
au!
|
||||
augroup END
|
||||
|
||||
%bw!
|
||||
endfunc
|
||||
|
||||
" The following test used to crash Vim
|
||||
func Test_lhelpgrep_autocmd_free_loclist()
|
||||
%bw!
|
||||
lhelpgrep quickfix
|
||||
wincmd w
|
||||
augroup QF_Test
|
||||
au!
|
||||
autocmd WinEnter * call setloclist(0, [], 'f')
|
||||
augroup END
|
||||
lhelpgrep win_getid
|
||||
wincmd w
|
||||
wincmd w
|
||||
wincmd w
|
||||
augroup QF_Test
|
||||
au!
|
||||
augroup END
|
||||
%bw!
|
||||
endfunc
|
||||
|
||||
" Test for shortening/simplifying the file name when opening the
|
||||
@ -5295,6 +5402,7 @@ func Xtest_getqflist_by_idx(cchar)
|
||||
call assert_equal('L20', l[0].text)
|
||||
call assert_equal([], g:Xgetlist({'idx' : -1, 'items' : 0}).items)
|
||||
call assert_equal([], g:Xgetlist({'idx' : 3, 'items' : 0}).items)
|
||||
call assert_equal({}, g:Xgetlist(#{idx: "abc"}))
|
||||
%bwipe!
|
||||
endfunc
|
||||
|
||||
@ -5353,6 +5461,19 @@ func Xtest_qftextfunc(cchar)
|
||||
call assert_equal('F1|10 col 2-7| green', getline(1))
|
||||
call assert_equal('F1|20-25 col 4-8| blue', getline(2))
|
||||
Xclose
|
||||
|
||||
set efm=%f:%l:%c:%m
|
||||
set quickfixtextfunc=Tqfexpr
|
||||
" Update the list with only the cwindow
|
||||
Xwindow
|
||||
only
|
||||
call g:Xsetlist([
|
||||
\ { 'filename': 'F2', 'lnum': 20, 'col': 2,
|
||||
\ 'end_col': 7, 'text': 'red'}
|
||||
\ ])
|
||||
call assert_equal(['F2-L20C2-red'], getline(1, '$'))
|
||||
new
|
||||
Xclose
|
||||
set efm&
|
||||
set quickfixtextfunc&
|
||||
|
||||
@ -5660,5 +5781,62 @@ func Test_lopen_bwipe_all()
|
||||
call delete('Xresult')
|
||||
endfunc
|
||||
|
||||
" Test for calling setqflist() function recursively
|
||||
func Test_recursive_setqflist()
|
||||
augroup QF_Test
|
||||
au!
|
||||
autocmd BufWinEnter quickfix call setqflist([], 'r')
|
||||
augroup END
|
||||
|
||||
copen
|
||||
call assert_fails("call setqflist([], 'a')", 'E952:')
|
||||
|
||||
augroup QF_Test
|
||||
au!
|
||||
augroup END
|
||||
%bw!
|
||||
endfunc
|
||||
|
||||
" Test for failure to create a new window when selecting a file from the
|
||||
" quickfix window
|
||||
func Test_cwindow_newwin_fails()
|
||||
cgetexpr ["Xfile1:10:L10", "Xfile1:20:L20"]
|
||||
cwindow
|
||||
only
|
||||
let qf_wid = win_getid()
|
||||
" create the maximum number of scratch windows
|
||||
let hor_win_count = (&lines - 1)/2
|
||||
let hor_split_count = hor_win_count - 1
|
||||
for s in range(1, hor_split_count) | new | set buftype=nofile | endfor
|
||||
call win_gotoid(qf_wid)
|
||||
call assert_fails('exe "normal \<CR>"', 'E36:')
|
||||
%bw!
|
||||
endfunc
|
||||
|
||||
" Test for updating the location list when only the location list window is
|
||||
" present and the corresponding file window is closed.
|
||||
func Test_loclist_update_with_llwin_only()
|
||||
%bw!
|
||||
new
|
||||
wincmd w
|
||||
lexpr ["Xfile1:1:Line1"]
|
||||
lopen
|
||||
wincmd p
|
||||
close
|
||||
call setloclist(2, [], 'r', {'lines': ["Xtest2:2:Line2"]})
|
||||
call assert_equal(['Xtest2|2| Line2'], getbufline(winbufnr(2), 1, '$'))
|
||||
%bw!
|
||||
endfunc
|
||||
|
||||
" Test for getting the quickfix list after a buffer with an error is wiped out
|
||||
func Test_getqflist_wiped_out_buffer()
|
||||
%bw!
|
||||
cexpr ["Xtest1:34:Wiped out"]
|
||||
let bnum = bufnr('Xtest1')
|
||||
call assert_equal(bnum, getqflist()[0].bufnr)
|
||||
bw Xtest1
|
||||
call assert_equal(0, getqflist()[0].bufnr)
|
||||
%bw!
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
@ -4913,7 +4913,7 @@ win_T *buf_jump_open_win(buf_T *buf)
|
||||
}
|
||||
|
||||
/// Jump to the first open window in any tab page that contains buffer "buf",
|
||||
/// if one exists.
|
||||
/// if one exists. First search in the windows present in the current tab page.
|
||||
/// @return the found window, or NULL.
|
||||
win_T *buf_jump_open_tab(buf_T *buf)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user