vimscript call vs. execute

2019-03-23 02:04发布

问题:

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).

回答1:

From the experience of writing my own plugins and reading the code of others:

:call: Used to call functions:

function! s:foo(id)
    execute 'buffer' a:id
endfunction

let target_id = 1
call foo(target_id)

:execute: Used for two things:

1) Construct a string and evaluate it. This is often used to pass arguments to commands:

execute 'source' fnameescape('l:path')

2) 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)


回答2:

  • :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()"


回答3:

Short answer

You may see call as first evaluate the expression and then discard the result. So only the side effects are useful.

Long answer

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


回答4:

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?



标签: vim viml