call
在 vimscript 中,和 和有什么区别execute
?在什么场景/用例中我应该使用一个与另一个?
(免责声明,我知道 vim 中提供了广泛的在线帮助 - 我正在寻求这个特定问题的简明答案)。
从自己写插件和阅读别人代码的经验来看:
:call
用于调用函数,例如:
function! s:foo(id)
execute 'buffer' a:id
endfunction
let target_id = 1
call foo(target_id)
:execute
用于两件事:
构造一个字符串并计算它。这通常用于将参数传递给命令:
execute 'source' fnameescape('l:path')
评估函数的返回值(可以说是相同的):
function! s:bar(id)
return 'buffer ' . a:id
endfunction
let target_id = 1
execute s:bar(target_id)
:call
: 调用函数。:exec
: 将字符串作为 Ex 命令执行。它的含义与eval
(in javascript
, python
, etc)相似例如:
function! Hello()
echo "hello, world"
endfunction
call Hello()
exec "call Hello()"
您可能会看到call
首先评估表达式,然后丢弃结果。所以只有副作用是有用的。
定义:
function! Foo()
echo 'echoed'
return 'returned'
endfunction
称呼:
:call Foo()
输出:
echoed
执行:
:execute Foo()
输出:
echoed
EXXX: Not an editor command: returned
执行:
:silent let foo = Foo()
:echo foo
输出:
returned
例如
:exe "tabn".g:lasttab
其中 g:lasttab 是一个全局变量,用于存储当前选项卡编号,并且该编号与“tabnext”连接以切换到例如选项卡编号 3(例如,如果 g:lasttab 包含“3”)
整个字符串 >"tabn ".g:lasttab< 由 VIM 的 exec 命令评估和执行。
HTH?