Reputation: 10311
In vimscript, what is the difference between call
and execute
? In what scenarios / use cases should I use one vs the other?
(Disclaimer, I am aware of the extensive online help available within vim - I am seeking a concise answer to this specific question).
Upvotes: 40
Views: 21281
Reputation: 3371
From the experience of writing my own plugins and reading the code of others:
:call
is for calling functions, e.g.:
function! s:foo(id)
execute 'buffer' a:id
endfunction
let target_id = 1
call foo(target_id)
:execute
is used for two things:
Construct a string and evaluate it. This is often used to pass arguments to commands:
execute 'source' fnameescape('l:path')
Evaluate the return value of a function (arguably the same):
function! s:bar(id)
return 'buffer ' . a:id
endfunction
let target_id = 1
execute s:bar(target_id)
Upvotes: 27
Reputation: 10964
You may see call
as first evaluate the expression and then discard the result. So only the side effects are useful.
Define:
function! Foo()
echo 'echoed'
return 'returned'
endfunction
Call:
:call Foo()
Output:
echoed
Execute:
:execute Foo()
Output:
echoed
EXXX: Not an editor command: returned
Execute:
:silent let foo = Foo()
:echo foo
Output:
returned
Upvotes: 5
Reputation: 1
See Switch to last-active tab in VIM
for example
:exe "tabn ".g:lasttab
Where g:lasttab is a global variable to store the current tab number and that number is concatenated with "tabnext" to switch e.g to tab number 3 (If g:lasttab e.g. contains '3' for example)
That whole string >"tabn ".g:lasttab< is evaluated and executed by VIM's exec command.
HTH?
Upvotes: 0
Reputation: 161914
:call
: Call a function.:exec
: Executes a string as an Ex command.
It has the similar meaning of eval
(in javascript
, python
, etc)For example:
function! Hello()
echo "hello, world"
endfunction
call Hello()
exec "call Hello()"
Upvotes: 31