vimscript调用与执行

时间:2013-08-12 02:25:20

标签: vim viml

在vimscript中,callexecute之间有什么区别?在什么情况下/用例我应该使用哪一个?

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

4 个答案:

答案 0 :(得分:18)

  • :call:调用函数。
  • :exec:执行字符串作为Ex命令。 它具有eval的相似含义(javascriptpython等)

例如:

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

call Hello()

exec "call Hello()"

答案 1 :(得分:16)

从编写我自己的插件和阅读其他人的代码的经验:

:致电:用于调用功能:

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

let target_id = 1
call foo(target_id)

:执行:用于两件事:

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)

答案 2 :(得分:2)

简短回答

您可能会看到{case (a,b,c)=>(c,a)}首先评估表达式,然后丢弃结果。所以只有副作用才有用。

长答案

定义:

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

答案 3 :(得分:0)

请参阅Switch to last-active tab in VIM

例如

:exe“tabn”.g:lasttab

其中 g:lasttab是一个存储当前标签号的全局变量 并且该号码与“tabnext”连接以切换到例如标签号3 (如果g:lasttab例如包含'3')

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

HTH?