VIM功能参数传递

时间:2013-03-07 01:57:01

标签: vim

我正在尝试创建一个简单的vim脚本函数,但我遇到了麻烦。此函数需要获取两个输入字符串并运行搜索并替换它们的所有实例。我现在有以下内容:

  function! FindAndReplaceAll(from, to)                                           
     echo a:from                                                                   
     :%s/a:from/a:to/gc                                                            
  endfunction   

当我这样做时:

:call FindAndReplaceAll("test", "test2")

echo a:from正常工作但是:%s ...代替了from和to literals。我注意到我的vim语法高亮度甚至没有突出显示那些变量,所以我似乎有一个基本的语法问题。

我的问题是:

  1. 这是什么语法?我很感激为什么而不仅仅是答案的解释。为什么以上不正确?
  2. 无论如何要将其称为

    :调用FindAndReplaceAll(test,test2)

  3. 所以我不必添加引号......

2 个答案:

答案 0 :(得分:14)

您需要更改

:%s/a:from/a:to/gc

为:

exe '%s/' . a:from . '/' . a:to . '/gc'

您的陈述被解释为字面。即它将在当前缓冲区中用字符串“a:to”替换字符串“a:from”。

但您打算将a:from评估的字符串替换为a:to评估的字符串。这可以通过内置的exe[cute]函数来实现(您可以通过在命令行模式下键入::h exe来获得帮助。)

至于你的第二个问题,你必须使用引号,否则它们将被视为变量。

答案 1 :(得分:1)

应该使用`execute'调用命令行,而不是直接文本:

 function! FindAndReplaceAll(from, to)                                           
     echo    a:from                                                                   
     execute "%s/" . a:from . "/" . a:to . "/gc"                                                            
 endfunction