2013-03-07 108 views
6

我正在尝试创建一个简单的vim脚本函数,并且遇到了麻烦。该功能需要输入两个字符串并运行搜索并替换它们的所有实例。我有权利现在以下几点:VIM函数参数传递

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

当我这样做:

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

的一个回声:从工作正常,但:%s的......作用于从,转而文字。我注意到我的vim语法高亮度甚至没有突出显示那些变量,所以我似乎有一个基本的语法问题。

我的问题是:

  1. 什么是正确的语法与此?我希望能够解释为什么而不仅仅是答案。为什么上述不正确?
  2. 不管怎样,允许这被称为

    :调用FindAndReplaceAll(测试,测试2)

所以我没有加引号...

回答

12

您需要更改

:%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

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

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