mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	feat(api): nvim_exec2(), deprecate nvim_exec() #19032
Problem: The signature of nvim_exec() is not extensible per ":help api-contract". Solution: Introduce nvim_exec2() and deprecate nvim_exec().
This commit is contained in:
		 Evgeni Chasnovski
					Evgeni Chasnovski
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							257d894d75
						
					
				
				
					commit
					fe9cbcb3a5
				
			| @@ -1549,11 +1549,11 @@ nvim_command({command})                                       *nvim_command()* | ||||
|  | ||||
|     On execution error: fails with VimL error, updates v:errmsg. | ||||
|  | ||||
|     Prefer using |nvim_cmd()| or |nvim_exec()| over this. To evaluate multiple | ||||
|     lines of Vim script or an Ex command directly, use |nvim_exec()|. To | ||||
|     construct an Ex command using a structured format and then execute it, use | ||||
|     |nvim_cmd()|. To modify an Ex command before evaluating it, use | ||||
|     |nvim_parse_cmd()| in conjunction with |nvim_cmd()|. | ||||
|     Prefer using |nvim_cmd()| or |nvim_exec2()| over this. To evaluate | ||||
|     multiple lines of Vim script or an Ex command directly, use | ||||
|     |nvim_exec2()|. To construct an Ex command using a structured format and | ||||
|     then execute it, use |nvim_cmd()|. To modify an Ex command before | ||||
|     evaluating it, use |nvim_parse_cmd()| in conjunction with |nvim_cmd()|. | ||||
|  | ||||
|     Parameters: ~ | ||||
|       • {command}  Ex command string | ||||
| @@ -1570,7 +1570,7 @@ nvim_eval({expr})                                                *nvim_eval()* | ||||
|     Return: ~ | ||||
|         Evaluation result or expanded object | ||||
|  | ||||
| nvim_exec({src}, {output})                                       *nvim_exec()* | ||||
| nvim_exec2({src}, {*opts})                                      *nvim_exec2()* | ||||
|     Executes Vimscript (multiline block of Ex commands), like anonymous | ||||
|     |:source|. | ||||
|  | ||||
| @@ -1580,12 +1580,14 @@ nvim_exec({src}, {output})                                       *nvim_exec()* | ||||
|     On execution error: fails with VimL error, updates v:errmsg. | ||||
|  | ||||
|     Parameters: ~ | ||||
|       • {src}     Vimscript code | ||||
|       • {output}  Capture and return all (non-error, non-shell |:!|) output | ||||
|       • {src}   Vimscript code | ||||
|       • {opts}  Optional parameters. | ||||
|                 • output: (boolean, default false) Whether to capture and | ||||
|                   return all (non-error, non-shell |:!|) output. | ||||
|  | ||||
|     Return: ~ | ||||
|         Output (non-error, non-shell |:!|) if `output` is true, else empty | ||||
|         string. | ||||
|         Dictionary containing information about execution, with these keys: | ||||
|         • output: (string|nil) Output if `opts.output` is true. | ||||
|  | ||||
|     See also: ~ | ||||
|       • |execute()| | ||||
| @@ -1738,7 +1740,7 @@ nvim_cmd({*cmd}, {*opts})                                         *nvim_cmd()* | ||||
|         empty string. | ||||
|  | ||||
|     See also: ~ | ||||
|       • |nvim_exec()| | ||||
|       • |nvim_exec2()| | ||||
|       • |nvim_command()| | ||||
|  | ||||
|                                                   *nvim_create_user_command()* | ||||
|   | ||||
| @@ -15,10 +15,11 @@ Deprecated features | ||||
| API | ||||
| - *nvim_buf_clear_highlight()*	Use |nvim_buf_clear_namespace()| instead. | ||||
| - *nvim_buf_set_virtual_text()*	Use |nvim_buf_set_extmark()| instead. | ||||
| - *nvim_command_output()*	Use |nvim_exec()| instead. | ||||
| - *nvim_command_output()*	Use |nvim_exec2()| instead. | ||||
| - *nvim_execute_lua()*		Use |nvim_exec_lua()| instead. | ||||
| - *nvim_get_hl_by_name()*	Use |nvim_get_hl()| instead. | ||||
| - *nvim_get_hl_by_id()*		Use |nvim_get_hl()| instead. | ||||
| - *nvim_exec()*			Use |nvim_exec2()| instead. | ||||
|  | ||||
| COMMANDS | ||||
| - *:rv* *:rviminfo*		Deprecated alias to |:rshada| command. | ||||
|   | ||||
| @@ -1355,9 +1355,9 @@ cmd({command})                                                     *vim.cmd()* | ||||
|     Parameters: ~ | ||||
|       • {command}  string|table Command(s) to execute. If a string, executes | ||||
|                    multiple lines of Vim script at once. In this case, it is | ||||
|                    an alias to |nvim_exec()|, where `output` is set to false. | ||||
|                    Thus it works identical to |:source|. If a table, executes | ||||
|                    a single command. In this case, it is an alias to | ||||
|                    an alias to |nvim_exec2()|, where `opts.output` is set to | ||||
|                    false. Thus it works identical to |:source|. If a table, | ||||
|                    executes a single command. In this case, it is an alias to | ||||
|                    |nvim_cmd()| where `opts` is empty. | ||||
|  | ||||
|     See also: ~ | ||||
|   | ||||
| @@ -60,6 +60,8 @@ The following changes may require adaptations in user config or plugins. | ||||
|  | ||||
| • Renamed vim.pretty_print to vim.print. |deprecated| | ||||
|  | ||||
| • |nvim_exec()| is now deprecated in favor of |nvim_exec2()|. | ||||
|  | ||||
| ============================================================================== | ||||
| NEW FEATURES                                                    *news-features* | ||||
|  | ||||
|   | ||||
| @@ -162,7 +162,7 @@ local vim9 = (function() | ||||
|           end | ||||
|         end | ||||
|  | ||||
|         vim.api.nvim_exec(table.concat(file, '\n'), false) | ||||
|         vim.api.nvim_exec2(table.concat(file, '\n'), { output = false }) | ||||
|       end, | ||||
|     }) | ||||
|   end | ||||
|   | ||||
| @@ -322,8 +322,8 @@ end | ||||
| --- | ||||
| ---@param command string|table Command(s) to execute. | ||||
| ---                            If a string, executes multiple lines of Vim script at once. In this | ||||
| ---                            case, it is an alias to |nvim_exec()|, where `output` is set to | ||||
| ---                            false. Thus it works identical to |:source|. | ||||
| ---                            case, it is an alias to |nvim_exec2()|, where `opts.output` is set | ||||
| ---                            to false. Thus it works identical to |:source|. | ||||
| ---                            If a table, executes a single command. In this case, it is an alias | ||||
| ---                            to |nvim_cmd()| where `opts` is empty. | ||||
| ---@see |ex-cmd-index| | ||||
| @@ -338,7 +338,7 @@ vim.cmd = setmetatable({}, { | ||||
|     if type(command) == 'table' then | ||||
|       return vim.api.nvim_cmd(command, {}) | ||||
|     else | ||||
|       return vim.api.nvim_exec(command, false) | ||||
|       return vim.api.nvim_exec2(command, { output = false }).output | ||||
|     end | ||||
|   end, | ||||
|   __index = function(t, command) | ||||
|   | ||||
| @@ -307,7 +307,7 @@ end: | ||||
| /// | ||||
| /// On execution error: fails with VimL error, updates v:errmsg. | ||||
| /// | ||||
| /// @see |nvim_exec()| | ||||
| /// @see |nvim_exec2()| | ||||
| /// @see |nvim_command()| | ||||
| /// | ||||
| /// @param cmd       Command to execute. Must be a Dictionary that can contain the same values as | ||||
|   | ||||
| @@ -27,13 +27,26 @@ | ||||
| # include "api/deprecated.c.generated.h" | ||||
| #endif | ||||
|  | ||||
| /// @deprecated Use nvim_exec2() instead. | ||||
| /// @see nvim_exec2 | ||||
| String nvim_exec(uint64_t channel_id, String src, Boolean output, Error *err) | ||||
|   FUNC_API_SINCE(7) | ||||
|   FUNC_API_DEPRECATED_SINCE(11) | ||||
| { | ||||
|   Dict(exec_opts) opts = { 0 }; | ||||
|   opts.output = BOOLEAN_OBJ(output); | ||||
|   return exec_impl(channel_id, src, &opts, err); | ||||
| } | ||||
|  | ||||
| /// @deprecated | ||||
| /// @see nvim_exec | ||||
| /// @see nvim_exec2 | ||||
| String nvim_command_output(uint64_t channel_id, String command, Error *err) | ||||
|   FUNC_API_SINCE(1) | ||||
|   FUNC_API_DEPRECATED_SINCE(7) | ||||
| { | ||||
|   return nvim_exec(channel_id, command, true, err); | ||||
|   Dict(exec_opts) opts = { 0 }; | ||||
|   opts.output = BOOLEAN_OBJ(true); | ||||
|   return exec_impl(channel_id, command, &opts, err); | ||||
| } | ||||
|  | ||||
| /// @deprecated Use nvim_exec_lua() instead. | ||||
|   | ||||
| @@ -232,4 +232,7 @@ return { | ||||
|   { 'echo_opts', { | ||||
|     "verbose"; | ||||
|   }}; | ||||
|   { 'exec_opts', { | ||||
|     "output"; | ||||
|   }}; | ||||
| } | ||||
|   | ||||
| @@ -45,13 +45,33 @@ | ||||
| /// @see |nvim_cmd()| | ||||
| /// | ||||
| /// @param src      Vimscript code | ||||
| /// @param output   Capture and return all (non-error, non-shell |:!|) output | ||||
| /// @param opts  Optional parameters. | ||||
| ///           - output: (boolean, default false) Whether to capture and return | ||||
| ///                     all (non-error, non-shell |:!|) output. | ||||
| /// @param[out] err Error details (Vim error), if any | ||||
| /// @return Output (non-error, non-shell |:!|) if `output` is true, | ||||
| ///         else empty string. | ||||
| String nvim_exec(uint64_t channel_id, String src, Boolean output, Error *err) | ||||
|   FUNC_API_SINCE(7) | ||||
| /// @return Dictionary containing information about execution, with these keys: | ||||
| ///       - output: (string|nil) Output if `opts.output` is true. | ||||
| Dictionary nvim_exec2(uint64_t channel_id, String src, Dict(exec_opts) *opts, Error *err) | ||||
|   FUNC_API_SINCE(11) | ||||
| { | ||||
|   Dictionary result = ARRAY_DICT_INIT; | ||||
|  | ||||
|   String output = exec_impl(channel_id, src, opts, err); | ||||
|   if (ERROR_SET(err)) { | ||||
|     return result; | ||||
|   } | ||||
|  | ||||
|   if (HAS_KEY(opts->output) && api_object_to_bool(opts->output, "opts.output", false, err)) { | ||||
|     PUT(result, "output", STRING_OBJ(output)); | ||||
|   } | ||||
|  | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| String exec_impl(uint64_t channel_id, String src, Dict(exec_opts) *opts, Error *err) | ||||
| { | ||||
|   Boolean output = api_object_to_bool(opts->output, "opts.output", false, err); | ||||
|  | ||||
|   const int save_msg_silent = msg_silent; | ||||
|   garray_T *const save_capture_ga = capture_ga; | ||||
|   const int save_msg_col = msg_col; | ||||
| @@ -69,7 +89,7 @@ String nvim_exec(uint64_t channel_id, String src, Boolean output, Error *err) | ||||
|  | ||||
|   const sctx_T save_current_sctx = api_set_sctx(channel_id); | ||||
|  | ||||
|   do_source_str(src.data, "nvim_exec()"); | ||||
|   do_source_str(src.data, "nvim_exec2()"); | ||||
|   if (output) { | ||||
|     capture_ga = save_capture_ga; | ||||
|     msg_silent = save_msg_silent; | ||||
| @@ -108,8 +128,8 @@ theend: | ||||
| /// | ||||
| /// On execution error: fails with VimL error, updates v:errmsg. | ||||
| /// | ||||
| /// Prefer using |nvim_cmd()| or |nvim_exec()| over this. To evaluate multiple lines of Vim script | ||||
| /// or an Ex command directly, use |nvim_exec()|. To construct an Ex command using a structured | ||||
| /// Prefer using |nvim_cmd()| or |nvim_exec2()| over this. To evaluate multiple lines of Vim script | ||||
| /// or an Ex command directly, use |nvim_exec2()|. To construct an Ex command using a structured | ||||
| /// format and then execute it, use |nvim_cmd()|. To modify an Ex command before evaluating it, use | ||||
| /// |nvim_parse_cmd()| in conjunction with |nvim_cmd()|. | ||||
| /// | ||||
|   | ||||
| @@ -10,6 +10,7 @@ | ||||
| #include <string.h> | ||||
|  | ||||
| #include "nvim/api/private/converter.h" | ||||
| #include "nvim/api/private/defs.h" | ||||
| #include "nvim/api/private/helpers.h" | ||||
| #include "nvim/api/vimscript.h" | ||||
| #include "nvim/context.h" | ||||
| @@ -271,8 +272,10 @@ static inline void ctx_save_funcs(Context *ctx, bool scriptonly) | ||||
|       size_t cmd_len = sizeof("func! ") + strlen(name); | ||||
|       char *cmd = xmalloc(cmd_len); | ||||
|       snprintf(cmd, cmd_len, "func! %s", name); | ||||
|       String func_body = nvim_exec(VIML_INTERNAL_CALL, cstr_as_string(cmd), | ||||
|                                    true, &err); | ||||
|       Dict(exec_opts) opts = { 0 }; | ||||
|       opts.output = BOOLEAN_OBJ(true); | ||||
|       String func_body = exec_impl(VIML_INTERNAL_CALL, cstr_as_string(cmd), | ||||
|                                    &opts, &err); | ||||
|       xfree(cmd); | ||||
|       if (!ERROR_SET(&err)) { | ||||
|         ADD(ctx->funcs, STRING_OBJ(func_body)); | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| local M = {} | ||||
|  | ||||
| function M.redir_exec() | ||||
|   error('redir_exec is deprecated, use nvim_exec() or pcall_err()') | ||||
|   error('redir_exec is deprecated, use nvim_exec2() or pcall_err()') | ||||
| end | ||||
|  | ||||
| return M | ||||
|   | ||||
| @@ -1413,12 +1413,12 @@ describe('API/extmarks', function() | ||||
|   end) | ||||
|  | ||||
|   it('does not crash with append/delete/undo sequence', function() | ||||
|     meths.exec([[ | ||||
|     meths.exec2([[ | ||||
|       let ns = nvim_create_namespace('myplugin') | ||||
|       call nvim_buf_set_extmark(0, ns, 0, 0, {}) | ||||
|       call append(0, '') | ||||
|       %delete | ||||
|       undo]],false) | ||||
|       undo]], { output = false }) | ||||
|     assert_alive() | ||||
|   end) | ||||
|  | ||||
| @@ -1450,7 +1450,7 @@ describe('API/extmarks', function() | ||||
|  | ||||
|     feed('u') | ||||
|     -- handles pasting | ||||
|     meths.exec([[let @a='asdfasdf']], false) | ||||
|     meths.exec2([[let @a='asdfasdf']], { output = false }) | ||||
|     feed([["ap]]) | ||||
|     eq({ {1, 0, 0}, {2, 0, 8} }, | ||||
|         meths.buf_get_extmarks(0, ns, 0, -1, {})) | ||||
|   | ||||
| @@ -681,13 +681,13 @@ describe('nvim_set_keymap, nvim_del_keymap', function() | ||||
|   end) | ||||
|  | ||||
|   it('can set <expr> mappings whose RHS change dynamically', function() | ||||
|     meths.exec([[ | ||||
|     meths.exec2([[ | ||||
|         function! FlipFlop() abort | ||||
|           if !exists('g:flip') | let g:flip = 0 | endif | ||||
|           let g:flip = !g:flip | ||||
|           return g:flip | ||||
|         endfunction | ||||
|         ]], true) | ||||
|         ]], { output = false }) | ||||
|     eq(1, meths.call_function('FlipFlop', {})) | ||||
|     eq(0, meths.call_function('FlipFlop', {})) | ||||
|     eq(1, meths.call_function('FlipFlop', {})) | ||||
| @@ -827,8 +827,12 @@ describe('nvim_set_keymap, nvim_del_keymap', function() | ||||
|     exec_lua [[ | ||||
|       vim.api.nvim_set_keymap ('n', 'asdf', '', {callback = function() print('jkl;') end }) | ||||
|     ]] | ||||
|     assert.truthy(string.match(exec_lua[[return vim.api.nvim_exec(':nmap asdf', true)]], | ||||
|                   "^\nn  asdf          <Lua %d+>")) | ||||
|     assert.truthy( | ||||
|       string.match( | ||||
|         exec_lua[[return vim.api.nvim_exec2(':nmap asdf', { output = true }).output]], | ||||
|         "^\nn  asdf          <Lua %d+>" | ||||
|       ) | ||||
|     ) | ||||
|   end) | ||||
|  | ||||
|   it ('mapcheck() returns lua mapping correctly', function() | ||||
|   | ||||
| @@ -89,132 +89,145 @@ describe('API', function() | ||||
|     eq({mode='i', blocking=false}, nvim("get_mode")) | ||||
|   end) | ||||
|  | ||||
|   describe('nvim_exec', function() | ||||
|   describe('nvim_exec2', function() | ||||
|     it('always returns table', function() | ||||
|       -- In built version this results into `vim.empty_dict()` | ||||
|       eq({}, nvim('exec2', 'echo "Hello"', {})) | ||||
|       eq({}, nvim('exec2', 'echo "Hello"', { output = false })) | ||||
|       eq({ output = 'Hello' }, nvim('exec2', 'echo "Hello"', { output = true })) | ||||
|     end) | ||||
|  | ||||
|     it('default options', function() | ||||
|       -- Should be equivalent to { output = false } | ||||
|       nvim('exec2', "let x0 = 'a'", {}) | ||||
|       eq('a', nvim('get_var', 'x0')) | ||||
|     end) | ||||
|  | ||||
|     it('one-line input', function() | ||||
|       nvim('exec', "let x1 = 'a'", false) | ||||
|       nvim('exec2', "let x1 = 'a'", { output = false }) | ||||
|       eq('a', nvim('get_var', 'x1')) | ||||
|     end) | ||||
|  | ||||
|     it(':verbose set {option}?', function() | ||||
|       nvim('exec', 'set nowrap', false) | ||||
|       eq('nowrap\n\tLast set from anonymous :source', | ||||
|         nvim('exec', 'verbose set wrap?', true)) | ||||
|       nvim('exec2', 'set nowrap', { output = false }) | ||||
|       eq({ output = 'nowrap\n\tLast set from anonymous :source' }, | ||||
|         nvim('exec2', 'verbose set wrap?', { output = true })) | ||||
|  | ||||
|       -- Using script var to force creation of a script item | ||||
|       nvim('exec', [[ | ||||
|       nvim('exec2', [[ | ||||
|         let s:a = 1 | ||||
|         set nowrap | ||||
|       ]], false) | ||||
|       eq('nowrap\n\tLast set from anonymous :source (script id 1)', | ||||
|         nvim('exec', 'verbose set wrap?', true)) | ||||
|       ]], { output = false }) | ||||
|       eq({ output = 'nowrap\n\tLast set from anonymous :source (script id 1)' }, | ||||
|         nvim('exec2', 'verbose set wrap?', { output = true })) | ||||
|     end) | ||||
|  | ||||
|     it('multiline input', function() | ||||
|       -- Heredoc + empty lines. | ||||
|       nvim('exec', "let x2 = 'a'\n", false) | ||||
|       nvim('exec2', "let x2 = 'a'\n", { output = false }) | ||||
|       eq('a', nvim('get_var', 'x2')) | ||||
|       nvim('exec','lua <<EOF\n\n\n\ny=3\n\n\nEOF', false) | ||||
|       nvim('exec2','lua <<EOF\n\n\n\ny=3\n\n\nEOF', { output = false }) | ||||
|       eq(3, nvim('eval', "luaeval('y')")) | ||||
|  | ||||
|       eq('', nvim('exec', 'lua <<EOF\ny=3\nEOF', false)) | ||||
|       eq({}, nvim('exec2', 'lua <<EOF\ny=3\nEOF', { output = false })) | ||||
|       eq(3, nvim('eval', "luaeval('y')")) | ||||
|  | ||||
|       -- Multiple statements | ||||
|       nvim('exec', 'let x1=1\nlet x2=2\nlet x3=3\n', false) | ||||
|       nvim('exec2', 'let x1=1\nlet x2=2\nlet x3=3\n', { output = false }) | ||||
|       eq(1, nvim('eval', 'x1')) | ||||
|       eq(2, nvim('eval', 'x2')) | ||||
|       eq(3, nvim('eval', 'x3')) | ||||
|  | ||||
|       -- Functions | ||||
|       nvim('exec', 'function Foo()\ncall setline(1,["xxx"])\nendfunction', false) | ||||
|       nvim('exec2', 'function Foo()\ncall setline(1,["xxx"])\nendfunction', { output = false }) | ||||
|       eq('', nvim('get_current_line')) | ||||
|       nvim('exec', 'call Foo()', false) | ||||
|       nvim('exec2', 'call Foo()', { output = false }) | ||||
|       eq('xxx', nvim('get_current_line')) | ||||
|  | ||||
|       -- Autocmds | ||||
|       nvim('exec','autocmd BufAdd * :let x1 = "Hello"', false) | ||||
|       nvim('exec2','autocmd BufAdd * :let x1 = "Hello"', { output = false }) | ||||
|       nvim('command', 'new foo') | ||||
|       eq('Hello', request('nvim_eval', 'g:x1')) | ||||
|  | ||||
|       -- Line continuations | ||||
|       nvim('exec', [[ | ||||
|       nvim('exec2', [[ | ||||
|         let abc = #{ | ||||
|           \ a: 1, | ||||
|          "\ b: 2, | ||||
|           \ c: 3 | ||||
|           \ }]], false) | ||||
|           \ }]], { output = false }) | ||||
|       eq({a = 1, c = 3}, request('nvim_eval', 'g:abc')) | ||||
|  | ||||
|       -- try no spaces before continuations to catch off-by-one error | ||||
|       nvim('exec', 'let ab = #{\n\\a: 98,\n"\\ b: 2\n\\}', false) | ||||
|       nvim('exec2', 'let ab = #{\n\\a: 98,\n"\\ b: 2\n\\}', { output = false }) | ||||
|       eq({a = 98}, request('nvim_eval', 'g:ab')) | ||||
|  | ||||
|       -- Script scope (s:) | ||||
|       eq('ahoy! script-scoped varrrrr', nvim('exec', [[ | ||||
|       eq({ output = 'ahoy! script-scoped varrrrr' }, nvim('exec2', [[ | ||||
|           let s:pirate = 'script-scoped varrrrr' | ||||
|           function! s:avast_ye_hades(s) abort | ||||
|             return a:s .. ' ' .. s:pirate | ||||
|           endfunction | ||||
|           echo <sid>avast_ye_hades('ahoy!') | ||||
|         ]], true)) | ||||
|         ]], { output = true })) | ||||
|  | ||||
|       eq('ahoy! script-scoped varrrrr', nvim('exec', [[ | ||||
|       eq({ output = "{'output': 'ahoy! script-scoped varrrrr'}" }, nvim('exec2', [[ | ||||
|           let s:pirate = 'script-scoped varrrrr' | ||||
|           function! Avast_ye_hades(s) abort | ||||
|             return a:s .. ' ' .. s:pirate | ||||
|           endfunction | ||||
|           echo nvim_exec('echo Avast_ye_hades(''ahoy!'')', 1) | ||||
|         ]], true)) | ||||
|           echo nvim_exec2('echo Avast_ye_hades(''ahoy!'')', {'output': v:true}) | ||||
|         ]], { output = true })) | ||||
|  | ||||
|       matches('Vim%(echo%):E121: Undefined variable: s:pirate$', | ||||
|         pcall_err(request, 'nvim_exec', [[ | ||||
|         pcall_err(request, 'nvim_exec2', [[ | ||||
|           let s:pirate = 'script-scoped varrrrr' | ||||
|           call nvim_exec('echo s:pirate', 1) | ||||
|         ]], false)) | ||||
|           call nvim_exec2('echo s:pirate', {'output': v:true}) | ||||
|         ]], { output = false })) | ||||
|  | ||||
|       -- Script items are created only on script var access | ||||
|       eq('1\n0', nvim('exec', [[ | ||||
|       eq({ output = '1\n0' }, nvim('exec2', [[ | ||||
|           echo expand("<SID>")->empty() | ||||
|           let s:a = 123 | ||||
|           echo expand("<SID>")->empty() | ||||
|         ]], true)) | ||||
|         ]], { output = true })) | ||||
|  | ||||
|       eq('1\n0', nvim('exec', [[ | ||||
|       eq({ output = '1\n0' }, nvim('exec2', [[ | ||||
|           echo expand("<SID>")->empty() | ||||
|           function s:a() abort | ||||
|           endfunction | ||||
|           echo expand("<SID>")->empty() | ||||
|         ]], true)) | ||||
|         ]], { output = true })) | ||||
|     end) | ||||
|  | ||||
|     it('non-ASCII input', function() | ||||
|       nvim('exec', [=[ | ||||
|       nvim('exec2', [=[ | ||||
|         new | ||||
|         exe "normal! i ax \n Ax " | ||||
|         :%s/ax/--a1234--/g | :%s/Ax/--A1234--/g | ||||
|       ]=], false) | ||||
|       ]=], { output = false }) | ||||
|       nvim('command', '1') | ||||
|       eq(' --a1234-- ', nvim('get_current_line')) | ||||
|       nvim('command', '2') | ||||
|       eq(' --A1234-- ', nvim('get_current_line')) | ||||
|  | ||||
|       nvim('exec', [[ | ||||
|       nvim('exec2', [[ | ||||
|         new | ||||
|         call setline(1,['xxx']) | ||||
|         call feedkeys('r') | ||||
|         call feedkeys('ñ', 'xt') | ||||
|       ]], false) | ||||
|       ]], { output = false }) | ||||
|       eq('ñxx', nvim('get_current_line')) | ||||
|     end) | ||||
|  | ||||
|     it('execution error', function() | ||||
|       eq('nvim_exec(): Vim:E492: Not an editor command: bogus_command', | ||||
|         pcall_err(request, 'nvim_exec', 'bogus_command', false)) | ||||
|       eq('nvim_exec2(): Vim:E492: Not an editor command: bogus_command', | ||||
|         pcall_err(request, 'nvim_exec2', 'bogus_command', {})) | ||||
|       eq('', nvim('eval', 'v:errmsg'))  -- v:errmsg was not updated. | ||||
|       eq('', eval('v:exception')) | ||||
|  | ||||
|       eq('nvim_exec(): Vim(buffer):E86: Buffer 23487 does not exist', | ||||
|         pcall_err(request, 'nvim_exec', 'buffer 23487', false)) | ||||
|       eq('nvim_exec2(): Vim(buffer):E86: Buffer 23487 does not exist', | ||||
|         pcall_err(request, 'nvim_exec2', 'buffer 23487', {})) | ||||
|       eq('', eval('v:errmsg'))  -- v:errmsg was not updated. | ||||
|       eq('', eval('v:exception')) | ||||
|     end) | ||||
| @@ -222,17 +235,17 @@ describe('API', function() | ||||
|     it('recursion', function() | ||||
|       local fname = tmpname() | ||||
|       write_file(fname, 'let x1 = "set from :source file"\n') | ||||
|       -- nvim_exec | ||||
|       -- nvim_exec2 | ||||
|       --   :source | ||||
|       --     nvim_exec | ||||
|       request('nvim_exec', [[ | ||||
|       --     nvim_exec2 | ||||
|       request('nvim_exec2', [[ | ||||
|         let x2 = substitute('foo','o','X','g') | ||||
|         let x4 = 'should be overwritten' | ||||
|         call nvim_exec("source ]]..fname..[[\nlet x3 = substitute('foo','foo','set by recursive nvim_exec','g')\nlet x5='overwritten'\nlet x4=x5\n", v:false) | ||||
|       ]], false) | ||||
|         call nvim_exec2("source ]]..fname..[[\nlet x3 = substitute('foo','foo','set by recursive nvim_exec2','g')\nlet x5='overwritten'\nlet x4=x5\n", {'output': v:false}) | ||||
|       ]], { output = false }) | ||||
|       eq('set from :source file', request('nvim_get_var', 'x1')) | ||||
|       eq('fXX', request('nvim_get_var', 'x2')) | ||||
|       eq('set by recursive nvim_exec', request('nvim_get_var', 'x3')) | ||||
|       eq('set by recursive nvim_exec2', request('nvim_get_var', 'x3')) | ||||
|       eq('overwritten', request('nvim_get_var', 'x4')) | ||||
|       eq('overwritten', request('nvim_get_var', 'x5')) | ||||
|       os.remove(fname) | ||||
| @@ -242,35 +255,35 @@ describe('API', function() | ||||
|       local fname = tmpname() | ||||
|       write_file(fname, 'echo "hello"\n') | ||||
|       local sourcing_fname = tmpname() | ||||
|       write_file(sourcing_fname, 'call nvim_exec("source '..fname..'", v:false)\n') | ||||
|       meths.exec('set verbose=2', false) | ||||
|       write_file(sourcing_fname, 'call nvim_exec2("source '..fname..'", {"output": v:false})\n') | ||||
|       meths.exec2('set verbose=2', { output = false }) | ||||
|       local traceback_output = 'line 0: sourcing "'..sourcing_fname..'"\n'.. | ||||
|         'line 0: sourcing "'..fname..'"\n'.. | ||||
|         'hello\n'.. | ||||
|         'finished sourcing '..fname..'\n'.. | ||||
|         'continuing in nvim_exec() called at '..sourcing_fname..':1\n'.. | ||||
|         'continuing in nvim_exec2() called at '..sourcing_fname..':1\n'.. | ||||
|         'finished sourcing '..sourcing_fname..'\n'.. | ||||
|         'continuing in nvim_exec() called at nvim_exec():0' | ||||
|       eq(traceback_output, | ||||
|         meths.exec('call nvim_exec("source '..sourcing_fname..'", v:false)', true)) | ||||
|         'continuing in nvim_exec2() called at nvim_exec2():0' | ||||
|       eq({ output = traceback_output }, | ||||
|         meths.exec2('call nvim_exec2("source '..sourcing_fname..'", {"output": v:false})', { output = true })) | ||||
|       os.remove(fname) | ||||
|       os.remove(sourcing_fname) | ||||
|     end) | ||||
|  | ||||
|     it('returns output', function() | ||||
|       eq('this is spinal tap', | ||||
|          nvim('exec', 'lua <<EOF\n\n\nprint("this is spinal tap")\n\n\nEOF', true)) | ||||
|       eq('', nvim('exec', 'echo', true)) | ||||
|       eq('foo 42', nvim('exec', 'echo "foo" 42', true)) | ||||
|       eq({ output = 'this is spinal tap' }, | ||||
|          nvim('exec2', 'lua <<EOF\n\n\nprint("this is spinal tap")\n\n\nEOF', { output = true })) | ||||
|       eq({ output = '' }, nvim('exec2', 'echo', { output = true })) | ||||
|       eq({ output = 'foo 42' }, nvim('exec2', 'echo "foo" 42', { output = true })) | ||||
|     end) | ||||
|  | ||||
|     it('displays messages when output=false', function() | ||||
|     it('displays messages when opts.output=false', function() | ||||
|       local screen = Screen.new(40, 8) | ||||
|       screen:attach() | ||||
|       screen:set_default_attr_ids({ | ||||
|         [0] = {bold=true, foreground=Screen.colors.Blue}, | ||||
|       }) | ||||
|       meths.exec("echo 'hello'", false) | ||||
|       meths.exec2("echo 'hello'", { output = false }) | ||||
|       screen:expect{grid=[[ | ||||
|         ^                                        | | ||||
|         {0:~                                       }| | ||||
| @@ -289,7 +302,7 @@ describe('API', function() | ||||
|       screen:set_default_attr_ids({ | ||||
|         [0] = {bold=true, foreground=Screen.colors.Blue}, | ||||
|       }) | ||||
|       meths.exec("echo 'hello'", true) | ||||
|       meths.exec2("echo 'hello'", { output = true }) | ||||
|       screen:expect{grid=[[ | ||||
|         ^                                        | | ||||
|         {0:~                                       }| | ||||
| @@ -300,7 +313,7 @@ describe('API', function() | ||||
|       ]]} | ||||
|       exec([[ | ||||
|         func Print() | ||||
|           call nvim_exec('echo "hello"', v:true) | ||||
|           call nvim_exec2('echo "hello"', { 'output': v:true }) | ||||
|         endfunc | ||||
|       ]]) | ||||
|       feed([[:echon 1 | call Print() | echon 5<CR>]]) | ||||
| @@ -575,7 +588,7 @@ describe('API', function() | ||||
|  | ||||
|     it('sets previous directory', function() | ||||
|       meths.set_current_dir("Xtestdir") | ||||
|       meths.exec('cd -', false) | ||||
|       meths.exec2('cd -', { output = false }) | ||||
|       eq(funcs.getcwd(), start_dir) | ||||
|     end) | ||||
|   end) | ||||
| @@ -2674,7 +2687,7 @@ describe('API', function() | ||||
|       eq('  1 %a   "[No Name]"                    line 1\n'.. | ||||
|          '  3  h   "[Scratch]"                    line 0\n'.. | ||||
|          '  4  h   "[Scratch]"                    line 0', | ||||
|          meths.exec('ls', true)) | ||||
|          meths.exec2('ls', { output = true }).output) | ||||
|       -- current buffer didn't change | ||||
|       eq({id=1}, meths.get_current_buf()) | ||||
|  | ||||
| @@ -2788,7 +2801,7 @@ describe('API', function() | ||||
|     end) | ||||
|  | ||||
|     it('should not crash when echoed', function() | ||||
|       meths.exec("echo nvim_get_all_options_info()", true) | ||||
|       meths.exec2("echo nvim_get_all_options_info()", { output = true }) | ||||
|     end) | ||||
|   end) | ||||
|  | ||||
| @@ -2941,13 +2954,13 @@ describe('API', function() | ||||
|     it('can save message history', function() | ||||
|       nvim('command', 'set cmdheight=2') -- suppress Press ENTER | ||||
|       nvim("echo", {{"msg\nmsg"}, {"msg"}}, true, {}) | ||||
|       eq("msg\nmsgmsg", meths.exec('messages', true)) | ||||
|       eq("msg\nmsgmsg", meths.exec2('messages', { output = true }).output) | ||||
|     end) | ||||
|  | ||||
|     it('can disable saving message history', function() | ||||
|       nvim('command', 'set cmdheight=2') -- suppress Press ENTER | ||||
|       nvim_async("echo", {{"msg\nmsg"}, {"msg"}}, false, {}) | ||||
|       eq("", meths.exec("messages", true)) | ||||
|       eq("", meths.exec2("messages", { output = true }).output) | ||||
|     end) | ||||
|   end) | ||||
|  | ||||
| @@ -3936,7 +3949,7 @@ describe('API', function() | ||||
|  | ||||
|     it('sets correct script context', function() | ||||
|       meths.cmd({ cmd = "set", args = { "cursorline" } }, {}) | ||||
|       local str = meths.exec([[verbose set cursorline?]], true) | ||||
|       local str = meths.exec2([[verbose set cursorline?]], { output = true }).output | ||||
|       neq(nil, str:find("cursorline\n\tLast set from API client %(channel id %d+%)")) | ||||
|     end) | ||||
|  | ||||
| @@ -3986,7 +3999,7 @@ describe('API', function() | ||||
|         line6 | ||||
|       ]] | ||||
|       meths.cmd({ cmd = "del", range = { 2, 4 }, reg = 'a' }, {}) | ||||
|       meths.exec("1put a", false) | ||||
|       meths.exec2("1put a", { output = false }) | ||||
|       expect [[ | ||||
|         line1 | ||||
|         line2 | ||||
| @@ -4051,11 +4064,11 @@ describe('API', function() | ||||
|                    { output = true })) | ||||
|     end) | ||||
|     it('splits arguments correctly', function() | ||||
|       meths.exec([[ | ||||
|       meths.exec2([[ | ||||
|         function! FooFunc(...) | ||||
|           echo a:000 | ||||
|         endfunction | ||||
|       ]], false) | ||||
|       ]], { output = false }) | ||||
|       meths.create_user_command("Foo", "call FooFunc(<f-args>)", { nargs = '+' }) | ||||
|       eq([=[['a quick', 'brown fox', 'jumps over the', 'lazy dog']]=], | ||||
|          meths.cmd({ cmd = "Foo", args = { "a quick", "brown fox", "jumps over the", "lazy dog"}}, | ||||
|   | ||||
| @@ -6,7 +6,7 @@ local meths = helpers.meths | ||||
| local funcs = helpers.funcs | ||||
|  | ||||
| local exec = function(str) | ||||
|   meths.exec(str, false) | ||||
|   meths.exec2(str, { output = false }) | ||||
| end | ||||
|  | ||||
| describe('oldtests', function() | ||||
|   | ||||
| @@ -93,14 +93,14 @@ describe(':cquit', function() | ||||
|   end) | ||||
|  | ||||
|   it('exits with redir msg for multiple exit codes after :cquit 1 2', function() | ||||
|     test_cq('cquit 1 2', nil, 'nvim_exec(): Vim(cquit):E488: Trailing characters: 2: cquit 1 2') | ||||
|     test_cq('cquit 1 2', nil, 'nvim_exec2(): Vim(cquit):E488: Trailing characters: 2: cquit 1 2') | ||||
|   end) | ||||
|  | ||||
|   it('exits with redir msg for non-number exit code after :cquit X', function() | ||||
|     test_cq('cquit X', nil, 'nvim_exec(): Vim(cquit):E488: Trailing characters: X: cquit X') | ||||
|     test_cq('cquit X', nil, 'nvim_exec2(): Vim(cquit):E488: Trailing characters: X: cquit X') | ||||
|   end) | ||||
|  | ||||
|   it('exits with redir msg for negative exit code after :cquit -1', function() | ||||
|     test_cq('cquit -1', nil, 'nvim_exec(): Vim(cquit):E488: Trailing characters: -1: cquit -1') | ||||
|     test_cq('cquit -1', nil, 'nvim_exec2(): Vim(cquit):E488: Trailing characters: -1: cquit -1') | ||||
|   end) | ||||
| end) | ||||
|   | ||||
| @@ -101,7 +101,7 @@ describe('Remote', function() | ||||
|     expect(contents) | ||||
|     eq(1, #funcs.getbufinfo()) | ||||
|     -- Since we didn't pass silent, we should get a complaint | ||||
|     neq(nil, string.find(meths.exec('messages', true), 'E247')) | ||||
|     neq(nil, string.find(meths.exec2('messages', { output = true }).output, 'E247')) | ||||
|   end) | ||||
|  | ||||
|   it('creates server if not found with tabs', function() | ||||
| @@ -110,7 +110,7 @@ describe('Remote', function() | ||||
|     eq(2, #funcs.gettabinfo()) | ||||
|     eq(2, #funcs.getbufinfo()) | ||||
|     -- We passed silent, so no message should be issued about the server not being found | ||||
|     eq(nil, string.find(meths.exec('messages', true), 'E247')) | ||||
|     eq(nil, string.find(meths.exec2('messages', { output = true }).output, 'E247')) | ||||
|   end) | ||||
|  | ||||
|   pending('exits with error on', function() | ||||
|   | ||||
| @@ -58,7 +58,7 @@ describe('startup', function() | ||||
|       ^                                                            | | ||||
|                                                                   | | ||||
|       Entering Debug mode.  Type "cont" to continue.              | | ||||
|       nvim_exec()                                                 | | ||||
|       nvim_exec2()                                                | | ||||
|       cmd: aunmenu *                                              | | ||||
|       >                                                           | | ||||
|                                                                   | | ||||
| @@ -691,7 +691,6 @@ describe('sysinit', function() | ||||
|     eq('loaded 1 xdg 0 vim 1', | ||||
|        eval('printf("loaded %d xdg %d vim %d", g:loaded, get(g:, "xdg", 0), get(g:, "vim", 0))')) | ||||
|   end) | ||||
|  | ||||
| end) | ||||
|  | ||||
| describe('user config init', function() | ||||
| @@ -824,7 +823,7 @@ describe('user config init', function() | ||||
|       clear{ args_rm={'-u'}, env=xenv } | ||||
|       feed('<cr><c-c>')  -- Dismiss "Conflicting config …" message. | ||||
|       eq(1, eval('g:lua_rc')) | ||||
|       matches('^E5422: Conflicting configs', meths.exec('messages', true)) | ||||
|       matches('^E5422: Conflicting configs', meths.exec2('messages', { output = true }).output) | ||||
|     end) | ||||
|   end) | ||||
| end) | ||||
| @@ -873,7 +872,7 @@ describe('runtime:', function() | ||||
|  | ||||
|     eq(2, eval('g:lua_plugin')) | ||||
|     -- Check if plugin_file_path is listed in :scriptname | ||||
|     local scripts = meths.exec(':scriptnames', true) | ||||
|     local scripts = meths.exec2(':scriptnames', { output = true }).output | ||||
|     assert(scripts:find(plugin_file_path)) | ||||
|  | ||||
|     -- Check if plugin_file_path is listed in startup profile | ||||
|   | ||||
| @@ -40,59 +40,59 @@ describe('named marks', function() | ||||
|   it("errors when set out of range with :mark", function() | ||||
|     command("edit " .. file1) | ||||
|     local err = pcall_err(helpers.exec_capture, "1000mark x") | ||||
|     eq("nvim_exec(): Vim(mark):E16: Invalid range: 1000mark x", err) | ||||
|     eq("nvim_exec2(): Vim(mark):E16: Invalid range: 1000mark x", err) | ||||
|   end) | ||||
|  | ||||
|   it("errors when set out of range with :k", function() | ||||
|     command("edit " .. file1) | ||||
|     local err = pcall_err(helpers.exec_capture, "1000kx") | ||||
|     eq("nvim_exec(): Vim(k):E16: Invalid range: 1000kx", err) | ||||
|     eq("nvim_exec2(): Vim(k):E16: Invalid range: 1000kx", err) | ||||
|   end) | ||||
|  | ||||
|   it("errors on unknown mark name with :mark", function() | ||||
|     command("edit " .. file1) | ||||
|     local err = pcall_err(helpers.exec_capture, "mark #") | ||||
|     eq("nvim_exec(): Vim(mark):E191: Argument must be a letter or forward/backward quote", err) | ||||
|     eq("nvim_exec2(): Vim(mark):E191: Argument must be a letter or forward/backward quote", err) | ||||
|   end) | ||||
|  | ||||
|   it("errors on unknown mark name with '", function() | ||||
|     command("edit " .. file1) | ||||
|     local err = pcall_err(helpers.exec_capture, "normal! '#") | ||||
|     eq("nvim_exec(): Vim(normal):E78: Unknown mark", err) | ||||
|     eq("nvim_exec2(): Vim(normal):E78: Unknown mark", err) | ||||
|   end) | ||||
|  | ||||
|   it("errors on unknown mark name with `", function() | ||||
|     command("edit " .. file1) | ||||
|     local err = pcall_err(helpers.exec_capture, "normal! `#") | ||||
|     eq("nvim_exec(): Vim(normal):E78: Unknown mark", err) | ||||
|     eq("nvim_exec2(): Vim(normal):E78: Unknown mark", err) | ||||
|   end) | ||||
|  | ||||
|   it("errors when moving to a mark that is not set with '", function() | ||||
|     command("edit " .. file1) | ||||
|     local err = pcall_err(helpers.exec_capture, "normal! 'z") | ||||
|     eq("nvim_exec(): Vim(normal):E20: Mark not set", err) | ||||
|     eq("nvim_exec2(): Vim(normal):E20: Mark not set", err) | ||||
|     err = pcall_err(helpers.exec_capture, "normal! '.") | ||||
|     eq("nvim_exec(): Vim(normal):E20: Mark not set", err) | ||||
|     eq("nvim_exec2(): Vim(normal):E20: Mark not set", err) | ||||
|   end) | ||||
|  | ||||
|   it("errors when moving to a mark that is not set with `", function() | ||||
|     command("edit " .. file1) | ||||
|     local err = pcall_err(helpers.exec_capture, "normal! `z") | ||||
|     eq("nvim_exec(): Vim(normal):E20: Mark not set", err) | ||||
|     eq("nvim_exec2(): Vim(normal):E20: Mark not set", err) | ||||
|     err = pcall_err(helpers.exec_capture, "normal! `>") | ||||
|     eq("nvim_exec(): Vim(normal):E20: Mark not set", err) | ||||
|     eq("nvim_exec2(): Vim(normal):E20: Mark not set", err) | ||||
|   end) | ||||
|  | ||||
|   it("errors when moving to a global mark that is not set with '", function() | ||||
|     command("edit " .. file1) | ||||
|     local err = pcall_err(helpers.exec_capture, "normal! 'Z") | ||||
|     eq("nvim_exec(): Vim(normal):E20: Mark not set", err) | ||||
|     eq("nvim_exec2(): Vim(normal):E20: Mark not set", err) | ||||
|   end) | ||||
|  | ||||
|   it("errors when moving to a global mark that is not set with `", function() | ||||
|     command("edit " .. file1) | ||||
|     local err = pcall_err(helpers.exec_capture, "normal! `Z") | ||||
|     eq("nvim_exec(): Vim(normal):E20: Mark not set", err) | ||||
|     eq("nvim_exec2(): Vim(normal):E20: Mark not set", err) | ||||
|   end) | ||||
|  | ||||
|   it("can move to them using '", function() | ||||
| @@ -153,7 +153,7 @@ describe('named marks', function() | ||||
|     command("next") | ||||
|     command("bw! " .. file1 ) | ||||
|     local err = pcall_err(helpers.exec_capture, "normal! 'A") | ||||
|     eq("nvim_exec(): Vim(normal):E92: Buffer 1 not found", err) | ||||
|     eq("nvim_exec2(): Vim(normal):E92: Buffer 1 not found", err) | ||||
|     os.remove(file1) | ||||
|   end) | ||||
|  | ||||
|   | ||||
| @@ -34,7 +34,7 @@ describe('script_get-based command', function() | ||||
|             %s %s | ||||
|           endif | ||||
|         ]])):format(cmd, garbage))) | ||||
|         eq('', meths.exec('messages', true)) | ||||
|         eq('', meths.exec2('messages', { output = true }).output) | ||||
|         if check_neq then | ||||
|           neq(0, exc_exec(dedent([[ | ||||
|             %s %s | ||||
| @@ -49,7 +49,7 @@ describe('script_get-based command', function() | ||||
|           EOF | ||||
|           endif | ||||
|         ]])):format(cmd, garbage))) | ||||
|         eq('', meths.exec('messages', true)) | ||||
|         eq('', meths.exec2('messages', { output = true }).output) | ||||
|         if check_neq then | ||||
|           eq(true, pcall(source, (dedent([[ | ||||
|             let g:exc = 0 | ||||
|   | ||||
| @@ -96,12 +96,12 @@ describe(':source', function() | ||||
|       let d = s:s]]) | ||||
|  | ||||
|     command('source') | ||||
|     eq('2', meths.exec('echo a', true)) | ||||
|     eq("{'k': 'v'}", meths.exec('echo b', true)) | ||||
|     eq('2', meths.exec2('echo a', { output = true }).output) | ||||
|     eq("{'k': 'v'}", meths.exec2('echo b', { output = true }).output) | ||||
|  | ||||
|     -- Script items are created only on script var access | ||||
|     eq("1", meths.exec('echo c', true)) | ||||
|     eq("0zBEEFCAFE", meths.exec('echo d', true)) | ||||
|     eq("1", meths.exec2('echo c', { output = true }).output) | ||||
|     eq("0zBEEFCAFE", meths.exec2('echo d', { output = true }).output) | ||||
|  | ||||
|     exec('set cpoptions+=C') | ||||
|     eq('Vim(let):E723: Missing end of Dictionary \'}\': ', exc_exec('source')) | ||||
| @@ -124,14 +124,14 @@ describe(':source', function() | ||||
|     -- Source the 2nd line only | ||||
|     feed('ggjV') | ||||
|     feed_command(':source') | ||||
|     eq('3', meths.exec('echo a', true)) | ||||
|     eq('3', meths.exec2('echo a', { output = true }).output) | ||||
|  | ||||
|     -- Source from 2nd line to end of file | ||||
|     feed('ggjVG') | ||||
|     feed_command(':source') | ||||
|     eq('4', meths.exec('echo a', true)) | ||||
|     eq("{'K': 'V'}", meths.exec('echo b', true)) | ||||
|     eq("<SNR>1_C()", meths.exec('echo D()', true)) | ||||
|     eq('4', meths.exec2('echo a', { output = true }).output) | ||||
|     eq("{'K': 'V'}", meths.exec2('echo b', { output = true }).output) | ||||
|     eq("<SNR>1_C()", meths.exec2('echo D()', { output = true }).output) | ||||
|  | ||||
|     -- Source last line only | ||||
|     feed_command(':$source') | ||||
| @@ -147,7 +147,7 @@ describe(':source', function() | ||||
|       let a = 123 | ||||
|     ]] | ||||
|     command('source') | ||||
|     eq('123', meths.exec('echo a', true)) | ||||
|     eq('123', meths.exec2('echo a', { output = true }).output) | ||||
|   end) | ||||
|  | ||||
|   it('multiline heredoc command', function() | ||||
| @@ -157,7 +157,7 @@ describe(':source', function() | ||||
|       EOF]]) | ||||
|  | ||||
|     command('source') | ||||
|     eq('4', meths.exec('echo luaeval("y")', true)) | ||||
|     eq('4', meths.exec2('echo luaeval("y")', { output = true }).output) | ||||
|   end) | ||||
|  | ||||
|   it('can source lua files', function() | ||||
|   | ||||
| @@ -24,11 +24,11 @@ vim.opt.number = true | ||||
| vim.api.nvim_set_keymap('n', '<leader>key1', ':echo "test"<cr>', {noremap = true}) | ||||
| vim.keymap.set('n', '<leader>key2', ':echo "test"<cr>') | ||||
|  | ||||
| vim.api.nvim_exec("augroup test_group\ | ||||
| vim.api.nvim_exec2("augroup test_group\ | ||||
|                      autocmd!\ | ||||
|                      autocmd FileType c setl cindent\ | ||||
|                      augroup END\ | ||||
|                   ", false) | ||||
|                   ", { output = false }) | ||||
|  | ||||
| vim.api.nvim_command("command Bdelete :bd") | ||||
| vim.api.nvim_create_user_command("TestCommand", ":echo 'Hello'", {}) | ||||
|   | ||||
| @@ -533,7 +533,7 @@ function module.feed_command(...) | ||||
|   end | ||||
| end | ||||
|  | ||||
| -- @deprecated use nvim_exec() | ||||
| -- @deprecated use nvim_exec2() | ||||
| function module.source(code) | ||||
|   module.exec(dedent(code)) | ||||
| end | ||||
| @@ -826,11 +826,11 @@ function module.skip_fragile(pending_fn, cond) | ||||
| end | ||||
|  | ||||
| function module.exec(code) | ||||
|   return module.meths.exec(code, false) | ||||
|   module.meths.exec2(code, { output = false }) | ||||
| end | ||||
|  | ||||
| function module.exec_capture(code) | ||||
|   return module.meths.exec(code, true) | ||||
|   return module.meths.exec2(code, { output = true }).output | ||||
| end | ||||
|  | ||||
| function module.exec_lua(code, ...) | ||||
|   | ||||
| @@ -145,10 +145,10 @@ describe('assert function:', function() | ||||
|         call assert_true('', 'file two') | ||||
|       ]]) | ||||
|       expected_errors({ | ||||
|         "nvim_exec(): equal assertion failed: Expected 1 but got 100", | ||||
|         "nvim_exec(): true  assertion failed: Expected False but got 'true'", | ||||
|         "nvim_exec(): false assertion failed: Expected True but got 'false'", | ||||
|         "nvim_exec(): file two: Expected True but got ''", | ||||
|         "nvim_exec2(): equal assertion failed: Expected 1 but got 100", | ||||
|         "nvim_exec2(): true  assertion failed: Expected False but got 'true'", | ||||
|         "nvim_exec2(): false assertion failed: Expected True but got 'false'", | ||||
|         "nvim_exec2(): file two: Expected True but got ''", | ||||
|       }) | ||||
|     end) | ||||
|   end) | ||||
|   | ||||
| @@ -30,7 +30,7 @@ describe("'keymap' / :lmap", function() | ||||
|       command('lmapclear <buffer>') | ||||
|       command('set keymap=dvorak') | ||||
|       command('set nomore') | ||||
|       local bindings = funcs.nvim_exec('lmap', true) | ||||
|       local bindings = funcs.nvim_exec2('lmap', { output = true }).output | ||||
|       eq(dedent([[ | ||||
|  | ||||
|       l  "            @_ | ||||
|   | ||||
| @@ -362,7 +362,7 @@ describe('Command-line coloring', function() | ||||
|       {EOB:~                                       }| | ||||
|       :e^                                      | | ||||
|     ]]) | ||||
|     eq('', meths.exec('messages', true)) | ||||
|     eq('', meths.exec2('messages', { output = true }).output) | ||||
|   end) | ||||
|   it('silences :echon', function() | ||||
|     set_color_cb('Echoning') | ||||
| @@ -377,7 +377,7 @@ describe('Command-line coloring', function() | ||||
|       {EOB:~                                       }| | ||||
|       :e^                                      | | ||||
|     ]]) | ||||
|     eq('', meths.exec('messages', true)) | ||||
|     eq('', meths.exec2('messages', { output = true }).output) | ||||
|   end) | ||||
|   it('silences :echomsg', function() | ||||
|     set_color_cb('Echomsging') | ||||
| @@ -392,7 +392,7 @@ describe('Command-line coloring', function() | ||||
|       {EOB:~                                       }| | ||||
|       :e^                                      | | ||||
|     ]]) | ||||
|     eq('', meths.exec('messages', true)) | ||||
|     eq('', meths.exec2('messages', { output = true }).output) | ||||
|   end) | ||||
|   it('does the right thing when throwing', function() | ||||
|     set_color_cb('Throwing') | ||||
| @@ -858,7 +858,7 @@ describe('Ex commands coloring', function() | ||||
|     ]]) | ||||
|     feed('<CR>') | ||||
|     eq('Error detected while processing :\nE605: Exception not caught: 42\nE749: empty buffer', | ||||
|        meths.exec('messages', true)) | ||||
|        meths.exec2('messages', { output = true }).output) | ||||
|   end) | ||||
|   it('errors out when failing to get callback', function() | ||||
|     meths.set_var('Nvim_color_cmdline', 42) | ||||
|   | ||||
| @@ -986,7 +986,7 @@ describe('ui/builtin messages', function() | ||||
|  | ||||
|     -- screen size doesn't affect internal output #10285 | ||||
|     eq('ErrorMsg       xxx ctermfg=15 ctermbg=1 guifg=White guibg=Red', | ||||
|        meths.exec("hi ErrorMsg", true)) | ||||
|        meths.exec2("hi ErrorMsg", { output = true }).output) | ||||
|   end) | ||||
|  | ||||
|   it(':syntax list langGroup output', function() | ||||
| @@ -1025,7 +1025,7 @@ vimComment     xxx match /\s"[^\-:.%#=*].*$/ms=s+1,lc=1  excludenl contains=@vim | ||||
|                    match /\<endif\s\+".*$/ms=s+5,lc=5  contains=@vimCommentGroup,vimCommentString  | ||||
|                    match /\<else\s\+".*$/ms=s+4,lc=4  contains=@vimCommentGroup,vimCommentString  | ||||
|                    links to Comment]], | ||||
|        meths.exec('syntax list vimComment', true)) | ||||
|        meths.exec2('syntax list vimComment', { output = true }).output) | ||||
|     -- luacheck: pop | ||||
|   end) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user