31

call在 vimscript 中,和 和有什么区别execute?在什么场景/用例中我应该使用一个与另一个?

(免责声明,我知道 vim 中提供了广泛的在线帮助 - 我正在寻求这个特定问题的简明答案)。

4

4 回答 4

25

从自己写插件和阅读别人代码的经验来看:

:call用于调用函数,例如:

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

let target_id = 1
call foo(target_id)

:execute用于两件事:

  1. 构造一个字符串并计算它。这通常用于将参数传递给命令:

    execute 'source' fnameescape('l:path')
    
  2. 评估函数的返回值(可以说是相同的):

    function! s:bar(id)
        return 'buffer ' . a:id
    endfunction
    
    let target_id = 1
    execute s:bar(target_id)
    
于 2013-08-12T16:39:29.063 回答
24
  • :call: 调用函数。
  • :exec: 将字符串作为 Ex 命令执行。它的含义与eval(in javascript, python, etc)相似

例如:

function! Hello()
   echo "hello, world"
endfunction

call Hello()

exec "call Hello()"
于 2013-08-12T02:40:55.970 回答
3

简短的回答

您可能会看到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
于 2016-12-09T08:26:17.537 回答
0

请参阅切换到 VIM 中的最后一个活动选项卡

例如

:exe "tabn".g:lasttab

其中 g:lasttab 是一个全局变量,用于存储当前选项卡编号,并且该编号与“tabnext”连接以切换到例如选项卡编号 3(例如,如果 g:lasttab 包含“3”)

整个字符串 >"tabn ".g:lasttab< 由 VIM 的 exec 命令评估和执行。

HTH?

于 2013-08-12T09:31:02.640 回答