mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
fix(events): make v:event readonly in more events (#18070)
This makes v:event readonly in these four events: - ChanInfo - ChanOpen - RecordingLeave - TermClose
This commit is contained in:
parent
cdfb045ea0
commit
f89ca7194f
@ -836,6 +836,7 @@ static void set_info_event(void **argv)
|
||||
typval_T retval;
|
||||
(void)object_to_vim(DICTIONARY_OBJ(info), &retval, NULL);
|
||||
tv_dict_add_dict(dict, S_LEN("info"), retval.vval.v_dict);
|
||||
tv_dict_set_keys_readonly(dict);
|
||||
|
||||
apply_autocmds(event, NULL, NULL, false, curbuf);
|
||||
|
||||
|
@ -944,6 +944,7 @@ int do_record(int c)
|
||||
buf[0] = (char)regname;
|
||||
buf[1] = NUL;
|
||||
(void)tv_dict_add_str(dict, S_LEN("regname"), buf);
|
||||
tv_dict_set_keys_readonly(dict);
|
||||
|
||||
// Get the recorded key hits. K_SPECIAL will be escaped, this
|
||||
// needs to be removed again to put it in a register. exec_reg then
|
||||
|
@ -336,6 +336,7 @@ void terminal_close(Terminal *term, int status)
|
||||
save_v_event_T save_v_event;
|
||||
dict_T *dict = get_v_event(&save_v_event);
|
||||
tv_dict_add_nr(dict, S_LEN("status"), status);
|
||||
tv_dict_set_keys_readonly(dict);
|
||||
apply_autocmds(EVENT_TERMCLOSE, NULL, NULL, false, buf);
|
||||
restore_v_event(dict, &save_v_event);
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ local command = helpers.command
|
||||
local exc_exec = helpers.exc_exec
|
||||
local exec_lua = helpers.exec_lua
|
||||
local curbufmeths = helpers.curbufmeths
|
||||
local retry = helpers.retry
|
||||
local source = helpers.source
|
||||
|
||||
describe('autocmd', function()
|
||||
@ -439,6 +440,37 @@ describe('autocmd', function()
|
||||
]]}
|
||||
end)
|
||||
|
||||
describe('v:event is readonly #18063', function()
|
||||
it('during ChanOpen event', function()
|
||||
command('autocmd ChanOpen * let v:event.info.id = 0')
|
||||
funcs.jobstart({'cat'})
|
||||
retry(nil, nil, function()
|
||||
eq('E46: Cannot change read-only variable "v:event.info"', meths.get_vvar('errmsg'))
|
||||
end)
|
||||
end)
|
||||
|
||||
it('during ChanOpen event', function()
|
||||
command('autocmd ChanInfo * let v:event.info.id = 0')
|
||||
meths.set_client_info('foo', {}, 'remote', {}, {})
|
||||
retry(nil, nil, function()
|
||||
eq('E46: Cannot change read-only variable "v:event.info"', meths.get_vvar('errmsg'))
|
||||
end)
|
||||
end)
|
||||
|
||||
it('during RecordingLeave event', function()
|
||||
command([[autocmd RecordingLeave * let v:event.regname = '']])
|
||||
eq('Vim(let):E46: Cannot change read-only variable "v:event.regname"',
|
||||
pcall_err(command, 'normal! qqq'))
|
||||
end)
|
||||
|
||||
it('during TermClose event', function()
|
||||
command('autocmd TermClose * let v:event.status = 0')
|
||||
command('terminal')
|
||||
eq('Vim(let):E46: Cannot change read-only variable "v:event.status"',
|
||||
pcall_err(command, 'bdelete!'))
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('old_tests', function()
|
||||
it('vimscript: WinNew ++once', function()
|
||||
source [[
|
||||
|
Loading…
Reference in New Issue
Block a user