Merge pull request #36258 from janlazo/vim-9.1.0918

vim-patch:9.0.0106,9.1.{359,918}
This commit is contained in:
zeertzjq
2025-10-21 12:10:45 +08:00
committed by GitHub
6 changed files with 378 additions and 361 deletions

View File

@@ -1993,14 +1993,19 @@ static char *do_source_buffer_init(source_cookie_T *sp, const exarg_T *eap, bool
return NULL;
}
if (ex_lua) {
// Use ":{range}lua buffer=<num>" as the script name
snprintf(IObuff, IOSIZE, ":{range}lua buffer=%d", curbuf->b_fnum);
char *fname;
if (curbuf->b_ffname != NULL) {
fname = xstrdup(curbuf->b_ffname);
} else {
// Use ":source buffer=<num>" as the script name
snprintf(IObuff, IOSIZE, ":source buffer=%d", curbuf->b_fnum);
if (ex_lua) {
// Use ":{range}lua buffer=<num>" as the script name
snprintf(IObuff, IOSIZE, ":{range}lua buffer=%d", curbuf->b_fnum);
} else {
// Use ":source buffer=<num>" as the script name
snprintf(IObuff, IOSIZE, ":source buffer=%d", curbuf->b_fnum);
}
fname = xstrdup(IObuff);
}
char *fname = xstrdup(IObuff);
ga_init(&sp->buflines, sizeof(char *), 100);
// Copy the lines from the buffer into a grow array

View File

@@ -247,12 +247,15 @@ describe(':source', function()
feed('dd')
feed_command(':source')
local filepath = fn.expand('%:p')
if filepath == '' then
filepath = ':source buffer=1'
end
eq(12, eval('g:c'))
eq(' \\ 1\n "\\ 2', exec_lua('return _G.a'))
eq(':source buffer=1', api.nvim_get_var('sfile_value'))
eq(':source buffer=1', api.nvim_get_var('stack_value'))
eq(':source buffer=1', api.nvim_get_var('script_value'))
eq(filepath, api.nvim_get_var('sfile_value'))
eq(filepath, api.nvim_get_var('stack_value'))
eq(filepath, api.nvim_get_var('script_value'))
end)
end

View File

@@ -0,0 +1,22 @@
-- Test for buffer name completion when 'wildoptions' contains "fuzzy"
-- (Confirm that Vim does not crash)
local n = require('test.functional.testnvim')()
local clear = n.clear
local insert = n.insert
local expect = n.expect
local feed_command = n.feed_command
local command = n.command
describe('set wildoptions=fuzzy', function()
before_each(clear)
it('works', function()
insert([[I'm alive!]])
command('set wildoptions=fuzzy')
command('new buf_a')
feed_command('b buf_a')
command('q!')
expect([[I'm alive!]])
end)
end)

View File

@@ -1,345 +0,0 @@
-- Test for joining lines with marks in them (and with 'joinspaces' set/reset)
local n = require('test.functional.testnvim')()
local feed = n.feed
local clear = n.clear
local insert = n.insert
local expect = n.expect
local feed_command = n.feed_command
describe('joining lines', function()
before_each(clear)
-- luacheck: ignore 613 (Trailing whitespaces in a string)
-- luacheck: ignore 611 (Line contains only whitespaces)
it("keeps marks with different 'joinspaces' settings", function()
insert([[
firstline
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf
asdf
asdfasdf
asdf
asdfasdf
asdf
asdfasdf
asdf
asdfasdf
asdf
asdfasdf
asdf
asdfasdf
asdf
zx cvn.
as dfg?
hjkl iop!
ert
]])
-- Switch off 'joinspaces', then join some lines in the buffer using "J".
-- Also set a few marks and record their movement when joining lines.
feed_command('set nojoinspaces')
feed_command('/firstline/')
feed('j"td/^$/<cr>')
feed('PJjJjJjJjJjJjJjJjJjJjJjJjJjJ')
feed('j05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$p')
-- Do the same with 'joinspaces' on.
feed_command('set joinspaces')
feed('j"tp')
feed('JjJjJjJjJjJjJjJjJjJjJjJjJjJ')
feed('j05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$po<esc>')
feed_command('1d')
expect([[
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
zx cvn. as dfg? hjkl iop! ert ernop
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
zx cvn. as dfg? hjkl iop! ert enop
]])
end)
it("removes comment leaders with 'joinspaces' off", function()
insert([[
{
/*
* Make sure the previous comment leader is not removed.
*/
/*
* Make sure the previous comment leader is not removed.
*/
// Should the next comment leader be left alone?
// Yes.
// Should the next comment leader be left alone?
// Yes.
/* Here the comment leader should be left intact. */
// And so should this one.
/* Here the comment leader should be left intact. */
// And so should this one.
if (condition) // Remove the next comment leader!
// OK, I will.
action();
if (condition) // Remove the next comment leader!
// OK, I will.
action();
}
]])
feed_command('/^{/+1')
feed_command('set comments=s1:/*,mb:*,ex:*/,://')
feed_command('set nojoinspaces')
feed_command('set backspace=eol,start')
-- With 'joinspaces' switched off, join lines using both "J" and :join and
-- verify that comment leaders are stripped or kept as appropriate.
feed_command('.,+3join')
feed('j4J<cr>')
feed_command('.,+2join')
feed('j3J<cr>')
feed_command('.,+2join')
feed('j3J<cr>')
feed_command('.,+2join')
feed('jj3J<cr>')
expect([[
{
/* Make sure the previous comment leader is not removed. */
/* Make sure the previous comment leader is not removed. */
// Should the next comment leader be left alone? Yes.
// Should the next comment leader be left alone? Yes.
/* Here the comment leader should be left intact. */ // And so should this one.
/* Here the comment leader should be left intact. */ // And so should this one.
if (condition) // Remove the next comment leader! OK, I will.
action();
if (condition) // Remove the next comment leader! OK, I will.
action();
}
]])
end)
-- This test case has nothing to do with joining lines.
it("Ctrl-u and 'backspace' compatibility", function()
-- Notice that the buffer text, which is intended to helpfully hint at
-- what's being done in the test, is off by one line. (For example, "this
-- should be deleted" should not be deleted, but the line below it should,
-- and is.) This is likely a mistake, but was kept here for consistency.
insert([[
1 this shouldn't be deleted
2 this shouldn't be deleted
3 this shouldn't be deleted
4 this should be deleted
5 this shouldn't be deleted
6 this shouldn't be deleted
7 this shouldn't be deleted
8 this shouldn't be deleted (not touched yet)
]])
-- As mentioned above, we mimic the wrong initial cursor position in the old
-- test by advancing one line further.
feed_command([[/^\d\+ this]], '+1')
-- Test with the default 'backspace' setting.
feed('Avim1<c-u><esc><cr>')
feed('Avim2<c-g>u<c-u><esc><cr>')
feed_command('set cpo-=<')
feed_command('inoremap <c-u> <left><c-u>')
feed('Avim3<c-u><esc><cr>')
feed_command('iunmap <c-u>')
feed('Avim4<c-u><c-u><esc><cr>')
-- Test with 'backspace' set to the compatible setting.
feed_command('set backspace=')
feed('A vim5<esc>A<c-u><c-u><esc><cr>')
feed('A vim6<esc>Azwei<c-g>u<c-u><esc><cr>')
feed_command('inoremap <c-u> <left><c-u>')
feed('A vim7<c-u><c-u><esc><cr>')
expect([[
1 this shouldn't be deleted
2 this shouldn't be deleted
3 this shouldn't be deleted
4 this should be deleted3
6 this shouldn't be deleted vim5
7 this shouldn't be deleted vim6
8 this shouldn't be deleted (not touched yet) vim7
]])
end)
it("removes comment leaders with 'joinspaces' on", function()
insert([[
{
/*
* Make sure the previous comment leader is not removed.
*/
/*
* Make sure the previous comment leader is not removed.
*/
/* List:
* - item1
* foo bar baz
* foo bar baz
* - item2
* foo bar baz
* foo bar baz
*/
/* List:
* - item1
* foo bar baz
* foo bar baz
* - item2
* foo bar baz
* foo bar baz
*/
// Should the next comment leader be left alone?
// Yes.
// Should the next comment leader be left alone?
// Yes.
/* Here the comment leader should be left intact. */
// And so should this one.
/* Here the comment leader should be left intact. */
// And so should this one.
if (condition) // Remove the next comment leader!
// OK, I will.
action();
if (condition) // Remove the next comment leader!
// OK, I will.
action();
int i = 7 /* foo *// 3
// comment
;
int i = 7 /* foo *// 3
// comment
;
># Note that the last character of the ending comment leader (left angle
# bracket) is a comment leader itself. Make sure that this comment leader is
# not removed from the next line #<
< On this line a new comment is opened which spans 2 lines. This comment should
< retain its comment leader.
># Note that the last character of the ending comment leader (left angle
# bracket) is a comment leader itself. Make sure that this comment leader is
# not removed from the next line #<
< On this line a new comment is opened which spans 2 lines. This comment should
< retain its comment leader.
}
]])
feed_command('/^{/+1')
feed_command([[set comments=sO:*\ -,mO:*\ \ ,exO:*/]])
feed_command('set comments+=s1:/*,mb:*,ex:*/,://')
feed_command('set comments+=s1:>#,mb:#,ex:#<,:<')
feed_command('set backspace=eol,start')
-- With 'joinspaces' on (the default setting), again join lines and verify
-- that comment leaders are stripped or kept as appropriate.
feed_command('.,+3join')
feed('j4J<cr>')
feed_command('.,+8join')
feed('j9J<cr>')
feed_command('.,+2join')
feed('j3J<cr>')
feed_command('.,+2join')
feed('j3J<cr>')
feed_command('.,+2join')
feed('jj3J<cr>')
feed('j')
feed_command('.,+2join')
feed('jj3J<cr>')
feed('j')
feed_command('.,+5join')
feed('j6J<cr>')
feed(
'oSome code!<cr>// Make sure backspacing does not remove this comment leader.<esc>0i<bs><esc>'
)
expect([[
{
/* Make sure the previous comment leader is not removed. */
/* Make sure the previous comment leader is not removed. */
/* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
/* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
// Should the next comment leader be left alone? Yes.
// Should the next comment leader be left alone? Yes.
/* Here the comment leader should be left intact. */ // And so should this one.
/* Here the comment leader should be left intact. */ // And so should this one.
if (condition) // Remove the next comment leader! OK, I will.
action();
if (condition) // Remove the next comment leader! OK, I will.
action();
int i = 7 /* foo *// 3 // comment
;
int i = 7 /* foo *// 3 // comment
;
># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader.
># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader.
Some code!// Make sure backspacing does not remove this comment leader.
}
]])
end)
end)

View File

@@ -5,6 +5,10 @@ local n = require('test.functional.testnvim')()
local clear, eq = n.clear, t.eq
local eval, command = n.eval, n.command
local feed = n.feed
local insert = n.insert
local expect = n.expect
local feed_command = n.feed_command
describe('joining lines', function()
before_each(clear)
@@ -19,4 +23,336 @@ describe('joining lines', function()
command('normal 10J')
eq('one two three four', eval('getline(1)'))
end)
-- luacheck: ignore 613 (Trailing whitespaces in a string)
-- luacheck: ignore 611 (Line contains only whitespaces)
it("keeps marks with different 'joinspaces' settings", function()
insert([[
firstline
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf.
asdf
asdfasdf
asdf
asdfasdf
asdf
asdfasdf
asdf
asdfasdf
asdf
asdfasdf
asdf
asdfasdf
asdf
asdfasdf
asdf
zx cvn.
as dfg?
hjkl iop!
ert
]])
-- Switch off 'joinspaces', then join some lines in the buffer using "J".
-- Also set a few marks and record their movement when joining lines.
feed_command('set nojoinspaces')
feed_command('/firstline/')
feed('j"td/^$/<cr>')
feed('PJjJjJjJjJjJjJjJjJjJjJjJjJjJ')
feed('j05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$p')
-- Do the same with 'joinspaces' on.
feed_command('set joinspaces')
feed('j"tp')
feed('JjJjJjJjJjJjJjJjJjJjJjJjJjJ')
feed('j05lmx2j06lmy2k4Jy3l$p`xyl$p`yy2l$po<esc>')
feed_command('1d')
expect([[
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
zx cvn. as dfg? hjkl iop! ert ernop
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf. asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
asdfasdf asdf
zx cvn. as dfg? hjkl iop! ert enop
]])
end)
it("removes comment leaders with 'joinspaces' off", function()
insert([[
{
/*
* Make sure the previous comment leader is not removed.
*/
/*
* Make sure the previous comment leader is not removed.
*/
// Should the next comment leader be left alone?
// Yes.
// Should the next comment leader be left alone?
// Yes.
/* Here the comment leader should be left intact. */
// And so should this one.
/* Here the comment leader should be left intact. */
// And so should this one.
if (condition) // Remove the next comment leader!
// OK, I will.
action();
if (condition) // Remove the next comment leader!
// OK, I will.
action();
}
]])
feed_command('/^{/+1')
feed_command('set comments=s1:/*,mb:*,ex:*/,://')
feed_command('set nojoinspaces')
feed_command('set backspace=eol,start')
-- With 'joinspaces' switched off, join lines using both "J" and :join and
-- verify that comment leaders are stripped or kept as appropriate.
feed_command('.,+3join')
feed('j4J<cr>')
feed_command('.,+2join')
feed('j3J<cr>')
feed_command('.,+2join')
feed('j3J<cr>')
feed_command('.,+2join')
feed('jj3J<cr>')
expect([[
{
/* Make sure the previous comment leader is not removed. */
/* Make sure the previous comment leader is not removed. */
// Should the next comment leader be left alone? Yes.
// Should the next comment leader be left alone? Yes.
/* Here the comment leader should be left intact. */ // And so should this one.
/* Here the comment leader should be left intact. */ // And so should this one.
if (condition) // Remove the next comment leader! OK, I will.
action();
if (condition) // Remove the next comment leader! OK, I will.
action();
}
]])
end)
-- This test case has nothing to do with joining lines.
it("Ctrl-u and 'backspace' compatibility", function()
-- Notice that the buffer text, which is intended to helpfully hint at
-- what's being done in the test, is off by one line. (For example, "this
-- should be deleted" should not be deleted, but the line below it should,
-- and is.) This is likely a mistake, but was kept here for consistency.
insert([[
1 this shouldn't be deleted
2 this shouldn't be deleted
3 this shouldn't be deleted
4 this should be deleted
5 this shouldn't be deleted
6 this shouldn't be deleted
7 this shouldn't be deleted
8 this shouldn't be deleted (not touched yet)
]])
-- As mentioned above, we mimic the wrong initial cursor position in the old
-- test by advancing one line further.
feed_command([[/^\d\+ this]], '+1')
-- Test with the default 'backspace' setting.
feed('Avim1<c-u><esc><cr>')
feed('Avim2<c-g>u<c-u><esc><cr>')
feed_command('set cpo-=<')
feed_command('inoremap <c-u> <left><c-u>')
feed('Avim3<c-u><esc><cr>')
feed_command('iunmap <c-u>')
feed('Avim4<c-u><c-u><esc><cr>')
-- Test with 'backspace' set to the compatible setting.
feed_command('set backspace=')
feed('A vim5<esc>A<c-u><c-u><esc><cr>')
feed('A vim6<esc>Azwei<c-g>u<c-u><esc><cr>')
feed_command('inoremap <c-u> <left><c-u>')
feed('A vim7<c-u><c-u><esc><cr>')
expect([[
1 this shouldn't be deleted
2 this shouldn't be deleted
3 this shouldn't be deleted
4 this should be deleted3
6 this shouldn't be deleted vim5
7 this shouldn't be deleted vim6
8 this shouldn't be deleted (not touched yet) vim7
]])
end)
it("removes comment leaders with 'joinspaces' on", function()
insert([[
{
/*
* Make sure the previous comment leader is not removed.
*/
/*
* Make sure the previous comment leader is not removed.
*/
/* List:
* - item1
* foo bar baz
* foo bar baz
* - item2
* foo bar baz
* foo bar baz
*/
/* List:
* - item1
* foo bar baz
* foo bar baz
* - item2
* foo bar baz
* foo bar baz
*/
// Should the next comment leader be left alone?
// Yes.
// Should the next comment leader be left alone?
// Yes.
/* Here the comment leader should be left intact. */
// And so should this one.
/* Here the comment leader should be left intact. */
// And so should this one.
if (condition) // Remove the next comment leader!
// OK, I will.
action();
if (condition) // Remove the next comment leader!
// OK, I will.
action();
int i = 7 /* foo *// 3
// comment
;
int i = 7 /* foo *// 3
// comment
;
># Note that the last character of the ending comment leader (left angle
# bracket) is a comment leader itself. Make sure that this comment leader is
# not removed from the next line #<
< On this line a new comment is opened which spans 2 lines. This comment should
< retain its comment leader.
># Note that the last character of the ending comment leader (left angle
# bracket) is a comment leader itself. Make sure that this comment leader is
# not removed from the next line #<
< On this line a new comment is opened which spans 2 lines. This comment should
< retain its comment leader.
}
]])
feed_command('/^{/+1')
feed_command([[set comments=sO:*\ -,mO:*\ \ ,exO:*/]])
feed_command('set comments+=s1:/*,mb:*,ex:*/,://')
feed_command('set comments+=s1:>#,mb:#,ex:#<,:<')
feed_command('set backspace=eol,start')
-- With 'joinspaces' on (the default setting), again join lines and verify
-- that comment leaders are stripped or kept as appropriate.
feed_command('.,+3join')
feed('j4J<cr>')
feed_command('.,+8join')
feed('j9J<cr>')
feed_command('.,+2join')
feed('j3J<cr>')
feed_command('.,+2join')
feed('j3J<cr>')
feed_command('.,+2join')
feed('jj3J<cr>')
feed('j')
feed_command('.,+2join')
feed('jj3J<cr>')
feed('j')
feed_command('.,+5join')
feed('j6J<cr>')
feed(
'oSome code!<cr>// Make sure backspacing does not remove this comment leader.<esc>0i<bs><esc>'
)
expect([[
{
/* Make sure the previous comment leader is not removed. */
/* Make sure the previous comment leader is not removed. */
/* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
/* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
// Should the next comment leader be left alone? Yes.
// Should the next comment leader be left alone? Yes.
/* Here the comment leader should be left intact. */ // And so should this one.
/* Here the comment leader should be left intact. */ // And so should this one.
if (condition) // Remove the next comment leader! OK, I will.
action();
if (condition) // Remove the next comment leader! OK, I will.
action();
int i = 7 /* foo *// 3 // comment
;
int i = 7 /* foo *// 3 // comment
;
># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader.
># Note that the last character of the ending comment leader (left angle bracket) is a comment leader itself. Make sure that this comment leader is not removed from the next line #< < On this line a new comment is opened which spans 2 lines. This comment should retain its comment leader.
Some code!// Make sure backspacing does not remove this comment leader.
}
]])
end)
end)

View File

@@ -562,12 +562,8 @@ func Test_match_invalid_byte()
endfunc
func Test_match_illegal_byte()
let lines =<< trim END
silent! buffer ÿ\c
next ÿ
0scriptnames
source
END
" Text has illegal bytes which need to be set explicitly
let lines = ["norm :set no\x01\<CR>", "silent n\xff", "silent norm :b\xff\<CR>"]
call writefile(lines, 'Xregexp')
call system(GetVimCommand() .. ' -X -Z -e -s -S Xregexp -c qa!')